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