1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-02-07 23:14:41 +00:00

(rpc) more robust `deflate' wrangling, possibly fixing ticket #1319

This commit is contained in:
Charles Kerr 2008-10-03 17:38:14 +00:00
parent 1716f3c55d
commit 4f5a6de98d

View file

@ -209,40 +209,50 @@ mimetype_guess( const char * path )
} }
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
static void static int
compress_evbuf( struct evbuffer * evbuf ) compress_evbuf( struct evbuffer * evbuf )
{ {
static struct evbuffer * tmp; int err = 0;
static z_stream stream; struct evbuffer * out;
static unsigned char buffer[2048]; static z_stream stream;
if( !tmp ) stream.zalloc = Z_NULL;
{ stream.zfree = Z_NULL;
tmp = evbuffer_new( ); stream.opaque = Z_NULL;
deflateInit( &stream, Z_BEST_COMPRESSION ); deflateInit( &stream, Z_DEFAULT_COMPRESSION );
}
deflateReset( &stream );
stream.next_in = EVBUFFER_DATA( evbuf ); stream.next_in = EVBUFFER_DATA( evbuf );
stream.avail_in = EVBUFFER_LENGTH( evbuf ); stream.avail_in = EVBUFFER_LENGTH( evbuf );
out = evbuffer_new( );
do while( !err ) {
{ unsigned char buf[1024];
stream.next_out = buffer; int state;
stream.avail_out = sizeof( buffer ); stream.next_out = buf;
if( deflate( &stream, Z_FULL_FLUSH ) == Z_OK ) stream.avail_out = sizeof( buf );
evbuffer_add( tmp, buffer, sizeof( buffer ) - stream.avail_out ); state = deflate( &stream, Z_FINISH );
else if( ( state != Z_OK ) && ( state != Z_STREAM_END ) ) {
tr_nerr( MY_NAME, _( "Error deflating file: %s" ), zError( err ) );
err = state;
break;
}
evbuffer_add( out, buf, sizeof(buf) - stream.avail_out );
if( state == Z_STREAM_END )
break; break;
} }
while( stream.avail_out == 0 );
/*fprintf( stderr, "deflated response from %zu to %zu bytes\n", EVBUFFER_LENGTH( if( !err ) {
evbuf ), EVBUFFER_LENGTH( tmp ) );*/ fprintf( stderr, "deflated response from %zu bytes to %zu\n",
evbuffer_drain( evbuf, EVBUFFER_LENGTH( evbuf ) ); EVBUFFER_LENGTH( evbuf ),
evbuffer_add_buffer( evbuf, tmp ); EVBUFFER_LENGTH( out ) );
evbuffer_drain( evbuf, EVBUFFER_LENGTH( evbuf ) );
evbuffer_add_buffer( evbuf, out );
}
deflateEnd( &stream );
evbuffer_free( out );
return err;
} }
#endif #endif
static void static void
@ -254,12 +264,8 @@ maybe_deflate_response( struct evhttp_request * req,
"Accept-Encoding" ); "Accept-Encoding" );
const int do_deflate = accept_encoding && strstr( accept_encoding, const int do_deflate = accept_encoding && strstr( accept_encoding,
"deflate" ); "deflate" );
if( do_deflate ) if( do_deflate && !compress_evbuf( response ) )
{ evhttp_add_header( req->output_headers, "Content-Encoding", "deflate" );
evhttp_add_header( req->output_headers, "Content-Encoding",
"deflate" );
compress_evbuf( response );
}
#endif #endif
} }