Ignore:
Timestamp:
Jan 18, 2009, 3:24:26 PM (13 years ago)
Author:
charles
Message:

(trunk libT) In RPC, add general support for nonblocking methods, and specific support for adding a torrent via its URL and fetching it via curl without blocking.

File:
1 edited

Legend:

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

    r7706 r7744  
    177177                                                  EVBUFFER_DATA( json ),
    178178                                                  EVBUFFER_LENGTH( json ),
    179                                                   NULL );
     179                                                  NULL, NULL );
    180180
    181181                        tr_releaseBuffer( json );
     
    375375}
    376376
     377struct rpc_response_data
     378{
     379    struct evhttp_request * req;
     380    struct tr_rpc_server  * server;
     381};
     382
     383static void
     384rpc_response_func( tr_session      * session UNUSED,
     385                   const char      * response,
     386                   size_t            response_len,
     387                   void            * user_data )
     388{
     389    struct rpc_response_data * data = user_data;
     390    struct evbuffer * buf = tr_getBuffer( );
     391
     392    add_response( data->req, data->server, buf, response, response_len );
     393    evhttp_add_header( data->req->output_headers,
     394                           "Content-Type", "application/json; charset=UTF-8" );
     395    evhttp_send_reply( data->req, HTTP_OK, "OK", buf );
     396
     397    tr_releaseBuffer( buf );
     398    tr_free( data );
     399}
     400
     401
    377402static void
    378403handle_rpc( struct evhttp_request * req,
    379404            struct tr_rpc_server  * server )
    380405{
    381     struct evbuffer * response = tr_getBuffer( );
    382 
     406    struct rpc_response_data * data = tr_new0( struct rpc_response_data, 1 );
     407
     408    data->req = req;
     409    data->server = server;
     410   
    383411    if( req->type == EVHTTP_REQ_GET )
    384412    {
    385413        const char * q;
    386414        if( ( q = strchr( req->uri, '?' ) ) )
    387             tr_rpc_request_exec_uri( server->session, q + 1, strlen( q + 1 ), response );
     415            tr_rpc_request_exec_uri( server->session, q+1, -1, rpc_response_func, data );
    388416    }
    389417    else if( req->type == EVHTTP_REQ_POST )
     
    392420                                  EVBUFFER_DATA( req->input_buffer ),
    393421                                  EVBUFFER_LENGTH( req->input_buffer ),
    394                                   response );
    395     }
    396 
    397     {
    398         struct evbuffer * buf = tr_getBuffer( );
    399         add_response( req, server, buf,
    400                       EVBUFFER_DATA( response ),
    401                       EVBUFFER_LENGTH( response ) );
    402         evhttp_add_header( req->output_headers, "Content-Type",
    403                                                 "application/json; charset=UTF-8" );
    404         evhttp_send_reply( req, HTTP_OK, "OK", buf );
    405         tr_releaseBuffer( buf );
    406     }
    407 
    408     /* cleanup */
    409     tr_releaseBuffer( response );
     422                                  rpc_response_func, data );
     423    }
     424
    410425}
    411426
Note: See TracChangeset for help on using the changeset viewer.