O corpo da solicitação POST falha ao obter o PHP

1

Eu vi o seguinte problema no Apache 2.2 / PHP 5.3 e no Apache 2.4 / PHP 5.4

Encontrei um problema raro em que solicitações POST (pequenas, com menos de 1k) para um servidor da Web parecem estar sendo truncadas antes de chegarem ao serviço PHP que atuará nos dados. Eu não fui capaz de reproduzir o problema sozinho, então estou trabalhando apenas em evidências coletadas de logs. Em cada caso, recebo uma solicitação com um cabeçalho de comprimento de conteúdo diferente de zero válido, mas sem corpo.

Eu joguei uma variedade de informações sobre o agente de chamada e não vejo nenhum padrão. As solicitações quebradas vêm de uma variedade de navegadores e ips de origem e, para qualquer ip fornecido, vejo muitos pedidos válidos em torno da solicitação interrompida ocasional.

Eu tentei usar getRequestBody () e file_get_contents ("php: // input") de pecl_http e nenhum dos dois retorna nenhum dado nesse caso.

Eu também habilitei temporariamente o mod_dumpio e, no caso de uma transação incorreta, vejo uma entrada em que ele tenta armazenar em buffer o corpo da solicitação:

mod_dumpio: dumpio_in [readbytes-blocking] 288 readbytes

que normalmente seria seguido pelo buffer real dos dados, como:

mod_dumpio:  dumpio_in (data-HEAP): 288 bytes
mod_dumpio:  dumpio_in (data-HEAP): (the post data)

Mas, no caso em que encontro o problema, não vejo essas entradas, há um atraso considerável de VÁRIOS SEGUNDOS nesse processo do apache e, em vez disso, vejo várias outras instâncias de:

mod_dumpio: dumpio_in [readbytes-blocking] 288 readbytes
mod_dumpio: dumpio_in - 70014

E misturado com essas repetidas tentativas de leitura, vejo a evidência de um thread PHP executando na solicitação malformada e produzindo uma resposta.

Parece que o protocolo HTTP 4.4 indica que o corpo de uma solicitação DEVE corresponder ao conteúdo -length para que a solicitação seja válida, então estou com dificuldades para entender como as solicitações em questão estão chegando ao PHP.

Também devo mencionar que o tipo de conteúdo neste caso está sendo fornecido como application / x-www-form-urlencoded, mesmo que os dados enviados sejam json raw. Como estou lendo os dados diretamente do fluxo, não espero que esteja relacionado ao meu problema, mas é importante mencionar isso.

Eu não quero comparar cegamente o tamanho do conteúdo com o strlen ($ content) em PHP, mas estou ficando sem opções para melhor diagnosticar o problema. Qualquer ajuda sobre como corrigir essa situação OU coletar mais informações valiosas sobre depuração seria muito apreciada.

    
por J. Paulding 24.04.2014 / 01:32

0 respostas