Changeset 11896


Ignore:
Timestamp:
Feb 17, 2011, 2:26:24 AM (11 years ago)
Author:
jordan
Message:

(trunk) #4032 "Better error detection / reporting in http announces" -- added to trunk.

This patch adds two new flags to the callback function -- did_connect and did_timeout -- that are calculated inside of web.c using information from libcurl. This allows the announcer to detect timeouts more accurately and also to distinguish between unresponsive peers (which get the preexisting "Tracker did not respond" error message) and unconnectable peers (which get a new error message, "Could not connect to tracker").

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/cli/cli.c

    r11709 r11896  
    132132static void
    133133onTorrentFileDownloaded( tr_session   * session UNUSED,
     134                         tr_bool        did_connect UNUSED,
     135                         tr_bool        did_timeout UNUSED,
    134136                         long           response_code UNUSED,
    135137                         const void   * response,
  • trunk/gtk/favicon.c

    r11709 r11896  
    8282}
    8383
    84 static void favicon_web_done_cb( tr_session*, long, const void*, size_t, void* );
     84static void favicon_web_done_cb( tr_session*, tr_bool, tr_bool, long, const void*, size_t, void* );
    8585
    8686static gboolean
     
    130130static void
    131131favicon_web_done_cb( tr_session    * session UNUSED,
     132                     tr_bool         did_connect UNUSED,
     133                     tr_bool         did_timeout UNUSED,
    132134                     long            code UNUSED,
    133135                     const void    * data,
  • trunk/gtk/tr-core.c

    r11890 r11896  
    10561056    tr_ctor * ctor;
    10571057    char * url;
     1058
     1059    tr_bool did_connect;
     1060    tr_bool did_timeout;
    10581061    long response_code;
    10591062};
     
    10891092static void
    10901093onURLDone( tr_session   * session,
     1094           tr_bool        did_connect,
     1095           tr_bool        did_timeout,
    10911096           long           response_code,
    10921097           const void   * response,
     
    10961101    struct url_dialog_data * data = vdata;
    10971102
     1103    data->did_connect = did_connect;
     1104    data->did_timeout = did_timeout;
    10981105    data->response_code = response_code;
    10991106    data->ctor = tr_ctorNew( session );
  • trunk/libtransmission/announcer.c

    r11844 r11896  
    10371037static void
    10381038onAnnounceDone( tr_session   * session,
     1039                tr_bool        didConnect,
     1040                tr_bool        didTimeout,
    10391041                long           responseCode,
    10401042                const void   * response,
     
    10531055
    10541056        tier->lastAnnounceTime = now;
    1055         tier->lastAnnounceTimedOut = responseCode == 0;
     1057        tier->lastAnnounceTimedOut = didTimeout;
    10561058        tier->lastAnnounceSucceeded = FALSE;
    10571059        tier->isAnnouncing = FALSE;
     
    11061108            int interval;
    11071109
    1108             if( !responseCode )
    1109                 tr_strlcpy( tier->lastAnnounceStr,
    1110                             _( "Tracker did not respond" ),
     1110            if( !didConnect )
     1111                tr_strlcpy( tier->lastAnnounceStr, _( "Could not connect to tracker" ),
     1112                            sizeof( tier->lastAnnounceStr ) );
     1113            else if( !responseCode )
     1114                tr_strlcpy( tier->lastAnnounceStr, _( "Tracker did not respond" ),
    11111115                            sizeof( tier->lastAnnounceStr ) );
    11121116            else {
     
    13091313static void
    13101314onScrapeDone( tr_session   * session,
     1315              tr_bool        didConnect,
     1316              tr_bool        didTimeout,
    13111317              long           responseCode,
    13121318              const void   * response,
     
    13641370            /* %1$ld - http status code, such as 404
    13651371             * %2$s - human-readable explanation of the http status code */
    1366             if( !responseCode )
     1372            if( !didConnect )
     1373                tr_strlcpy( tier->lastScrapeStr, _( "Could not connect to tracker" ),
     1374                            sizeof( tier->lastScrapeStr ) );
     1375            else if( !responseCode )
    13671376                tr_strlcpy( tier->lastScrapeStr, _( "tracker did not respond" ),
    13681377                            sizeof( tier->lastScrapeStr ) );
     
    13741383
    13751384        tier->lastScrapeSucceeded = success;
    1376         tier->lastScrapeTimedOut = responseCode == 0;
     1385        tier->lastScrapeTimedOut = didTimeout;
    13771386    }
    13781387
  • trunk/libtransmission/rpcimpl.c

    r11890 r11896  
    10671067static void
    10681068portTested( tr_session       * session UNUSED,
     1069            tr_bool            did_connect UNUSED,
     1070            tr_bool            did_timeout UNUSED,
    10691071            long               response_code,
    10701072            const void       * response,
     
    11091111static void
    11101112gotNewBlocklist( tr_session       * session,
     1113                 tr_bool            did_connect UNUSED,
     1114                 tr_bool            did_timeout UNUSED,
    11111115                 long               response_code,
    11121116                 const void       * response,
     
    12531257static void
    12541258gotMetadataFromURL( tr_session       * session UNUSED,
     1259                    tr_bool            did_connect UNUSED,
     1260                    tr_bool            did_timeout UNUSED,
    12551261                    long               response_code,
    12561262                    const void       * response,
  • trunk/libtransmission/web.c

    r11709 r11896  
    7373{
    7474    long code;
     75    long timeout_secs;
     76    tr_bool did_connect;
     77    tr_bool did_timeout;
    7578    struct evbuffer * response;
    7679    struct evbuffer * freebuf;
     
    150153    const long verbose = getenv( "TR_CURL_VERBOSE" ) != NULL;
    151154    char * cookie_filename = tr_buildPath( s->configDir, "cookies.txt", NULL );
     155
     156    task->timeout_secs = getTimeoutFromURL( task );
    152157
    153158    curl_easy_setopt( e, CURLOPT_AUTOREFERER, 1L );
     
    164169    curl_easy_setopt( e, CURLOPT_SSL_VERIFYHOST, 0L );
    165170    curl_easy_setopt( e, CURLOPT_SSL_VERIFYPEER, 0L );
    166     curl_easy_setopt( e, CURLOPT_TIMEOUT, getTimeoutFromURL( task ) );
     171    curl_easy_setopt( e, CURLOPT_TIMEOUT, task->timeout_secs );
    167172    curl_easy_setopt( e, CURLOPT_URL, task->url );
    168173    curl_easy_setopt( e, CURLOPT_USERAGENT, TR_NAME "/" SHORT_VERSION_STRING );
     
    198203    if( task->done_func != NULL )
    199204        task->done_func( task->session,
     205                         task->did_connect,
     206                         task->did_timeout,
    200207                         task->code,
    201208                         evbuffer_pullup( task->response, -1 ),
     
    365372            if(( msg->msg == CURLMSG_DONE ) && ( msg->easy_handle != NULL ))
    366373            {
     374                double total_time;
    367375                struct tr_web_task * task;
     376                long req_bytes_sent;
    368377                CURL * e = msg->easy_handle;
    369378                curl_easy_getinfo( e, CURLINFO_PRIVATE, (void*)&task );
    370379                curl_easy_getinfo( e, CURLINFO_RESPONSE_CODE, &task->code );
     380                curl_easy_getinfo( e, CURLINFO_REQUEST_SIZE, &req_bytes_sent );
     381                curl_easy_getinfo( e, CURLINFO_TOTAL_TIME, &total_time );
     382                task->did_connect = task->code>0 || req_bytes_sent>0;
     383                task->did_timeout = !task->code && ( total_time >= task->timeout_secs );
    371384                curl_multi_remove_handle( multi, e );
    372385                curl_easy_cleanup( e );
  • trunk/libtransmission/web.h

    r11709 r11896  
    4444
    4545typedef void ( tr_web_done_func )( tr_session       * session,
     46                                   tr_bool            timeout_flag,
     47                                   tr_bool            did_connect_flag,
    4648                                   long               response_code,
    4749                                   const void       * response,
  • trunk/libtransmission/webseed.c

    r11820 r11896  
    197197static void
    198198web_response_func( tr_session    * session,
     199                   tr_bool         did_connect UNUSED,
     200                   tr_bool         did_timeout UNUSED,
    199201                   long            response_code,
    200202                   const void    * response UNUSED,
Note: See TracChangeset for help on using the changeset viewer.