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 | |
| 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.
| -rw-r--r-- | lib/http_client.c | 17 | ||||
| -rw-r--r-- | lib/http_client.h | 2 | ||||
| -rw-r--r-- | lib/misc.c | 4 | ||||
| -rw-r--r-- | lib/misc.h | 2 | 
4 files changed, 19 insertions, 6 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" ); diff --git a/lib/http_client.h b/lib/http_client.h index 27c484ff..623f17a0 100644 --- a/lib/http_client.h +++ b/lib/http_client.h @@ -58,7 +58,7 @@ struct http_request  	char *reply_headers;  	char *reply_body;  	int body_size;          /* The number of bytes in reply_body. */ -	int finished;           /* Set to non-0 if the request was completed +	/* int finished;           Set to non-0 if the request was completed  	                           successfully. */  	int redir_ttl;          /* You can set it to 0 if you don't want  	                           http_client to follow them. */ @@ -729,10 +729,10 @@ char **split_command_parts( char *command )  	return cmd;  } -char *get_rfc822_header( char *text, char *header, int len ) +char *get_rfc822_header( const char *text, const char *header, int len )  {  	int hlen = strlen( header ), i; -	char *ret; +	const char *ret;  	if( text == NULL )  		return NULL; @@ -67,6 +67,6 @@ G_MODULE_EXPORT char *word_wrap( const char *msg, int line_len );  G_MODULE_EXPORT gboolean ssl_sockerr_again( void *ssl );  G_MODULE_EXPORT int md5_verify_password( char *password, char *hash );  G_MODULE_EXPORT char **split_command_parts( char *command ); -G_MODULE_EXPORT char *get_rfc822_header( char *text, char *header, int len ); +G_MODULE_EXPORT char *get_rfc822_header( const char *text, const char *header, int len );  #endif | 
