New features: http version switching and limits for redirects

Tue, 16 Oct 2012 13:26:53 +0200

author
Tomasz Wasilczyk <tomkiewicz@cpw.pidgin.im>
date
Tue, 16 Oct 2012 13:26:53 +0200
changeset 33444
b3afec292014
parent 33443
ab563d4c927a
child 33445
1bcbdca07787

New features: http version switching and limits for redirects

libpurple/http.c file | annotate | diff | comparison | revisions
libpurple/http.h file | annotate | diff | comparison | revisions
libpurple/protocols/gg/gg.c file | annotate | diff | comparison | revisions
--- a/libpurple/http.c	Tue Oct 16 12:55:24 2012 +0200
+++ b/libpurple/http.c	Tue Oct 16 13:26:53 2012 +0200
@@ -32,6 +32,8 @@
 #define PURPLE_HTTP_URL_CREDENTIALS_CHARS "a-z0-9.,~_/*!&%?=+\\^-"
 #define PURPLE_HTTP_MAX_RECV_BUFFER_LEN 10240
 
+#define PURPLE_HTTP_REQUEST_DEFAULT_MAX_REDIRECTS 20
+
 typedef struct _PurpleHttpURL PurpleHttpURL;
 
 typedef struct _PurpleHttpSocket PurpleHttpSocket;
@@ -52,6 +54,9 @@
 	int ref_count;
 
 	gchar *url;
+
+	int max_redirects;
+	gboolean http11;
 };
 
 struct _PurpleHttpConnection
@@ -70,6 +75,8 @@
 	gboolean main_header_got, headers_got;
 	GString *response_buffer;
 
+	int redirects_count;
+
 	int length_expected, length_got;
 
 	gboolean is_chunked, in_chunk, chunks_done;
@@ -307,7 +314,8 @@
 	hc->request_header = h = g_string_new("");
 	hc->request_header_written = 0;
 
-	g_string_append_printf(h, "GET %s HTTP/%s\r\n", url->path, "1.1");
+	g_string_append_printf(h, "GET %s HTTP/%s\r\n", url->path,
+		hc->request->http11 ? "1.1" : "1.0");
 	g_string_append_printf(h, "Host: %s\r\n", url->host);
 	g_string_append_printf(h, "Connection: close\r\n");
 
@@ -599,9 +607,12 @@
 
 		redirect = purple_http_headers_get(hc->response->headers,
 			"location");
-		if (redirect) {
+		if (redirect &&
+			hc->request->max_redirects > hc->redirects_count) {
 			PurpleHttpURL *url = purple_http_url_parse(redirect);
 
+			hc->redirects_count++;
+
 			if (!url) {
 				if (purple_debug_is_unsafe())
 					purple_debug_warning("http",
@@ -947,6 +958,9 @@
 	request->ref_count = 1;
 	request->url = g_strdup(url);
 
+	request->max_redirects = PURPLE_HTTP_REQUEST_DEFAULT_MAX_REDIRECTS;
+	request->http11 = TRUE;
+
 	return request;
 }
 
@@ -978,6 +992,38 @@
 	return NULL;
 }
 
+void purple_http_request_set_max_redirects(PurpleHttpRequest *request,
+	int max_redirects)
+{
+	g_return_if_fail(request != NULL);
+
+	if (max_redirects < -1)
+		max_redirects = -1;
+
+	request->max_redirects = max_redirects;
+}
+
+int purple_http_request_get_max_redirects(PurpleHttpRequest *request)
+{
+	g_return_val_if_fail(request != NULL, -1);
+
+	return request->max_redirects;
+}
+
+void purple_http_request_set_http11(PurpleHttpRequest *request, gboolean http11)
+{
+	g_return_if_fail(request != NULL);
+
+	request->http11 = http11;
+}
+
+gboolean purple_http_request_is_http11(PurpleHttpRequest *request)
+{
+	g_return_val_if_fail(request != NULL, FALSE);
+
+	return request->http11;
+}
+
 /*** HTTP response API ********************************************************/
 
 static PurpleHttpResponse * purple_http_response_new(void)
@@ -1010,9 +1056,6 @@
 	if (code == 200)
 		return TRUE;
 
-	if (code / 100 == 3) /* 3xx */
-		return TRUE;
-
 	return FALSE;
 }
 
--- a/libpurple/http.h	Tue Oct 16 12:55:24 2012 +0200
+++ b/libpurple/http.h	Tue Oct 16 13:26:53 2012 +0200
@@ -253,10 +253,21 @@
 	PurpleHttpContentWriter writer, gpointer user_data);
 
 /**
- * -1 for unlimited
+ * Sets maximum amount of redirects.
+ *
+ * @param request       The request.
+ * @param max_redirects Maximum amount of redirects, or -1 for unlimited.
  */
 void purple_http_request_set_max_redirects(PurpleHttpRequest *request,
-	int max_redirects); // +get
+	int max_redirects);
+
+/**
+ * Gets maximum amount of redirects.
+ *
+ * @param request The request.
+ * @return        Current maximum amount of redirects (-1 for unlimited).
+ */
+int purple_http_request_get_max_redirects(PurpleHttpRequest *request);
 
 /**
  * NULL for disabling cookie support
@@ -265,13 +276,21 @@
 	PurpleHTTPCookieJar *cookie_jar); // +get
 
 /**
- * NULL for default
+ * Sets HTTP version to use.
+ *
+ * @param request The request.
+ * @param http11  TRUE for HTTP/1.1, FALSE for HTTP/1.0.
  */
-void purple_http_request_set_user_agent(PurpleHttpRequest *request,
-	const gchar *user_agent); // +get
+void purple_http_request_set_http11(PurpleHttpRequest *request,
+	gboolean http11);
 
-void purple_http_request_set_http11(PurpleHttpRequest *request,
-	gboolean http11); // +is
+/**
+ * Gets used HTTP version.
+ *
+ * @param request The request.
+ * @return        TRUE, if we use HTTP/1.1, FALSE for HTTP/1.0.
+ */
+gboolean purple_http_request_is_http11(PurpleHttpRequest *request);
 
 /**
  * -1 for unlimited
--- a/libpurple/protocols/gg/gg.c	Tue Oct 16 12:55:24 2012 +0200
+++ b/libpurple/protocols/gg/gg.c	Tue Oct 16 13:26:53 2012 +0200
@@ -64,13 +64,13 @@
 	const gchar *data;
 	gchar *data_front, *data_tail;
 
-	purple_debug_info("http-test", "Testing http done %s.\n",
-		purple_http_response_is_successfull(response) ?
-		"successfully" : "without success");
-	purple_debug_info("http-test", "Returned http code: %d.\n",
-		purple_http_response_get_code(response));
-	purple_debug_info("http-test", "Returned error: %s.\n",
-		purple_http_response_get_error(response));
+//	purple_debug_info("http-test", "Testing http done %s.\n",
+//		purple_http_response_is_successfull(response) ?
+//		"successfully" : "without success");
+//	purple_debug_info("http-test", "Returned http code: %d.\n",
+//		purple_http_response_get_code(response));
+//	purple_debug_info("http-test", "Returned error: %s.\n",
+//		purple_http_response_get_error(response));
 
 	data = purple_http_response_get_data(response);
 	if (strlen(data) < 200)
@@ -112,15 +112,30 @@
 
 static void ggp_action_test_http(PurplePluginAction *action)
 {
+	PurpleHttpRequest *request;
+	//PurpleHttpConnection *hc;
 	PurpleConnection *gc = (PurpleConnection *)action->context;
 
 	purple_debug_info("http-test", "Testing http...\n");
 //	purple_http_get(gc, "http://www.wasilczyk.pl/x_ip_simple.htm",
 //		ggp_test_http_cb, NULL);
+/*
+	purple_http_get(gc, "http://www.wasilczyk.pl/x_ip_simple.htm",
+		ggp_test_http_cb, NULL);
+	purple_http_get(gc, "http://www.wasilczyk.pl/x_ip_simple.htm",
+		ggp_test_http_cb, NULL);
+	purple_http_get(gc, "http://www.wasilczyk.pl/x_ip_simple.htm",
+		ggp_test_http_cb, NULL);
+	purple_http_get(gc, "http://www.wasilczyk.pl/x_ip_simple.htm",
+		ggp_test_http_cb, NULL);
+	purple_http_get(gc, "http://www.wasilczyk.pl/x_ip_simple.htm",
+		ggp_test_http_cb, NULL);
+*/
+
 //	purple_http_get(gc, "http://google.com",
 //		ggp_test_http_cb, NULL);
-	purple_http_get(gc, "http://wp.pl",
-		ggp_test_http_cb, NULL);
+//	purple_http_get(gc, "http://wp.pl",
+//		ggp_test_http_cb, NULL);
 
 //	purple_http_get(gc, "https://www.google.pl",
 //		ggp_test_http_cb, NULL);
@@ -128,6 +143,13 @@
 //	purple_util_fetch_url("https://www.google.pl",
 //		TRUE, NULL, TRUE, -1, ggp_test_http_cb2, NULL);
 
+
+	request = purple_http_request_new("http://wp.pl");
+//	purple_http_request_set_http11(request, FALSE);
+	purple_http_request_set_max_redirects(request, 1);
+	purple_http_request(gc, request, ggp_test_http_cb, NULL);
+	purple_http_request_unref(request);
+
 	purple_debug_info("http-test", "Testing http started.\n");
 }
 

mercurial