Browse Source

Added absoluteURI support

If requests go through a proxy, they will have the original uri in the
request, i.e. : GET http://proxy.server.uri/some/query/string  HTTP 1.1 ...

That was problematic -- cowboy_http_protocol:request didn't know what to
to with the result of decode_packet applied to this, which would be something
like:

``` erlang
{http_request,'GET',{absoluteURI,http,<<"proxy.server.uri">>,
	undefined,<<"/some/query/string">>},{1,1}}
```

So, I just ignore the host, grab the path and pass into

``` erlang
cowboy_http_protocol:request({http_request, Method, {abs_path, Path},
	Version}, State)
```

Seems to do the trick without much effort.
David Kelly 13 years ago
parent
commit
e7b6e2a402
2 changed files with 6 additions and 1 deletions
  1. 4 0
      src/cowboy_http_protocol.erl
  2. 2 1
      test/http_SUITE.erl

+ 4 - 0
src/cowboy_http_protocol.erl

@@ -113,6 +113,10 @@ wait_request(State=#state{socket=Socket, transport=Transport,
 request({http_request, _Method, _URI, Version}, State)
 request({http_request, _Method, _URI, Version}, State)
 		when Version =/= {1, 0}, Version =/= {1, 1} ->
 		when Version =/= {1, 0}, Version =/= {1, 1} ->
 	error_terminate(505, State);
 	error_terminate(505, State);
+%% We still receive the original Host header.
+request({http_request, Method, {absoluteURI, _Scheme, _Host, _Port, Path},
+		Version}, State) ->
+	request({http_request, Method, {abs_path, Path}, Version}, State);
 request({http_request, Method, {abs_path, AbsPath}, Version},
 request({http_request, Method, {abs_path, AbsPath}, Version},
 		State=#state{socket=Socket, transport=Transport,
 		State=#state{socket=Socket, transport=Transport,
 		urldecode={URLDecFun, URLDecArg}=URLDec}) ->
 		urldecode={URLDecFun, URLDecArg}=URLDec}) ->

+ 2 - 1
test/http_SUITE.erl

@@ -378,7 +378,8 @@ raw(Config) ->
 		{"GET / HTTP/1.1\r\nHost: localhost", 408},
 		{"GET / HTTP/1.1\r\nHost: localhost", 408},
 		{"GET / HTTP/1.1\r\nHost: localhost\r\n", 408},
 		{"GET / HTTP/1.1\r\nHost: localhost\r\n", 408},
 		{"GET / HTTP/1.1\r\nHost: localhost\r\n\r", 408},
 		{"GET / HTTP/1.1\r\nHost: localhost\r\n\r", 408},
-		{"GET http://localhost/ HTTP/1.1\r\n\r\n", 501},
+		{"GET http://proxy/ HTTP/1.1\r\n\r\n", 400},
+		{"GET http://proxy/ HTTP/1.1\r\nHost: localhost\r\n\r\n", 200},
 		{"GET / HTTP/1.2\r\nHost: localhost\r\n\r\n", 505},
 		{"GET / HTTP/1.2\r\nHost: localhost\r\n\r\n", 505},
 		{"GET /init_shutdown HTTP/1.1\r\nHost: localhost\r\n\r\n", 666},
 		{"GET /init_shutdown HTTP/1.1\r\nHost: localhost\r\n\r\n", 666},
 		{"GET /long_polling HTTP/1.1\r\nHost: localhost\r\n\r\n", 102},
 		{"GET /long_polling HTTP/1.1\r\nHost: localhost\r\n\r\n", 102},