Re: [PATCH] Location header recovering to absoluteURI
Alejandro Guerrieri <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Apart from renaming "absulte" to "absolute", patch looks fine and I'm +1 with the idea of allowing this behavior. Regards, -- Alejandro Guerrieri [email protected] On 23/01/2009, at 18:15, Stipe Tolj wrote: > Hi list, > > we refuse to follow party defined absoluteURI Location header > values. Which is > "correct" when being pedantic with the specs. But some mayor HTTP > services, i.e. > Yahoo do send URI /xxx as Location header values. This patch ensures > we are able > to recover from this circumstance, and continue the following. > > Please review, test and vote for committing to CVS HEAD. > > Stipe > > -- > ------------------------------------------------------------------- > Kölner Landstrasse 419 > 40589 Düsseldorf, NRW, Germany > > tolj.org system architecture Kannel Software Foundation (KSF) > http://www.tolj.org/ http://www.kannel.org/ > > mailto:st_{at}_tolj.org mailto:stolj_{at}_kannel.org > ------------------------------------------------------------------- > ### Eclipse Workspace Patch 1.0 > #P gateway-cvs-head > Index: gwlib/http.c > =================================================================== > RCS file: /home/cvs/gateway/gwlib/http.c,v > retrieving revision 1.253 > diff -u -r1.253 http.c > --- gwlib/http.c 12 Jan 2009 16:46:55 -0000 1.253 > +++ gwlib/http.c 23 Jan 2009 17:11:26 -0000 > @@ -928,6 +928,49 @@ > } > > > +/* > + * Recovers a Location header value of format URI /xyz to an > + * absoluteURI format according to the protocol rules. > + * This simply implies that we re-create the prefixed scheme, > + * user/passwd (if any), host and port string and prepend it > + * to the location URI. > + */ > +static void recover_absulte_uri(HTTPServer *trans, Octstr *loc) > +{ > + Octstr *os; > + > + gw_assert(loc != NULL && trans != NULL); > + > + /* we'll only accept locations with a leading / */ > + if (octstr_get_char(loc, 0) == '/') { > + > + /* scheme */ > + os = trans->ssl ? octstr_create("https://") : > + octstr_create("http://"); > + > + /* credentials, if any */ > + if (trans->username && trans->password) { > + octstr_append(os, trans->username); > + octstr_append_char(os, ':'); > + octstr_append(os, trans->password); > + octstr_append_char(os, '@'); > + } > + > + /* host */ > + octstr_append(os, trans->host); > + > + /* port, only added if literally not default. */ > + if (trans->port != 80) { > + octstr_format_append(os, ":%ld", trans->port); > + } > + > + /* prepend the created octstr to the loc, and destroy then. > */ > + octstr_insert(loc, os, 0); > + octstr_destroy(os); > + } > +} > + > + > /* > * Read and parse the status response line from an HTTP server. > * Fill in trans->persistent and trans->status with the findings. > @@ -1117,9 +1160,30 @@ > > /* > * This is a redirected response, we have to follow. > - * Clean up all trans stuff for the next request we do. > + * > + * According to HTTP/1.1 (RFC 2616), section 14.30 any > Location > + * header value should be 'absoluteURI', which is defined in > + * RFC 2616, section 3.2.1 General Syntax, and specifically > in > + * RFC 2396, section 3 URI Syntactic Components as > + * > + * absoluteURI = scheme ":" ( hier_part | opaque_part ) > + * > + * Some HTTP servers 'interpret' a leading UDI / as that kind > + * of absoluteURI, which is not correct, following the > protocol in > + * detail. But we'll try to recover from that misleaded > + * interpreation and try to convert the partly absoluteURI > to a > + * fully qualified absoluteURI. > + * > + * http_URL = "http:" "//" [ userid : password "@"] host > + * [ ":" port ] [ abs_path [ "?" query ]] > + * > */ > octstr_strip_blanks(h); > + recover_absulte_uri(trans, h); > + > + /* > + * Clean up all trans stuff for the next request we do. > + */ > octstr_destroy(trans->url); > octstr_destroy(trans->host); > trans->port = 0;