diff options
author | leo <leo@yandex-team.ru> | 2022-02-10 16:46:40 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:46:40 +0300 |
commit | 99609724f661f7e21d1cb08e8d80e87c3632fdb3 (patch) | |
tree | 49e222ea1c5804306084bb3ae065bb702625360f /library/cpp/http/fetch/httpfetcher.h | |
parent | 980edcd3304699edf9d4e4d6a656e585028e2a72 (diff) | |
download | ydb-99609724f661f7e21d1cb08e8d80e87c3632fdb3.tar.gz |
Restoring authorship annotation for <leo@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/http/fetch/httpfetcher.h')
-rw-r--r-- | library/cpp/http/fetch/httpfetcher.h | 212 |
1 files changed, 106 insertions, 106 deletions
diff --git a/library/cpp/http/fetch/httpfetcher.h b/library/cpp/http/fetch/httpfetcher.h index 1c5b94a678..7fc251afd2 100644 --- a/library/cpp/http/fetch/httpfetcher.h +++ b/library/cpp/http/fetch/httpfetcher.h @@ -1,22 +1,22 @@ #pragma once - -#ifdef _MSC_VER + +#ifdef _MSC_VER #include <io.h> -#endif - +#endif + #include <library/cpp/http/misc/httpdate.h> - -#include "httpagent.h" -#include "httpparser.h" - -struct TFakeBackup { + +#include "httpagent.h" +#include "httpparser.h" + +struct TFakeBackup { int Write(void* /*buf*/, size_t /*size*/) { return 0; } -}; - -template <size_t bufsize = 5000> -struct TFakeAlloc { +}; + +template <size_t bufsize = 5000> +struct TFakeAlloc { void Shrink(void* /*buf*/, size_t /*size*/) { } void* Grab(size_t /*min*/, size_t* real) { @@ -24,17 +24,17 @@ struct TFakeAlloc { return buf; } char buf[bufsize]; -}; - +}; + template <typename TAlloc = TFakeAlloc<>, typename TCheck = TFakeCheck<>, - typename TWriter = TFakeBackup, + typename TWriter = TFakeBackup, typename TAgent = THttpAgent<>> class THttpFetcher: public THttpParser<TCheck>, public TAlloc, public TWriter, public TAgent { -public: - static const size_t TCP_MIN = 1500; - static int TerminateNow; - +public: + static const size_t TCP_MIN = 1500; + static int TerminateNow; + THttpFetcher() : THttpParser<TCheck>() , TAlloc() @@ -47,54 +47,54 @@ public: } int Fetch(THttpHeader* header, const char* path, const char* const* headers, int persistent, bool head_request = false) { - int ret = 0; - int fetcherr = 0; - - THttpParser<TCheck>::Init(header, head_request); + int ret = 0; + int fetcherr = 0; + + THttpParser<TCheck>::Init(header, head_request); const char* scheme = HttpUrlSchemeKindToString((THttpURL::TSchemeKind)TAgent::GetScheme()); size_t schemelen = strlen(scheme); - if (*path == '/') { + if (*path == '/') { header->base = TStringBuf(scheme, schemelen); header->base += TStringBuf("://", 3); header->base += TStringBuf(TAgent::pHostBeg, TAgent::pHostEnd - TAgent::pHostBeg); header->base += path; - } else { + } else { if (strlen(path) >= FETCHER_URL_MAX) { header->error = HTTP_URL_TOO_LARGE; return 0; } header->base = path; - } - - if ((ret = TAgent::RequestGet(path, headers, persistent, head_request))) { - header->error = (i16)ret; - return 0; - } - - bool inheader = 1; + } + + if ((ret = TAgent::RequestGet(path, headers, persistent, head_request))) { + header->error = (i16)ret; + return 0; + } + + bool inheader = 1; void *bufptr = nullptr, *buf = nullptr, *parsebuf = nullptr; - ssize_t got; - size_t buffree = 0, bufsize = 0, buflen = 0; - size_t maxsize = TCheck::GetMaxHeaderSize(); - do { - if (buffree < TCP_MIN) { - if (buf) { - TAlloc::Shrink(buf, buflen - buffree); - if (TWriter::Write(buf, buflen - buffree) < 0) { + ssize_t got; + size_t buffree = 0, bufsize = 0, buflen = 0; + size_t maxsize = TCheck::GetMaxHeaderSize(); + do { + if (buffree < TCP_MIN) { + if (buf) { + TAlloc::Shrink(buf, buflen - buffree); + if (TWriter::Write(buf, buflen - buffree) < 0) { buf = nullptr; - ret = EIO; - break; - } - } - if (!(buf = TAlloc::Grab(TCP_MIN, &buflen))) { - ret = ENOMEM; - break; - } - bufptr = buf; - buffree = buflen; - } - if ((got = TAgent::read(bufptr, buffree)) < 0) { - fetcherr = errno; + ret = EIO; + break; + } + } + if (!(buf = TAlloc::Grab(TCP_MIN, &buflen))) { + ret = ENOMEM; + break; + } + bufptr = buf; + buffree = buflen; + } + if ((got = TAgent::read(bufptr, buffree)) < 0) { + fetcherr = errno; if (errno == EINTR) header->error = HTTP_INTERRUPTED; else if (errno == ETIMEDOUT) @@ -102,43 +102,43 @@ public: else header->error = HTTP_CONNECTION_LOST; - break; - } - - parsebuf = bufptr; - bufptr = (char*)bufptr + got; - bufsize += got; - buffree -= got; - - THttpParser<TCheck>::Parse(parsebuf, got); - - if (header->error) + break; + } + + parsebuf = bufptr; + bufptr = (char*)bufptr + got; + bufsize += got; + buffree -= got; + + THttpParser<TCheck>::Parse(parsebuf, got); + + if (header->error) break; //if ANY error ocurred we will stop download that file or will have unprognosed stream position until MAX size reached - - if (inheader && THttpParser<TCheck>::GetState() != THttpParser<TCheck>::hp_in_header) { - inheader = 0; - if (TCheck::Check(header)) - break; - if (header->header_size > (long)maxsize) { - header->error = HTTP_HEADER_TOO_LARGE; - break; - } + + if (inheader && THttpParser<TCheck>::GetState() != THttpParser<TCheck>::hp_in_header) { + inheader = 0; + if (TCheck::Check(header)) + break; + if (header->header_size > (long)maxsize) { + header->error = HTTP_HEADER_TOO_LARGE; + break; + } } if (!inheader) { - maxsize = TCheck::GetMaxBodySize(header); - } - if (header->http_status >= HTTP_EXTENDED) - break; - if (bufsize > maxsize) { - header->error = inheader ? HTTP_HEADER_TOO_LARGE : HTTP_BODY_TOO_LARGE; - break; - } - if (TerminateNow) { - header->error = HTTP_INTERRUPTED; - break; - } - } while (THttpParser<TCheck>::GetState() > THttpParser<TCheck>::hp_eof); - + maxsize = TCheck::GetMaxBodySize(header); + } + if (header->http_status >= HTTP_EXTENDED) + break; + if (bufsize > maxsize) { + header->error = inheader ? HTTP_HEADER_TOO_LARGE : HTTP_BODY_TOO_LARGE; + break; + } + if (TerminateNow) { + header->error = HTTP_INTERRUPTED; + break; + } + } while (THttpParser<TCheck>::GetState() > THttpParser<TCheck>::hp_eof); + i64 Adjustment = 0; if (!header->error) { if (header->transfer_chunked) { @@ -150,22 +150,22 @@ public: Adjustment = 0; } - if (buf) { + if (buf) { TAlloc::Shrink(buf, buflen - buffree + Adjustment); - if (TWriter::Write(buf, buflen - buffree) < 0) - ret = EIO; - } - TCheck::CheckEndDoc(header); - if (ret || header->error || header->http_status >= HTTP_EXTENDED || header->connection_closed) { - TAgent::Disconnect(); - if (!fetcherr) - fetcherr = errno; - } - errno = fetcherr; - return ret; - } -}; - -template <typename TAlloc, typename TCheck, typename TWriter, typename TAgent> -int THttpFetcher<TAlloc, TCheck, TWriter, TAgent>::TerminateNow = 0; + if (TWriter::Write(buf, buflen - buffree) < 0) + ret = EIO; + } + TCheck::CheckEndDoc(header); + if (ret || header->error || header->http_status >= HTTP_EXTENDED || header->connection_closed) { + TAgent::Disconnect(); + if (!fetcherr) + fetcherr = errno; + } + errno = fetcherr; + return ret; + } +}; + +template <typename TAlloc, typename TCheck, typename TWriter, typename TAgent> +int THttpFetcher<TAlloc, TCheck, TWriter, TAgent>::TerminateNow = 0; |