Skip to content
Snippets Groups Projects
speedcheck.c 2.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • /***************************************************************************
    
     *                                  _   _ ____  _
     *  Project                     ___| | | |  _ \| |
     *                             / __| | | | |_) | |
     *                            | (__| |_| |  _ <| |___
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     *                             \___|\___/|_| \_\_____|
     *
    
     * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     *
    
     * This software is licensed as described in the file COPYING, which
     * you should have received as part of this distribution. The terms
     * are also available at http://curl.haxx.se/docs/copyright.html.
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     * You may opt to use, copy, modify, merge, publish, distribute and/or sell
     * copies of the Software, and permit persons to whom the Software is
    
     * furnished to do so, under the terms of the COPYING file.
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     *
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
     * KIND, either express or implied.
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     *
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     * $Id$
    
     ***************************************************************************/
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #include <stdio.h>
    
    #include <string.h>
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    #include <curl/curl.h>
    #include "urldata.h"
    #include "sendf.h"
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    #include "speedcheck.h"
    
    
    void Curl_speedinit(struct SessionHandle *data)
    
      memset(&data->state.keeps_speed, 0, sizeof(struct timeval));
    
    CURLcode Curl_speedcheck(struct SessionHandle *data,
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    {
    
      if((data->progress.current_speed >= 0) &&
    
         data->set.low_speed_time &&
         (Curl_tvlong(data->state.keeps_speed) != 0) &&
         (data->progress.current_speed < data->set.low_speed_limit)) {
    
        long howlong = Curl_tvdiff(now, data->state.keeps_speed);
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
        /* We are now below the "low speed limit". If we are below it
           for "low speed time" seconds we consider that enough reason
           to abort the download. */
    
        if( (howlong/1000) > data->set.low_speed_time) {
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
          /* we have been this slow for long enough, now die */
          failf(data,
    
                "Operation too slow. "
                "Less than %d bytes/sec transfered the last %d seconds",
                data->set.low_speed_limit,
                data->set.low_speed_time);
    
          return CURLE_OPERATION_TIMEOUTED;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
        }
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      }
      else {
        /* we keep up the required speed all right */
    
    
        if(data->set.low_speed_limit)
          /* if there is a low speed limit enabled, we set the expire timer to
             make this connection's speed get checked again no later than when
             this time is up */
          Curl_expire(data, data->set.low_speed_time*1000);
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      }
    
      return CURLE_OK;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    }