15ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen/*************************************************************************** 25ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * _ _ ____ _ 35ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * Project ___| | | | _ \| | 45ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * / __| | | | |_) | | 55ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * | (__| |_| | _ <| |___ 65ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * \___|\___/|_| \_\_____| 75ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al. 95ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 105ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is licensed as described in the file COPYING, which 115ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * you should have received as part of this distribution. The terms 12d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html. 135ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 145ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * You may opt to use, copy, modify, merge, publish, distribute and/or sell 155ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * copies of the Software, and permit persons to whom the Software is 165ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * furnished to do so, under the terms of the COPYING file. 175ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 185ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 195ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * KIND, either express or implied. 205ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen * 215ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen ***************************************************************************/ 225ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 23e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "curl_setup.h" 245ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 255ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include <curl/curl.h> 265ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "urldata.h" 275ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "sendf.h" 285ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "multiif.h" 295ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen#include "speedcheck.h" 305ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 31e3149cc1cf501b46caba8d47652ac90b95c78eacAlex Deymovoid Curl_speedinit(struct Curl_easy *data) 325ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 335ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen memset(&data->state.keeps_speed, 0, sizeof(struct timeval)); 345ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 355ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 36e3149cc1cf501b46caba8d47652ac90b95c78eacAlex DeymoCURLcode Curl_speedcheck(struct Curl_easy *data, 375ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen struct timeval now) 385ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen{ 395ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if((data->progress.current_speed >= 0) && 405ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen data->set.low_speed_time && 415ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen (Curl_tvlong(data->state.keeps_speed) != 0) && 425ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen (data->progress.current_speed < data->set.low_speed_limit)) { 435ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen long howlong = Curl_tvdiff(now, data->state.keeps_speed); 44e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET long nextcheck = (data->set.low_speed_time * 1000) - howlong; 455ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 465ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* We are now below the "low speed limit". If we are below it 475ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen for "low speed time" seconds we consider that enough reason 485ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen to abort the download. */ 49e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(nextcheck <= 0) { 505ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* we have been this slow for long enough, now die */ 515ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen failf(data, 525ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen "Operation too slow. " 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET "Less than %ld bytes/sec transferred the last %ld seconds", 545ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen data->set.low_speed_limit, 555ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen data->set.low_speed_time); 565ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return CURLE_OPERATION_TIMEDOUT; 575ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 58e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET else { 59e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET /* wait complete low_speed_time */ 60e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_expire_latest(data, nextcheck); 61e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 625ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 635ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen else { 645ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* we keep up the required speed all right */ 655ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen data->state.keeps_speed = now; 665ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen 675ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen if(data->set.low_speed_limit) 685ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen /* if there is a low speed limit enabled, we set the expire timer to 695ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen make this connection's speed get checked again no later than when 705ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen this time is up */ 71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET Curl_expire_latest(data, data->set.low_speed_time*1000); 725ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen } 735ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen return CURLE_OK; 745ab5018bf8f0e39957d264f33c3eeddd958ed5d8Kristian Monsen} 75