Pergunta

Tenho um comportamento estranho ao fazer solicitações HTTP por meio de soquetes. Aqui está a solicitação:

POST https://example.com:443/service/XMLSelect HTTP/1.1
Content-Length: 10926
Host: example.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)
Authorization: Basic XXX
SOAPAction: http://example.com/SubmitXml

Mais tarde, vai o corpo da minha solicitação com determinado comprimento de conteúdo.Depois disso recebo algo como:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Tue, 30 Mar 2010 06:13:52 GMT

Então tudo parece estar bem aqui.Eu li todo o conteúdo do fluxo da rede e recebi uma resposta com sucesso.Mas meu soquete que estou pesquisando em switches tem modos assim:

write ( i write headers and request here )
read ( after headers sent i begin to receive response )
write ( STRANGE BEHAVIOUR HERE. WHY? here i send nothing really )
read ( here it switches to read back again )

as duas últimas etapas podem ser repetidas várias vezes.Então, quero perguntar o que leva à mudança de modo do soquete?E neste caso não é um grande problema, mas quando eu uso a compactação gzip na minha solicitação (não tenho ideia de como isso está relacionado) e peço ao servidor para enviar uma resposta gzipada para mim assim:

POST https://example.com:443/service/XMLSelect HTTP/1.1
Content-Length: 1076
Accept-Encoding: gzip
Content-Encoding: gzip
Host: example.com
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.0.3705)
Authorization: Basic XXX
SOAPAction: http://example.com/SubmitXml

Recebo resposta assim:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Encoding: gzip
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Tue, 30 Mar 2010 07:26:33 GMT

2000
�

Recebo um tamanho de pedaço e um cabeçalho GZIP, está tudo bem.E aqui está o que está acontecendo com meu pobre soquete:

write ( i write headers and request here )
read ( after headers sent i begin to receive response )
write ( STRANGE BEHAVIOUR HERE. And it finally sits here forever waiting for me to send something! But if i refer to HTTP I don't have to send anything more! )

Com o que isso pode estar relacionado?O que quer que eu envie?É problema do servidor web remoto ou sinto falta de alguma coisa?

PS Todas as referências de serviço reais e logins/senhas substituídos por falsos :)

Foi útil?

Solução

Um soquete se torna gravável sempre que houver espaço na tomada enviar buffer.O sistema operacional não pode realmente saber se seu aplicativo tem mais dados para enviar, mas conhece suas estruturas internas, como buffers de soquete.Você deve adicionar/remover explicitamente o soquete para a gravação fd_set para select(2) (habilitar desabilitar EPOLLOUT evento para epoll(4)).Isso geralmente é tratado com um máquina de estado, como em evento libe.A votação também funciona melhor com sem bloqueio tomadas.

Espero que isto ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top