Changeset 6867


Ignore:
Timestamp:
Oct 8, 2008, 1:33:19 PM (13 years ago)
Author:
charles
Message:

(rpc) better fix for #1330

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/rpc-server.c

    r6861 r6867  
    210210}
    211211
    212 #ifdef HAVE_LIBZ
    213 static int
    214 compress_response( struct evbuffer  * out,
    215                    const void       * content,
    216                    size_t             content_len )
    217 {
    218     int err = 0;
    219     z_stream stream;
    220 
    221     stream.zalloc = Z_NULL;
    222     stream.zfree = Z_NULL;
    223     stream.opaque = Z_NULL;
    224     deflateInit( &stream, Z_BEST_COMPRESSION );
    225 
    226     stream.next_in = (Bytef*) content;
    227     stream.avail_in = content_len;
    228 
    229     while( !err ) {
    230         unsigned char buf[1024];
    231         int state;
    232         stream.next_out = buf;
    233         stream.avail_out = sizeof( buf );
    234         state = deflate( &stream, Z_FINISH );
    235         if( ( state != Z_OK ) && ( state != Z_STREAM_END ) ) {
    236             tr_nerr( MY_NAME, _( "Error deflating file: %s" ), zError( err ) );
    237             err = state;
    238             break;
    239         }
    240         evbuffer_add( out, buf, sizeof(buf) - stream.avail_out );
    241         if( state == Z_STREAM_END )
    242             break;
    243     }
    244 
    245     /* if the deflated form is larger, then just use the original */
    246     if( !err && ( EVBUFFER_LENGTH( out ) >= content_len ) )
    247         err = -1;
    248 
    249     if( err )
    250         evbuffer_add( out, content, content_len );
    251     else
    252         tr_ninf( MY_NAME, "deflated response from %zu bytes to %zu",
    253                           content_len,
    254                           EVBUFFER_LENGTH( out ) );
    255 
    256     deflateEnd( &stream );
    257     return err;
    258 }
    259 #endif
    260 
    261212static void
    262213add_response( struct evhttp_request * req,
    263               struct evbuffer *       response,
     214              struct evbuffer *       out,
    264215              const void *            content,
    265216              size_t                  content_len )
    266217{
    267 #ifdef HAVE_LIBZ
    268     const char * accept_encoding = evhttp_find_header( req->input_headers,
    269                                                        "Accept-Encoding" );
    270     const int    do_deflate = accept_encoding && strstr( accept_encoding,
    271                                                          "deflate" );
    272     if( do_deflate && !compress_response( response, content, content_len ) )
    273         evhttp_add_header( req->output_headers, "Content-Encoding", "deflate" );
     218#ifndef HAVE_LIBZ
     219    evbuffer_add( out, content, content_len );
    274220#else
    275     evbuffer_add( response, content, content_len );
     221    const char * key = "Accept-Encoding";
     222    const char * encoding = evhttp_find_header( req->input_headers, key );
     223    const int do_deflate = encoding && strstr( encoding, "deflate" );
     224
     225    if( !do_deflate )
     226    {
     227        evbuffer_add( out, content, content_len );
     228    }
     229    else
     230    {
     231        int state;
     232        z_stream stream;
     233
     234        stream.zalloc = Z_NULL;
     235        stream.zfree = Z_NULL;
     236        stream.opaque = Z_NULL;
     237        deflateInit( &stream, Z_BEST_COMPRESSION );
     238
     239        stream.next_in = (Bytef*) content;
     240        stream.avail_in = content_len;
     241
     242        evbuffer_expand( out, content_len );
     243        stream.next_out = EVBUFFER_DATA( out );
     244        stream.avail_out = content_len;
     245
     246        state = deflate( &stream, Z_FINISH );
     247        if( state != Z_STREAM_END )
     248            evbuffer_add( out, content, content_len );
     249        else {
     250            EVBUFFER_LENGTH( out ) = content_len - stream.avail_out;
     251            tr_ninf( MY_NAME, _( "Deflated response from %zu bytes to %zu" ),
     252                              content_len,
     253                              EVBUFFER_LENGTH( out ) );
     254            evhttp_add_header( req->output_headers,
     255                               "Content-Encoding", "deflate" );
     256        }
     257
     258        deflateEnd( &stream );
     259    }
    276260#endif
    277261}
     
    347331            *pch = '\0';
    348332
    349         filename = *subpath
    350             ? tr_strdup_printf( "%s%s%s", clutchDir, TR_PATH_DELIMITER_STR, subpath )
    351             : tr_strdup_printf( "%s%s%s", clutchDir, TR_PATH_DELIMITER_STR, "index.html" );
     333        filename = tr_strdup_printf( "%s%s%s",
     334                       clutchDir,
     335                       TR_PATH_DELIMITER_STR,
     336                       subpath && *subpath ? subpath : ":index.html" );
    352337
    353338        serve_file( req, filename );
Note: See TracChangeset for help on using the changeset viewer.