annotate plugins/links/links.cpp @ 712:e0cd4f544b24

Plugin links: create new request in case of redirection While here, fix conversion from boost::string_view to std::string that was using .data() which returns a non-null terminated string.
author David Demelier <markand@malikania.fr>
date Sat, 07 Jul 2018 17:42:34 +0200
parents 48afa8c41f50
children 16e83b636cb8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * links.cpp -- links plugin
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <memory>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <regex>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <sstream>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <string>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <variant>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <boost/dll.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <boost/asio.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include <boost/asio/ssl.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include <boost/beast.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include <irccd/string_util.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <irccd/daemon/irc.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include <irccd/daemon/irccd.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <irccd/daemon/plugin.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include <irccd/daemon/server.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 using boost::asio::async_connect;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 using boost::asio::deadline_timer;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 using boost::asio::io_context;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 using boost::asio::ip::tcp;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 using boost::asio::ssl::context;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 using boost::asio::ssl::stream;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 using boost::asio::ssl::stream_base;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 using boost::beast::flat_buffer;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 using boost::beast::http::async_read;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 using boost::beast::http::async_write;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 using boost::beast::http::empty_body;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 using boost::beast::http::field;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 using boost::beast::http::request;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 using boost::beast::http::response;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 using boost::beast::http::string_body;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 using boost::beast::http::verb;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 using boost::beast::http::status;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 using boost::posix_time::seconds;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 using boost::system::error_code;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 using std::get;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 using std::enable_shared_from_this;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 using std::monostate;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 using std::move;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 using std::regex;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 using std::regex_match;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 using std::regex_search;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 using std::shared_ptr;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 using std::smatch;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 using std::string;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 using std::variant;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 namespace irccd {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 namespace {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 // {{{ globals
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 // User options.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 struct config {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 static inline unsigned timeout{30U};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 // User formats.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 struct formats {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 static inline string info{"#{title}"};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 // {{{ url
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 struct url {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 string protocol;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 string host;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 string path{"/"};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 static auto parse(const string&) -> url;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 auto url::parse(const string& link) -> url
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 static const regex regex("^(https?):\\/\\/([^\\/\\?]+)(.*)$");
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 url ret;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 if (smatch match; regex_match(link, match, regex)) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 ret.protocol = match[1];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 ret.host = match[2];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 if (match.length(3) > 0)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 ret.path = match[3];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if (ret.path[0] != '/')
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 ret.path.insert(ret.path.begin(), '/');
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 return ret;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 // {{{ requester
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 class requester : public enable_shared_from_this<requester> {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 private:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 using socket = variant<monostate, tcp::socket, stream<tcp::socket>>;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 shared_ptr<server> server_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 string channel_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 string origin_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 url url_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 context ctx_{context::sslv23};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 socket socket_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 flat_buffer buffer_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 request<empty_body> req_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 response<string_body> res_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 deadline_timer timer_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 tcp::resolver resolver_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 void notify(const string&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 void parse();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 void handle_read(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 void read();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 void handle_write(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 void write();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 void handle_handshake(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 void handshake();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 void handle_connect(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 void connect(const tcp::resolver::results_type&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 void handle_resolve(const error_code&, const tcp::resolver::results_type&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 void resolve();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 void handle_timer(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 void timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 void start();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 requester(io_context&, shared_ptr<server>, string, string, url);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 public:
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
160 static void run(io_context&, shared_ptr<server>, string, string, string);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 void requester::notify(const string& title)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 string_util::subst subst;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 subst.keywords.emplace("channel", channel_);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 subst.keywords.emplace("nickname", irc::user::parse(origin_).nick());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 subst.keywords.emplace("origin", origin_);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 subst.keywords.emplace("server", server_->get_name());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 subst.keywords.emplace("title", title);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 server_->message(channel_, format(formats::info, subst));
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 void requester::parse()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 /*
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 * Use a regex because Boost's XML parser is strict and many web pages may
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 * have invalid or broken tags.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 */
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 static const regex regex("<title>([^<]+)<\\/title>");
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 string data(res_.body().data());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 smatch match;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 if (regex_search(data, match, regex))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 notify(match[1]);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 void requester::handle_read(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 if (code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 return;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
197
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 // Request again in case of relocation.
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
199 if (const auto it = res_.find(field::location); it != res_.end()) {
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
200 const string location(it->value().data(), it->value().size());
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
201
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
202 run(timer_.get_io_service(), server_, origin_, channel_, location);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 } else
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 parse();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 void requester::read()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 self->handle_read(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 async_read(get<1>(socket_), buffer_, res_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 async_read(get<2>(socket_), buffer_, res_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 void requester::handle_write(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 read();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
235
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 void requester::write()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 req_.version(11);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 req_.method(verb::get);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 req_.target(url_.path);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 req_.set(field::host, url_.host);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 req_.set(field::user_agent, BOOST_BEAST_VERSION_STRING);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
243
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 self->handle_write(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
248
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 async_write(get<1>(socket_), req_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 async_write(get<2>(socket_), req_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
262
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 void requester::handle_handshake(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
266
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 write();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
270
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 void requester::handshake()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
274
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
276
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
278 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 handle_handshake(error_code());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 get<2>(socket_).async_handshake(stream_base::client, [self] (auto code) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 self->handle_handshake(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 });
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
290
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 void requester::handle_connect(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
294
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 handshake();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
298
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 void requester::connect(const tcp::resolver::results_type& eps)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 self->handle_connect(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
305
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
307
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 async_connect(get<1>(socket_), eps, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 async_connect(get<2>(socket_).lowest_layer(), eps, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
319
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 void requester::handle_resolve(const error_code& code, const tcp::resolver::results_type& eps)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
323
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 connect(eps);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
327
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 void requester::resolve()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
331
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 resolver_.async_resolve(url_.host, url_.protocol, [self] (auto code, auto eps) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 self->handle_resolve(code, eps);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 });
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
337
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 void requester::handle_timer(const error_code& code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 // Force close sockets to cancel all pending operations.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 if (code && code != boost::asio::error::operation_aborted)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 socket_.emplace<monostate>();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
344
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 void requester::timer()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
348
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 timer_.expires_from_now(seconds(config::timeout));
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 timer_.async_wait([self] (auto code) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 self->handle_timer(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 });
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
354
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 void requester::start()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 if (url_.protocol == "http")
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 socket_.emplace<tcp::socket>(resolver_.get_io_service());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 else
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 socket_.emplace<stream<tcp::socket>>(resolver_.get_io_service(), ctx_);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
361
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 resolve();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
364
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 requester::requester(io_context& io,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 shared_ptr<server> server,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 string channel,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 string origin,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 url url)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 : server_(move(server))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 , channel_(move(channel))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 , origin_(move(origin))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 , url_(move(url))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 , timer_(io)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 , resolver_(io)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
378
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
379 void requester::run(io_context& io, shared_ptr<server> server, string origin, string channel, string link)
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 {
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
381 auto url = url::parse(link);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
382
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 if (url.protocol.empty() || url.host.empty())
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 return;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
385
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
386 shared_ptr<requester>(new requester(io, server, channel, origin, move(url)))->start();
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
388
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
390
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 // {{{ links_plugin
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
392
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 class links_plugin : public plugin {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 public:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 using plugin::plugin;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
396
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 void set_config(plugin_config) override;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 void set_formats(plugin_formats) override;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 void handle_message(irccd&, const message_event&) override;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
401
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 void links_plugin::set_config(plugin_config conf)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 if (const auto v = string_util::to_uint(conf["timeout"]); v)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 config::timeout = *v;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
407
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 void links_plugin::set_formats(plugin_formats formats)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 if (const auto it = formats.find("info"); it != formats.end())
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 formats::info = it->second;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
413
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 void links_plugin::handle_message(irccd& irccd, const message_event& ev)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 {
712
e0cd4f544b24 Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents: 707
diff changeset
416 requester::run(irccd.get_service(), ev.server, ev.origin, ev.channel, ev.message);
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
418
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
419 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
420
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 } // !namespace
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
422
706
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
423 extern "C" {
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
424
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
425 BOOST_SYMBOL_EXPORT
707
48afa8c41f50 Irccd: verify dynlib_plugin major version too
David Demelier <markand@malikania.fr>
parents: 706
diff changeset
426 auto irccd_abi_links() -> version
706
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
427 {
707
48afa8c41f50 Irccd: verify dynlib_plugin major version too
David Demelier <markand@malikania.fr>
parents: 706
diff changeset
428 return version();
706
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
429 }
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
430
706
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
431 BOOST_SYMBOL_EXPORT
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
432 auto irccd_init_links() -> std::unique_ptr<plugin>
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
433 {
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
434 return std::make_unique<links_plugin>("links", "");
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
435 }
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
436
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
437 } // !C
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
438
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 } // !irccd