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:
parent
1716f3c55d
commit
4f5a6de98d
1 changed files with 35 additions and 29 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue