Ignore:
Timestamp:
Dec 20, 2010, 2:07:51 AM (11 years ago)
Author:
charles
Message:

(trunk) #3836 "libevent2 support" -- bump libevent2 requirement to 2.0.10. This will break the Mac build for a minute intil BMW applies his Mac patch

File:
1 edited

Legend:

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

    r11524 r11548  
    3131#include "bencode.h"
    3232#include "crypto.h"
     33#include "fdlimit.h"
    3334#include "list.h"
    3435#include "net.h"
     
    156157static void
    157158extract_parts_from_multipart( const struct evkeyvalq * headers,
    158                               const struct evbuffer * body,
     159                              struct evbuffer * body,
    159160                              tr_ptrArray * setme_parts )
    160161{
    161162    const char * content_type = evhttp_find_header( headers, "Content-Type" );
    162163    const char * in = (const char*) EVBUFFER_DATA( body );
    163     size_t inlen = EVBUFFER_LENGTH( body );
     164    size_t inlen = evbuffer_get_length( body );
    164165
    165166    const char * boundary_key = "boundary=";
     
    278279                tr_rpc_request_exec_json( server->session,
    279280                                          EVBUFFER_DATA( json ),
    280                                           EVBUFFER_LENGTH( json ),
     281                                          evbuffer_get_length( json ),
    281282                                          NULL, NULL );
    282283                evbuffer_free( json );
     
    328329
    329330static void
    330 add_response( struct evhttp_request * req,
    331               struct tr_rpc_server *  server,
    332               struct evbuffer *       out,
    333               const void *            content,
    334               size_t                  content_len )
     331add_response( struct evhttp_request * req, struct tr_rpc_server * server,
     332              struct evbuffer * out, struct evbuffer * content )
    335333{
    336334#ifndef HAVE_ZLIB
    337     evbuffer_add( out, content, content_len );
     335    evbuffer_add_buffer( out, content );
    338336#else
    339337    const char * key = "Accept-Encoding";
     
    343341    if( !do_compress )
    344342    {
    345         evbuffer_add( out, content, content_len );
     343        evbuffer_add_buffer( out, content );
    346344    }
    347345    else
    348346    {
    349347        int state;
    350 
    351         /* FIXME(libevent2): this won't compile under libevent2.
    352            but we can use evbuffer_reserve_space() + evbuffer_commit_space() instead */
     348        struct evbuffer_iovec iovec[1];
     349        void * content_ptr = evbuffer_pullup( content, -1 );
     350        const size_t content_len = evbuffer_get_length( content );
    353351
    354352        if( !server->isStreamInitialized )
     
    371369        }
    372370
    373         server->stream.next_in = (Bytef*) content;
     371        server->stream.next_in = content_ptr;
    374372        server->stream.avail_in = content_len;
    375373
     
    377375         * we won't use the deflated data if it's longer than the raw data,
    378376         * so it's okay to let deflate() run out of output buffer space */
    379         evbuffer_expand( out, content_len );
    380         server->stream.next_out = EVBUFFER_DATA( out );
    381         server->stream.avail_out = content_len;
    382 
     377        evbuffer_reserve_space( out, content_len, iovec, 1 );
     378        server->stream.next_out = iovec[0].iov_base;
     379        server->stream.avail_out = iovec[0].iov_len;
    383380        state = deflate( &server->stream, Z_FINISH );
    384381
    385382        if( state == Z_STREAM_END )
    386383        {
    387             EVBUFFER_LENGTH( out ) = content_len - server->stream.avail_out;
     384            iovec[0].iov_len -= server->stream.avail_out;
    388385
    389386#if 0
    390387            fprintf( stderr, "compressed response is %.2f of original (raw==%zu bytes; compressed==%zu)\n",
    391                              (double)EVBUFFER_LENGTH(out)/content_len,
    392                              content_len, EVBUFFER_LENGTH(out) );
     388                             (double)evbuffer_get_length(out)/content_len,
     389                             content_len, evbuffer_get_length(out) );
    393390#endif
    394391            evhttp_add_header( req->output_headers,
     
    397394        else
    398395        {
    399             evbuffer_drain( out, EVBUFFER_LENGTH( out ) );
    400             evbuffer_add( out, content, content_len );
    401         }
    402 
     396            memcpy( iovec[0].iov_base, content_ptr, content_len );
     397            iovec[0].iov_len = content_len;
     398        }
     399
     400        evbuffer_commit_space( out, iovec, 1 );
    403401        deflateReset( &server->stream );
    404402    }
     
    429427    else
    430428    {
    431         size_t content_len;
    432         uint8_t * content;
     429        void * file;
     430        size_t file_len;
     431        struct evbuffer * content = evbuffer_new( );
    433432        const int error = errno;
    434433
    435434        errno = 0;
    436         content_len = 0;
    437         content = tr_loadFile( filename, &content_len );
     435        file_len = 0;
     436        file = tr_loadFile( filename, &file_len );
     437        content = evbuffer_new( );
     438        evbuffer_add_reference( content, file, file_len, evbuffer_ref_cleanup_tr_free, file );
    438439
    439440        if( errno )
     
    453454            add_time_header( req->output_headers, "Date", now );
    454455            add_time_header( req->output_headers, "Expires", now+(24*60*60) );
    455             add_response( req, server, out, content, content_len );
     456            add_response( req, server, out, content );
    456457            evhttp_send_reply( req, HTTP_OK, "OK", out );
    457458
    458459            evbuffer_free( out );
    459             tr_free( content );
    460         }
     460        }
     461
     462        evbuffer_free( content );
    461463    }
    462464}
     
    513515};
    514516
    515 /* FIXME(libevent2): make "response" an evbuffer and remove response_len */
    516517static void
    517518rpc_response_func( tr_session      * session UNUSED,
    518                    const char      * response,
    519                    size_t            response_len,
     519                   struct evbuffer * response,
    520520                   void            * user_data )
    521521{
     
    523523    struct evbuffer * buf = evbuffer_new( );
    524524
    525     add_response( data->req, data->server, buf, response, response_len );
     525    add_response( data->req, data->server, buf, response );
    526526    evhttp_add_header( data->req->output_headers,
    527527                           "Content-Type", "application/json; charset=UTF-8" );
     
    552552        tr_rpc_request_exec_json( server->session,
    553553                                  EVBUFFER_DATA( req->input_buffer ),
    554                                   EVBUFFER_LENGTH( req->input_buffer ),
     554                                  evbuffer_get_length( req->input_buffer ),
    555555                                  rpc_response_func, data );
    556556    }
Note: See TracChangeset for help on using the changeset viewer.