diff --git a/src/base/CMakeLists.txt b/src/base/CMakeLists.txt index 74d02ba10..17d01fb0b 100644 --- a/src/base/CMakeLists.txt +++ b/src/base/CMakeLists.txt @@ -47,6 +47,7 @@ rss/rss_session.h search/searchdownloadhandler.h search/searchhandler.h search/searchpluginmanager.h +utils/bytearray.h utils/fs.h utils/gzip.h utils/misc.h @@ -114,6 +115,7 @@ rss/rss_session.cpp search/searchdownloadhandler.cpp search/searchhandler.cpp search/searchpluginmanager.cpp +utils/bytearray.cpp utils/fs.cpp utils/gzip.cpp utils/misc.cpp diff --git a/src/base/base.pri b/src/base/base.pri index c89da2dbd..c59ae21bc 100644 --- a/src/base/base.pri +++ b/src/base/base.pri @@ -62,6 +62,7 @@ HEADERS += \ $$PWD/tristatebool.h \ $$PWD/types.h \ $$PWD/unicodestrings.h \ + $$PWD/utils/bytearray.h \ $$PWD/utils/fs.h \ $$PWD/utils/gzip.h \ $$PWD/utils/misc.h \ @@ -124,6 +125,7 @@ SOURCES += \ $$PWD/torrentfileguard.cpp \ $$PWD/torrentfilter.cpp \ $$PWD/tristatebool.cpp \ + $$PWD/utils/bytearray.cpp \ $$PWD/utils/fs.cpp \ $$PWD/utils/gzip.cpp \ $$PWD/utils/misc.cpp \ diff --git a/src/base/http/requestparser.cpp b/src/base/http/requestparser.cpp index 269885292..35645f74b 100644 --- a/src/base/http/requestparser.cpp +++ b/src/base/http/requestparser.cpp @@ -36,6 +36,7 @@ #include #include +#include "base/utils/bytearray.h" #include "base/utils/string.h" using namespace Http; @@ -45,6 +46,8 @@ namespace { const QByteArray EOH = QByteArray(CRLF).repeated(2); + using namespace Utils::ByteArray; + const QByteArray viewWithoutEndingWith(const QByteArray &in, const QByteArray &str) { if (in.endsWith(str)) @@ -52,46 +55,6 @@ namespace return in; } - QList splitToViews(const QByteArray &in, const QByteArray &sep, const QString::SplitBehavior behavior = QString::KeepEmptyParts) - { - // mimic QString::split(sep, behavior) - - if (sep.isEmpty()) - return {in}; - - QList ret; - - int head = 0; - while (head < in.size()) { - int end = in.indexOf(sep, head); - if (end < 0) - end = in.size(); - - // omit empty parts - const QByteArray part = QByteArray::fromRawData((in.constData() + head), (end - head)); - if (!part.isEmpty() || (behavior == QString::KeepEmptyParts)) - ret += part; - - head = end + sep.size(); - } - - return ret; - } - - const QByteArray viewMid(const QByteArray &in, const int pos, const int len = -1) - { - // mimic QByteArray::mid(pos, len) but instead of returning a full-copy, - // we only return a partial view - - if ((pos < 0) || (pos >= in.size()) || (len == 0)) - return {}; - - const int validLen = ((len < 0) || (pos + len) >= in.size()) - ? in.size() - pos - : len; - return QByteArray::fromRawData(in.constData() + pos, validLen); - } - bool parseHeaderLine(const QString &line, QStringMap &out) { // [rfc7230] 3.2. Header Fields @@ -152,7 +115,7 @@ RequestParser::ParseResult RequestParser::doParse(const QByteArray &data) } if (contentLength > 0) { - const QByteArray httpBodyView = viewMid(data, headerLength, contentLength); + const QByteArray httpBodyView = midView(data, headerLength, contentLength); if (httpBodyView.length() < contentLength) { qDebug() << Q_FUNC_INFO << "incomplete request"; return {ParseStatus::Incomplete, Request(), 0}; diff --git a/src/base/utils/bytearray.cpp b/src/base/utils/bytearray.cpp new file mode 100644 index 000000000..25603646f --- /dev/null +++ b/src/base/utils/bytearray.cpp @@ -0,0 +1,65 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2018 Mike Tzou (Chocobo1) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#include "bytearray.h" +#include + +QList Utils::ByteArray::splitToViews(const QByteArray &in, const QByteArray &sep, const QString::SplitBehavior behavior) +{ + if (sep.isEmpty()) + return {in}; + + QList ret; + + int head = 0; + while (head < in.size()) { + int end = in.indexOf(sep, head); + if (end < 0) + end = in.size(); + + // omit empty parts + const QByteArray part = QByteArray::fromRawData((in.constData() + head), (end - head)); + if (!part.isEmpty() || (behavior == QString::KeepEmptyParts)) + ret += part; + + head = end + sep.size(); + } + + return ret; +} + +const QByteArray Utils::ByteArray::midView(const QByteArray &in, const int pos, const int len) +{ + if ((pos < 0) || (pos >= in.size()) || (len == 0)) + return {}; + + const int validLen = ((len < 0) || (pos + len) >= in.size()) + ? in.size() - pos + : len; + return QByteArray::fromRawData(in.constData() + pos, validLen); +} diff --git a/src/base/utils/bytearray.h b/src/base/utils/bytearray.h new file mode 100644 index 000000000..e0f46abf3 --- /dev/null +++ b/src/base/utils/bytearray.h @@ -0,0 +1,45 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2018 Mike Tzou (Chocobo1) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#pragma once + +#include +#include + +namespace Utils +{ + namespace ByteArray + { + // Mimic QString::split(sep, behavior) + QList splitToViews(const QByteArray &in, const QByteArray &sep, const QString::SplitBehavior behavior = QString::KeepEmptyParts); + + // Mimic QByteArray::mid(pos, len) but instead of returning a full-copy, + // we only return a partial view + const QByteArray midView(const QByteArray &in, const int pos, const int len = -1); + } +}