1 #include <samchon/library/HTTPLoader.hpp> 9 #include <boost/asio.hpp> 11 #include <samchon/library/Datetime.hpp> 12 #include <samchon/library/URLVariables.hpp> 13 #include <samchon/library/StringUtil.hpp> 21 void toClipboard(
const string &);
26 HTTPLoader::HTTPLoader(
int method)
28 this->method = method;
30 HTTPLoader::HTTPLoader(
const string &url,
int method)
39 void HTTPLoader::setURL(
const string &url)
43 void HTTPLoader::setMethod(
int method)
45 this->method = method;
48 auto HTTPLoader::getURL() const ->
string 52 auto HTTPLoader::getMethod() const ->
int 57 auto HTTPLoader::getCookie(
const string &host)
const ->
string 59 auto it = cookieMap.find(host);
61 if (it == cookieMap.end())
109 if (host.
find(
"://") != string::npos)
111 if (host.
find(
"/") != string::npos)
113 path =
"/" + host.
between(
"/").str();
119 size_t idx = path.find(
'?');
120 if (idx == string::npos)
121 path = URLVariables::encode(path);
124 string &front = path.substr(0, idx);
125 string &back = path.substr(idx + 1);
127 path = URLVariables::encode(front) +
"?" + back;
134 header = StringUtil::substitute
137 "GET {2}{3} HTTP/1.1\n" +
140 "Accept-Encoding: gzip, deflate\n" 142 "Connection: Keep-Alive\n" +
147 ((parameters.empty() ==
true)
149 :
"?" + parameters.toString()),
155 std::string ¶meterStr = parameters.toString();
157 header = StringUtil::substitute
160 "POST {2} HTTP/1.1\n" +
163 "Connection: Keep-Alive\n" +
169 "Content-Type: application/x-www-form-urlencoded\n" +
170 "Content-Length: {3}\n" +
176 parameterStr.size(), parameterStr,
182 boost::asio::io_service ioService;
184 boost::asio::ip::tcp::resolver resolver(ioService);
185 boost::asio::ip::tcp::resolver::query query(host,
"http");
186 boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
189 boost::asio::ip::tcp::socket socket(ioService);
190 socket.connect(*endpoint_iterator);
192 socket.write_some(boost::asio::buffer(header));
203 array<char, 1> buffer;
205 socket.read_some(boost::asio::buffer(buffer));
208 if (header.size() > 4 && header.substr(header.size() - 4) ==
"\r\n\r\n")
213 vector<WeakString> wstrArray = wstr.
split(
"\r\n");
215 for (
size_t i = 0; i < wstrArray.size(); i++)
218 size_t index = wstr.
find(
":");
220 if (index == string::npos)
228 if (headerMap.
has(
"Set-Cookie") ==
true)
230 string &cookie = headerMap.
get(
"Set-Cookie");
236 bool reserved = headerMap.
has(
"Content-Length");
237 bool chunked = headerMap.
has(
"Transfer-Encoding") && headerMap.
get(
"Transfer-Encoding") ==
"chunked";
275 if (reserved ==
true)
278 data.reserve((
size_t)stoull(headerMap.
get(
"Content-Length")));
282 array<unsigned char, 1000> piece;
283 boost::system::error_code error;
285 size_t size = socket.read_some(boost::asio::buffer(piece), error);
286 if (size == 0 || error)
292 piece.begin(), piece.begin() + size
295 if (data.size() == data.capacity())
334 else if (chunked ==
true)
336 vector<unsigned char> prevData;
340 array<char, 1000> piece;
341 boost::system::error_code error;
343 size_t size = socket.read_some(boost::asio::buffer(piece), error);
344 if (size == 0 || error)
347 prevData.insert(prevData.end(), piece.begin(), piece.begin() + size);
350 WeakString wstr((
const char*)&prevData[0], (
const char*)&prevData[0] + prevData.size());
352 if (wstr.substring(wstr.size() - 7, wstr.size()) ==
"\r\n0\r\n\r\n")
379 size_t startIndex = 0;
384 size_t pos = wstr.
find(
"\r\n", startIndex);
387 size_t size = stoull(piece, 0, 16);
391 startIndex = pos + 2;
392 endIndex = std::min(startIndex + size, prevData.size());
394 data.insert(data.end(), prevData.begin() + startIndex, prevData.begin() + endIndex);
395 startIndex = endIndex + 2;
411 array<unsigned char, 1000> piece;
412 boost::system::error_code error;
414 size_t size = socket.read_some(boost::asio::buffer(piece), error);
415 if (size == 0 || error)
421 piece.begin(), piece.begin() + size
auto has(const Key &key) const -> bool
Whether have the item or not.
auto substr(size_t startIndex, size_t endIndex=SIZE_MAX) const -> WeakString
Generates a substring.
auto split(const WeakString &delim) const -> std::vector< WeakString >
Generates substrings.
auto str() const -> std::string
Get the string content.
auto get(const Key &key) -> T &
Get element.
auto find(const WeakString &delim, size_t startIndex=NULL) const -> size_t
Finds first occurence in string.
void set(const Key &key, const T &val)
Set element.
auto between(const WeakString &start={}, const WeakString &end={}) const -> WeakString
Generates a substring.
Top level namespace of products built from samchon.
Customized std::unordered_map.
A string class only references characeters, reference only.
URLVariables class is for representing variables of HTTP.