diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2012-09-22 12:52:01 +0100 |
---|---|---|
committer | Wilmer van der Gaast <wilmer@gaast.net> | 2012-09-22 12:52:01 +0100 |
commit | 55ccc9a0dffdc96b7a5c6d41de2e97d2cd1741d9 (patch) | |
tree | b407d8065a10cefca3835ddd9b4a7884c09f66b9 /lib/http_client.c | |
parent | daf544ac6a08ce2fc0f9bd2b07c70ea349a41e30 (diff) |
Solve a whole bunch of Twitter module crashes: Twitter responses seem to
be getting truncated sometimes. Treat this as an error in http_client
already instead of returning partial data.
Diffstat (limited to 'lib/http_client.c')
-rw-r--r-- | lib/http_client.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/http_client.c b/lib/http_client.c index 98a99f7c..6e7c7b72 100644 --- a/lib/http_client.c +++ b/lib/http_client.c @@ -197,7 +197,8 @@ static gboolean http_incoming_data( gpointer data, int source, b_input_condition struct http_request *req = data; int evil_server = 0; char buffer[2048]; - char *end1, *end2; + char *end1, *end2, *s; + size_t content_length; int st; if( req->inpa > 0 ) @@ -480,7 +481,7 @@ got_reply: /* Assume that a closed connection means we're finished, this indeed breaks with keep-alive connections and faulty connections. */ - req->finished = 1; + /* req->finished = 1; */ cleanup: if( req->ssl ) @@ -488,6 +489,18 @@ cleanup: else closesocket( req->fd ); + if( ( s = get_rfc822_header( req->reply_headers, "Content-Length", 0 ) ) && + sscanf( s, "%zd", &content_length ) == 1 ) + { + if( content_length < req->body_size ) + { + req->status_code = -1; + g_free( req->status_string ); + req->status_string = g_strdup( "Response truncated" ); + } + } + g_free( s ); + if( getenv( "BITLBEE_DEBUG" ) && req ) printf( "Finishing HTTP request with status: %s\n", req->status_string ? req->status_string : "NULL" ); |