summaryrefslogtreecommitdiff
path: root/src/tools/net
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/net')
-rw-r--r--src/tools/net/HttpClient.cpp67
-rw-r--r--src/tools/net/HttpParser.cpp204
-rw-r--r--src/tools/net/TgLongPoll.cpp43
-rw-r--r--src/tools/net/Url.cpp85
4 files changed, 0 insertions, 399 deletions
diff --git a/src/tools/net/HttpClient.cpp b/src/tools/net/HttpClient.cpp
deleted file mode 100644
index b9813ad..0000000
--- a/src/tools/net/HttpClient.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2015 Oleg Morozenkov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include "tgbot/net/HttpClient.h"
-
-#include <boost/asio/ssl.hpp>
-
-using namespace std;
-using namespace boost::asio;
-using namespace boost::asio::ip;
-using namespace boost::asio::local;
-
-namespace TgBot {
-
-HttpClient& HttpClient::getInstance() {
- static HttpClient result;
- return result;
-}
-
-string HttpClient::makeRequest(const Url& url, const vector<HttpReqArg>& args) {
- ssl::context context(ssl::context::sslv23);
- context.set_default_verify_paths();
-
- ssl::stream<tcp::socket> socket(_ioService, context);
- tcp::resolver resolver(_ioService);
- tcp::resolver::query query(url.host, url.protocol);
-
- connect(socket.lowest_layer(), resolver.resolve(query));
-
- socket.set_verify_mode(ssl::verify_none);
- socket.set_verify_callback(ssl::rfc2818_verification(url.host));
- socket.handshake(ssl::stream<tcp::socket>::client);
-
- string requestText = HttpParser::getInstance().generateRequest(url, args, false);
- write(socket, buffer(requestText.c_str(), requestText.length()));
-
- string response;
- char buff[1024];
- boost::system::error_code error;
- while (!error) {
- size_t bytes = read(socket, buffer(buff), error);
- response += string(buff, bytes);
- }
-
- return HttpParser::getInstance().parseResponse(response);
-}
-
-}
diff --git a/src/tools/net/HttpParser.cpp b/src/tools/net/HttpParser.cpp
deleted file mode 100644
index a2d9108..0000000
--- a/src/tools/net/HttpParser.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (c) 2015 Oleg Morozenkov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include "tgbot/net/HttpParser.h"
-
-#include <boost/algorithm/string.hpp>
-
-#include "tgbot/tools/StringTools.h"
-
-using namespace std;
-using namespace boost;
-
-namespace TgBot {
-
-HttpParser& HttpParser::getInstance() {
- static HttpParser result;
- return result;
-}
-
-string HttpParser::generateRequest(const Url& url, const vector<HttpReqArg>& args, bool isKeepAlive) {
- string result;
- if (args.empty()) {
- result += "GET ";
- } else {
- result += "POST ";
- }
- result += url.path;
- result += url.query.empty() ? "" : "?" + url.query;
- result += " HTTP/1.1\r\n";
- result += "Host: ";
- result += url.host;
- result += "\r\nConnection: ";
- if (isKeepAlive) {
- result += "keep-alive";
- } else {
- result += "close";
- }
- result += "\r\n";
- if (args.empty()) {
- result += "\r\n";
- } else {
- string requestData;
-
- string bondary = generateMultipartBoundary(args);
- if (bondary.empty()) {
- result += "Content-Type: application/x-www-form-urlencoded\r\n";
- requestData = generateWwwFormUrlencoded(args);
- } else {
- result += "Content-Type: multipart/form-data; boundary=";
- result += bondary;
- result += "\r\n";
- requestData = generateMultipartFormData(args, bondary);
- }
-
- result += "Content-Length: ";
- result += lexical_cast<string>(requestData.length());
- result += "\r\n\r\n";
- result += requestData;
- }
- return result;
-}
-
-string HttpParser::generateMultipartFormData(const vector<HttpReqArg>& args, const string& bondary) {
- string result;
- for (const HttpReqArg& item : args) {
- result += "--";
- result += bondary;
- result += "\r\nContent-Disposition: form-data; name=\"";
- result += item.name;
- result += "\"\r\n";
- if (item.isFile) {
- result += "Content-Type: ";
- result += item.mimeType;
- result += "\r\n";
- }
- result += "\r\n";
- result += item.value;
- result += "\r\n";
- }
- return result;
-}
-
-string HttpParser::generateMultipartBoundary(const vector<HttpReqArg>& args) {
- string result;
- srand((unsigned int) time(nullptr));
- for (const HttpReqArg& item : args) {
- if (item.isFile) {
- while (result.empty() || item.value.find(result) != item.value.npos) {
- result += StringTools::generateRandomString(4);
- }
- }
- }
- return result;
-}
-
-string HttpParser::generateWwwFormUrlencoded(const vector<HttpReqArg>& args) {
- string result;
-
- bool firstRun = true;
- for (const HttpReqArg& item : args) {
- if (firstRun) {
- firstRun = false;
- } else {
- result += '&';
- }
- result += StringTools::urlEncode(item.name);
- result += '=';
- result += StringTools::urlEncode(item.value);
- }
-
- return result;
-}
-
-string HttpParser::generateResponse(const string& data, const string& mimeType, unsigned short statusCode, const string& statusStr, bool isKeepAlive) {
- string result;
- result += "HTTP/1.1 ";
- result += lexical_cast<string>(statusCode);
- result += ' ';
- result += statusStr;
- result += "\r\nContent-Type: ";
- result += mimeType;
- result += "\r\nContent-Length: ";
- result += lexical_cast<string>(data.length());
- result += "\r\n\r\n";
- result += data;
- return result;
-}
-
-string HttpParser::parseHttp(bool isRequest, const string& data, map<string, string>& headers) {
- bool onlyNewLineChar = false;
- size_t headerEnd = data.find("\r\n\r\n");
- if (headerEnd == data.npos) {
- headerEnd = data.find("\n\n");
- if (headerEnd != data.npos) {
- onlyNewLineChar = true;
- headerEnd += 2;
- }
- } else {
- headerEnd += 4;
- }
-
- size_t lineStart = 0;
- size_t lineEnd = 0;
- size_t lineSepPos = 0;
- size_t lastLineEnd = data.npos;
- while (lastLineEnd != lineEnd) {
- lastLineEnd = lineEnd;
- if (lineEnd == 0) {
- if (isRequest) {
- lineSepPos = data.find(' ');
- lineEnd = data.find(onlyNewLineChar ? "\n" : "\r\n");
- headers["method"] = data.substr(0, lineSepPos);
- headers["path"] = data.substr(lineSepPos + 1, data.find(' ', lineSepPos + 1) - lineSepPos - 1);
- } else {
- lineSepPos = data.find(' ');
- lineEnd = data.find(onlyNewLineChar ? "\n" : "\r\n");
- headers["status"] = data.substr(lineSepPos + 1, data.find(' ', lineSepPos + 1) - lineSepPos - 1);
- }
- } else {
- lineStart = lineEnd;
- lineStart += onlyNewLineChar ? 1 : 2;
- lineEnd = data.find(onlyNewLineChar ? "\n" : "\r\n", lineStart);
- lineSepPos = data.find(':', lineStart);
- if (lineEnd >= headerEnd || lastLineEnd == lineEnd || lineSepPos >= headerEnd) {
- break;
- }
- headers[to_lower_copy(data.substr(lineStart, lineSepPos - lineStart))] = trim_copy(data.substr(lineSepPos + 1, lineEnd - lineSepPos - 1));
- }
- }
-
- return headerEnd == data.npos ? "" : data.substr(headerEnd);
-}
-
-string HttpParser::parseHttp(bool isRequest, const string& data) {
- size_t headerEnd = data.find("\r\n\r\n");
- if (headerEnd == data.npos) {
- headerEnd = data.find("\n\n");
- }
- if (headerEnd == data.npos) {
- headerEnd = 0;
- }
- return data.substr(headerEnd);
-}
-
-}
diff --git a/src/tools/net/TgLongPoll.cpp b/src/tools/net/TgLongPoll.cpp
deleted file mode 100644
index 91bf058..0000000
--- a/src/tools/net/TgLongPoll.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2015 Oleg Morozenkov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include "tgbot/net/TgLongPoll.h"
-
-namespace TgBot {
-
-TgLongPoll::TgLongPoll(const Api* api, const EventHandler* eventHandler) : _api(api), _eventHandler(eventHandler) {
-}
-
-TgLongPoll::TgLongPoll(const Bot& bot) : TgLongPoll(&bot.getApi(), &bot.getEventHandler()) {
-}
-
-void TgLongPoll::start() {
- std::vector<Update::Ptr> updates = _api->getUpdates(_lastUpdateId, 100, 60);
- for (Update::Ptr& item : updates) {
- if (item->updateId >= _lastUpdateId) {
- _lastUpdateId = item->updateId + 1;
- }
- _eventHandler->handleUpdate(item);
- }
-}
-
-}
diff --git a/src/tools/net/Url.cpp b/src/tools/net/Url.cpp
deleted file mode 100644
index 44d9089..0000000
--- a/src/tools/net/Url.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2015 Oleg Morozenkov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include "tgbot/net/Url.h"
-
-#include "tgbot/tools/StringTools.h"
-
-using namespace std;
-
-namespace TgBot {
-
-Url::Url(const string& url) {
- bool isProtocolParsed = false;
- bool isHostParsed = false;
- bool isPathParsed = false;
- bool isQueryParsed = false;
-
- for (size_t i = 0, count = url.length(); i < count; ++i) {
- char c = url[i];
-
- if (!isProtocolParsed) {
- if (c == ':') {
- isProtocolParsed = true;
- i += 2;
- } else {
- protocol += c;
- }
- } else if (!isHostParsed) {
- if (c == '/') {
- isHostParsed = true;
- path += '/';
- } else if (c == '?') {
- isHostParsed = isPathParsed = true;
- path += '/';
- } else if (c == '#') {
- isHostParsed = isPathParsed = isQueryParsed = true;
- path += '/';
- } else {
- host += c;
- }
- } else if (!isPathParsed) {
- if (c == '?') {
- isPathParsed = true;
- } else if (c == '#') {
- isPathParsed = isQueryParsed = true;
- } else {
- path += c;
- }
- } else if (!isQueryParsed) {
- if (c == '#') {
- isQueryParsed = true;
- } else {
- query += c;
- }
- } else {
- fragment += c;
- }
- }
-
- host = StringTools::urlEncode(host, ".");
- path = StringTools::urlEncode(path, "/");
- query = StringTools::urlEncode(query, "&");
- fragment = StringTools::urlEncode(fragment);
-}
-
-}