http:request/4 proxy redirection problem

Anton Berezin tobez@REDACTED
Mon Jul 31 20:26:41 CEST 2006


Hi,

It appears that when one uses http:request/4 with a configured proxy, and
the webserver returns 3XX code, http:request/4 enters an endless loop.

There seems to be two problems in fact:

First, the guard statement that checks for HTTP_MAX_REDIRECTS to prevent
looping is written as Code / 100 == 3, which does not quite do what it
should, so redirection loops are not detected.

Secondly, when httpc_response:redirect/2 constructs a new request, it
does not update #request.abs_uri, which in fact is the only thing that
is used by the proxy branch of the code when making the request.

A patch follows.  The last chunk of the patch is a quick hack.  My
Erlang knowledge is rather embryonic, and I could not find the opposite
to http_uri:parse/1 anywhere.

If this is already fixed in unreleased version of inets, sorry for
wasting everybody's time.

--- lib/inets-4.7.4/src/httpc_response.erl	Wed May  3 10:22:37 2006
+++ lib/inets-4.7.4/src/httpc_response.erl	Mon Jul 31 20:13:09 2006
@@ -84,7 +84,7 @@ result(Response = {{_,100,_}, _, _}, Req
 result(Response = {{_, Code, _}, _, _}, Request =
        #request{redircount = Redirects,
 		settings = #http_options{autoredirect = true}}) 
-  when Code / 100 == 3, Redirects > ?HTTP_MAX_REDIRECTS ->
+  when Code div 100 == 3, Redirects > ?HTTP_MAX_REDIRECTS ->
     transparent(Response, Request);
 
 %% multiple choices or use proxy
@@ -114,7 +114,7 @@ result(Response = {{_, Code, _}, _, _}, 
 
 result(Response = {{_,503,_}, _, _}, Request) ->
     status_service_unavailable(Response, Request);
-result(Response = {{_,Code,_}, _, _}, Request) when (Code / 100) == 5 ->
+result(Response = {{_,Code,_}, _, _}, Request) when (Code div 100) == 5 ->
     status_server_error_50x(Response, Request);
 
 result(Response, Request) -> 
@@ -247,7 +247,11 @@ redirect(Response = {StatusLine, Headers
 					headers = NewHeaders,
 					address = {Host,Port},
 					path = Path,
-					pquery = Query},
+					pquery = Query,
+					abs_uri =
+						atom_to_list(Scheme)++"://"++
+						Host++":"++integer_to_list(Port)++
+						Path++Query},
 		    {redirect, NewRequest, Data}
 	    end
     end.


\Anton.
-- 
We're going for 'working' here.
'Clean' is for people with skills...  -- Flemming Jacobsen



More information about the erlang-questions mailing list