implemented a hack not to use the chunked transfer encoding ii the response code is 1xx, 204, 304 or the request method is HEAD

This commit is contained in:
hyung-hwan 2015-02-01 04:10:56 +00:00
parent e7a598f591
commit 3f94bd2cd6

View File

@ -491,6 +491,7 @@ static int proxy_htrd_peek_peer_output (qse_htrd_t* htrd, qse_htre_t* res)
proxy_peer_htrd_xtn_t* xtn; proxy_peer_htrd_xtn_t* xtn;
task_proxy_t* proxy; task_proxy_t* proxy;
qse_httpd_t* httpd; qse_httpd_t* httpd;
int res_code;
xtn = (proxy_peer_htrd_xtn_t*) qse_htrd_getxtn (htrd); xtn = (proxy_peer_htrd_xtn_t*) qse_htrd_getxtn (htrd);
proxy = xtn->proxy; proxy = xtn->proxy;
@ -507,7 +508,8 @@ static int proxy_htrd_peek_peer_output (qse_htrd_t* htrd, qse_htre_t* res)
return -1; return -1;
} }
if ((proxy->resflags & PROXY_RES_AWAIT_100) && qse_htre_getscodeval(res) == 100) res_code = qse_htre_getscodeval(res);
if ((proxy->resflags & PROXY_RES_AWAIT_100) && res_code == 100)
{ {
/* TODO: check if the request contained Expect... */ /* TODO: check if the request contained Expect... */
@ -550,7 +552,7 @@ static int proxy_htrd_peek_peer_output (qse_htrd_t* htrd, qse_htre_t* res)
{ {
/* the response from the peer is chunked or /* the response from the peer is chunked or
* should be read until disconnection. * should be read until disconnection.
* but the whold response has already been * but the whole response has already been
* received. so i dont' have to do complex * received. so i dont' have to do complex
* chunking or something when returning the * chunking or something when returning the
* response back to the client. */ * response back to the client. */
@ -559,7 +561,35 @@ static int proxy_htrd_peek_peer_output (qse_htrd_t* htrd, qse_htre_t* res)
} }
else else
{ {
if (qse_comparehttpversions (&proxy->version, &qse_http_v11) >= 0) if (proxy->method == QSE_HTTP_HEAD || (res_code >= 100 && res_code <= 199) ||
res_code == 204 || res_code == 304)
{
/* RFC 2616.
* 1.Any response message which "MUST NOT" include a message-body (such
* as the 1xx, 204, and 304 responses and any response to a HEAD
* request) is always terminated by the first empty line after the
* header fields, regardless of the entity-header fields present in
* the message.
*
* Google chrome looks to be very strict in interpreting the above
* clause in that it suffers when it gets a 304 response with
* chunked transfer-encoding and the content containting the last
* chunk(0\r\n\r\n) only.
*
* Other browsers like firefox and opera didn't have this problem.
*
* The hack here assumes that the actual response from the peer
* contains no message-body(content) either.
*/
/* TODO: apply the same trick if the request is HEAD */
/* Force the length to be zero as if Content-Length: 0 is in the
* original peer response */
proxy->resflags |= PROXY_RES_PEER_LENGTH | PROXY_RES_PEER_LENGTH_FAKE;
proxy->peer_output_length = 0;
}
else if (qse_comparehttpversions (&proxy->version, &qse_http_v11) >= 0)
{ {
/* client supports chunking */ /* client supports chunking */