A solicitação HTTP POST sobre SSL entre dois sites no mesmo servidor falha se mais de 1kb de dados for enviado

1

NOTA: Embora haja algum código PHP abaixo, eu realmente acredito que isso pertence mais ao ServerFault do que ao StackOverflow, porque isso funcionou e ele parou de funcionar depois que nós mudamos os servidores.

Eu tenho a seguinte situação:

  • Existem 2 sites públicos com diferentes funcionalidades (ATUALIZAÇÃO: ambos os sites estão no mesmo servidor físico). Um usuário pode preencher um formulário de inscrição no site A para se registrar no site B.
  • Quando um usuário se registra no site A, envio uma solicitação do Ajax para um script PHP no site A para validar os dados.
  • Esse script é essencialmente um proxy que envia todos os dados para o site B e B responde com "OK" ou com vários erros de validação. Só existe porque não posso fazer o Ajax de domínio cruzado diretamente.
  • Todos esses são POSTs HTTP sobre SSL

Isso funcionava perfeitamente, até que migramos nosso servidor, na mesma empresa de hospedagem, para um maior. Eles hospedando pessoas cuidaram de toda a migração, e a ideia era que o novo servidor acabaria com a mesma configuração que o antigo.

Agora, após essa migração, quando as informações enviadas ao proxy, convertidas em uma "string HTTP POST", receberem mais de 1024 bytes, a solicitação do servidor do site A para B falhará silenciosamente. Funciona, executa todas as linhas de código, não há erros, avisos ou exceções que eu possa ver. Isso vai até o fim, como se o site B tivesse respondido com uma string vazia.

Se, no entanto, o POST for menor que 1024 bytes, tudo funciona muito bem e eu recebo os erros de validação corretos ou "OK" de volta.

Enviar o POST completo para o site B diretamente, sem o proxy, funciona corretamente, então o problema é definitivamente na chamada do proxy.

Eu não tenho racionalização para esse comportamento, isso não faz sentido para mim.

Algum de vocês já encontrou algo assim antes?
Alguma indicação de onde eu poderia olhar?

Para referência, este é o código proxy:

$CustomersValidateURL = "https://WebsiteB.com/validatescript";
echo do_post_request($CustomersValidateURL, http_build_query($_POST));

// =========================================================================
function do_post_request($url, $data, $optional_headers = null){

    $params = array('http' => array('method' => 'POST', 'content' => $data));

    if ($optional_headers !== null){
        $params['http']['header'] = $optional_headers;
    }

    $ctx = stream_context_create($params);
    $fp = @fopen($url, 'rb', false, $ctx);

    if (!$fp){
        throw new Exception("Problem with $url, $php_errormsg");
    }

    $response = @stream_get_contents($fp);

    if ($response === false) {
        throw new Exception("Problem reading data from $url, $php_errormsg");
    }

    return $response;
}

Este é o resultado da execução de um tracepath desse servidor para o "Website B", no mesmo servidor:

tracepath customers.xxx.com
 1:  server.xxx.com (208.92.xxx.xxx)      0.144ms pmtu 16436
 1:  server.xxx.com (208.92.xxx.xxx)      0.093ms reached
     Resume: pmtu 16436 hops 1 back 1
por Daniel Magliola 19.07.2010 / 20:02

3 respostas

1

No final, acabei reescrevendo o script para usar o cURL. Eu não sei o que aconteceu, mas cURL funciona. Esta é uma das coisas mais estranhas que encontrei ...

    
por 21.07.2010 / 06:07
0

Isso cheira a um problema de MTU entre A e B em que algo está atrapalhando sua descoberta de MTU de caminho. Você pode tentar algo como tracepath B de A?

    
por 19.07.2010 / 20:27
0

Uma vez eu tive um problema semelhante devido a um roteador (RRAS do Windows 2000, que depois foi corrigido em algum SP) não manipulando adequadamente MTUs e simplesmente descartando pacotes que eram muito grandes em vez de dizer ao remetente para fragmentá-los em partes menores. Foi uma dor para solucionar problemas e um grande problema, já que o local era um cibercafé e o problema costumava aparecer exatamente quando um cliente enviava uma mensagem longa de algum site de webmail.

Você deve verificar se o problema está relacionado a HTTP POSTs ou a qualquer tráfego de dados; um ping simples com uma carga maior que 1024 bytes deve ser suficiente para verificar isso.

Atualização:

Ok, parece que não é um problema de rede. Qual SO e servidor (es) da web você está usando?

    
por 19.07.2010 / 20:36

Tags