You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Roy T. Fielding" <fi...@kiwi.ics.uci.edu> on 1997/07/17 10:36:30 UTC

Re: ie4pr2

>When making a java request it uses one of the Java1.0 or JDK/1.0
>user-agents but also makes an HTTP/1.1 request.  When our code gets that
>in combo with a force-response-1.0 it responds with something that really
>isn't 1.0.  In particular it still chunks.  Given our FAQ suggestions,
>this is a problem. 

Yes, it is.  The fix is to ignore force-response-1.0 when the request is
from an HTTP/1.1 client.

>Additionally, our nokeepalive code does not work for a 1.1 request.  The
>patch below fixes this (and re-orders a test putting the cheap one first).

It isn't supposed to -- consider the case of HTTP/1.1 proxies being
used by older clients.  The patch is wrong.

....Roy

Re: ie4pr2

Posted by Dean Gaudet <dg...@arctic.org>.

On Thu, 17 Jul 1997, Dean Gaudet wrote:

> @@ -315,7 +317,7 @@
>  	r->connection->keepalives++;
>  	
>  	/* If they sent a Keep-Alive token, send one back */
> -	if (ka_sent) {
> +	if (1 /*ka_sent*/) {
>  	    if (r->server->keep_alive_max)
>  		ap_snprintf(header, sizeof(header), "timeout=%d, max=%d",
>  			    r->server->keep_alive_timeout, left);

Um, it was late... ignore this hunk.

Dean


Re: ie4pr2

Posted by Dean Gaudet <dg...@arctic.org>.
On Thu, 17 Jul 1997, Roy T. Fielding wrote:

> Yes, it is.  The fix is to ignore force-response-1.0 when the request is
> from an HTTP/1.1 client.

I've asked the submitter of PR#875 to tell me if removing the
force-response works for him.  I don't know how/care to test this problem
at this moment.  The patch below implements your suggestion, let's hope
it's all we need to do.

> >Additionally, our nokeepalive code does not work for a 1.1 request.  The
> >patch below fixes this (and re-orders a test putting the cheap one first).
> 
> It isn't supposed to -- consider the case of HTTP/1.1 proxies being
> used by older clients.  The patch is wrong.

Sorry, but now I know that it *is* a keepalive problem with IE4 PR2.

I downloaded and installed PR2 on my computer.  And with keep-alive
disabled there's no problem with redirects (with keep-alive enabled
PR2 just hangs waiting for the server to close the connection after the
response).  I am guessing this is only an issue with non-200 responses.
But I frankly don't care at this hour.

I tried issuing a "Connection: keep-alive" header, just to reinforce
reality, but it didn't like that either.

The patch below chooses to respect nokeepalive in a 1.1 connection if
there's no Via header.  However I gag at this.  I want this to be a
workaround for 1.2 only.  I would prefer if 1.3 included mod_setenvif,
and we do something like:

# nokeepalive if IE4 PR2 not coming through a proxy
SetEnvIf User-Agent "MSIE 4.0b2;" nokeepalive
SetEnvIf Via .* !nokeepalive

(At least I think mod_setenvif includes the same syntax as mod_browser.)

Regardless of how we solve this, the workaround should only be recommended
for PR2.  I've told the contact at microsoft that I expect them to fix
the problem for the next release.

Dean

Index: http_protocol.c
===================================================================
RCS file: /export/home/cvs/apache/src/http_protocol.c,v
retrieving revision 1.139
diff -u -r1.139 http_protocol.c
--- http_protocol.c	1997/07/15 22:36:51	1.139
+++ http_protocol.c	1997/07/17 10:18:18
@@ -304,9 +304,11 @@
         !status_drops_connection(r->status) &&
         !wimpy &&
         !find_token(r->pool, conn, "close") &&
-        (((ka_sent = find_token(r->pool, conn, "keep-alive")) &&
-          !table_get(r->subprocess_env, "nokeepalive")) ||
-         (r->proto_num >= 1001))
+        ((r->proto_num >= 1001 && 
+	  (!table_get(r->subprocess_env, "nokeepalive") ||
+	   table_get(r->headers_in, "Via"))) ||
+         ((ka_sent = find_token(r->pool, conn, "keep-alive")) &&
+          !table_get(r->subprocess_env, "nokeepalive")))
        ) {
 	char header[256];
 	int left = r->server->keep_alive_max - r->connection->keepalives;
@@ -315,7 +317,7 @@
 	r->connection->keepalives++;
 	
 	/* If they sent a Keep-Alive token, send one back */
-	if (ka_sent) {
+	if (1 /*ka_sent*/) {
 	    if (r->server->keep_alive_max)
 		ap_snprintf(header, sizeof(header), "timeout=%d, max=%d",
 			    r->server->keep_alive_timeout, left);
@@ -1044,8 +1046,9 @@
     
     if (!r->status_line)
         r->status_line = status_lines[index_of_response(r->status)];
-    
-    if (table_get(r->subprocess_env,"force-response-1.0"))
+
+    if (r->proto_num == 1000
+	&& table_get(r->subprocess_env,"force-response-1.0"))
 	protocol = "HTTP/1.0";
     else
 	protocol = SERVER_PROTOCOL;