Tue, 16 Oct 2012 13:26:53 +0200
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"); }