nginx 400 error when username included in the uri

Igor Sysoev is at rambler-co.ru
Wed Aug 20 16:14:40 MSD 2008


On Tue, Aug 19, 2008 at 05:35:52PM -0700, Michael Ching wrote:

> Currently when nginx encounters a Request-URI of the form 
> http://username@host.com/ it returns error 400. This appears to be 
> proper per RFC 2616 since the username@ is not recognized by the RFC for 
> HTTP URIs.  However, this is causing problems for us when dealing with 
> some clients because Apache silently discards the username:password@ 
> portion of the URI.  Users with clients expecting to see the same 
> behavior (e.g. Apple's XCode) receive an error instead.
> 
> We realize that accepting this would be non-standard behavior and 
> understand if incorporating the changes is not possible.  However, it 
> would be useful to us if we could have the option to let nginx be as 
> permissive as Apache while proxying to it.  Either way, we would 
> appreciate any feedback on the patch in terms unintended side-effects, etc.
> 
> 
> Something like the following should allow nginx to ignore the 
> username:password:
> 
> *** nginx-0.6.32/src/http/ngx_http_parse.c      2008-03-16 
> 11:47:16.000000000 -0500
> --- nginx-0.6.32-new/src/http/ngx_http_parse.c  2008-08-19 
> 13:07:50.000000000 -0500
> ***************
> *** 355,360 ****
> --- 355,363 ----
>                  r->uri_end = r->schema_end + 2;
>                  state = sw_http_09;
>                  break;
> +             case '@':
> +                 r->host_start = p + 1;
> +                 break;
>              default:
>                  return NGX_HTTP_PARSE_INVALID_REQUEST;
>              }
> 
> 
> For reference, in APR's apr_uri_parse method used by Apache, it 
> information is silently discarded from what I can tell:
> 
> /* If there's a username:password at host:port, the @ we want is the last @...
> * too bad there's no memrchr()... For the C purists, note that hostinfo
> * is definately not the first character of the original uri so therefore
> * &hostinfo[-1] < &hostinfo[0] ... and this loop is valid C.
> */
> do {
> --s;
> } while (s >= hostinfo && *s != '@');

This patch ignores  user only in "http://user@host".
Should password in "http://user:password@host" be ignored too ?


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list