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;