aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/http_client.c17
-rw-r--r--lib/http_client.h2
-rw-r--r--lib/misc.c4
-rw-r--r--lib/misc.h2
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. */
diff --git a/lib/misc.c b/lib/misc.c
index a7065757..485406a6 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -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;
diff --git a/lib/misc.h b/lib/misc.h
index 7e03de2d..e2ec0274 100644
--- a/lib/misc.h
+++ b/lib/misc.h
@@ -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