annotate plugins/links/links.cpp @ 706:bd7feaa002cb

Irccd: check ABI compatibility in dynlib_plugin
author David Demelier <markand@malikania.fr>
date Fri, 06 Jul 2018 19:32:54 +0200
parents 4b5dba257d81
children 48afa8c41f50
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/algorithm/string/trim_all.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/dll.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include <boost/asio.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #include <boost/asio/ssl.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 <boost/beast.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/string_util.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #include <irccd/daemon/irc.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #include <irccd/daemon/irccd.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 #include <irccd/daemon/plugin.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 #include <irccd/daemon/server.hpp>
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 using boost::asio::async_connect;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 using boost::asio::deadline_timer;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 using boost::asio::io_context;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 using boost::asio::ip::tcp;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 using boost::asio::ssl::context;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 using boost::asio::ssl::stream;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 using boost::asio::ssl::stream_base;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 using boost::beast::flat_buffer;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 using boost::beast::http::async_read;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 using boost::beast::http::async_write;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 using boost::beast::http::empty_body;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 using boost::beast::http::field;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 using boost::beast::http::request;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 using boost::beast::http::response;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 using boost::beast::http::string_body;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 using boost::beast::http::verb;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 using boost::beast::http::status;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 using boost::posix_time::seconds;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 using boost::system::error_code;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 using std::get;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 using std::enable_shared_from_this;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 using std::monostate;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 using std::move;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 using std::regex;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 using std::regex_match;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 using std::regex_search;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 using std::shared_ptr;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 using std::smatch;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 using std::string;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 using std::variant;
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 irccd {
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 namespace {
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 // {{{ globals
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 // User options.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 struct config {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 static inline unsigned timeout{30U};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 // User formats.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 struct formats {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 static inline string info{"#{title}"};
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 // }}}
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 // {{{ url
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 struct url {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 string protocol;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 string host;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 string path{"/"};
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 static auto parse(const string&) -> url;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 };
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 auto url::parse(const string& link) -> url
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 static const regex regex("^(https?):\\/\\/([^\\/\\?]+)(.*)$");
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 url ret;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 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
110 ret.protocol = match[1];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 ret.host = match[2];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if (match.length(3) > 0)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 ret.path = match[3];
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 if (ret.path[0] != '/')
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 ret.path.insert(ret.path.begin(), '/');
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 }
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 return ret;
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 // }}}
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 // {{{ requester
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 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
127 private:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 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
129
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 shared_ptr<server> server_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 string channel_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 string origin_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 url url_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 context ctx_{context::sslv23};
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 socket socket_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 flat_buffer buffer_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 request<empty_body> req_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 response<string_body> res_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 deadline_timer timer_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 tcp::resolver resolver_;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 void notify(const string&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 void parse();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 void handle_read(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 void read();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 void handle_write(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 void write();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 void handle_handshake(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 void handshake();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 void handle_connect(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 void connect(const tcp::resolver::results_type&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 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
154 void resolve();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 void handle_timer(const error_code&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 void timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 void start();
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 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
160
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 public:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 static void run(io_context&, const message_event&);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 };
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 void requester::notify(const string& title)
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 string_util::subst subst;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 subst.keywords.emplace("channel", channel_);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 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
171 subst.keywords.emplace("origin", origin_);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 subst.keywords.emplace("server", server_->get_name());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 subst.keywords.emplace("title", title);
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 server_->message(channel_, format(formats::info, subst));
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 }
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 void requester::parse()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 /*
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 * 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
182 * have invalid or broken tags.
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 static const regex regex("<title>([^<]+)<\\/title>");
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 string data(res_.body().data());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 smatch match;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 if (regex_search(data, match, regex))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 notify(match[1]);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 }
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 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
194 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 timer_.cancel();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 if (code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 return;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
199
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 // Request again in case of relocation.
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 if (res_.result() == status::moved_permanently) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 const string host(res_[field::location].data());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 // Clean '\r\n'
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 url_ = url::parse(boost::algorithm::trim_all_copy(host));
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 start();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 } else
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 parse();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 void requester::read()
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 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 self->handle_read(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 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
223 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 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
226 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 break;
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 }
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 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
233 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 timer_.cancel();
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 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 read();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
239
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 void requester::write()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 req_.version(11);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 req_.method(verb::get);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 req_.target(url_.path);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 req_.set(field::host, url_.host);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 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
247
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 self->handle_write(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 async_write(get<1>(socket_), req_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 async_write(get<2>(socket_), req_, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 break;
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 }
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 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
268 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 timer_.cancel();
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 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 write();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 }
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 void requester::handshake()
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 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
278
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
280
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 handle_handshake(error_code());
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 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
287 self->handle_handshake(code);
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 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 break;
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 }
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 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
296 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 timer_.cancel();
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 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 handshake();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
302
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 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
304 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 const auto self = shared_from_this();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 const auto wrap = [self] (auto code, auto) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 self->handle_connect(code);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
309
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
311
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 switch (socket_.index()) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 case 1:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 async_connect(get<1>(socket_), eps, wrap);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 case 2:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 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
318 break;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 default:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 break;
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 }
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 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
325 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 timer_.cancel();
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 if (!code)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 connect(eps);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 }
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 void requester::resolve()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 auto self = shared_from_this();
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 timer();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 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
338 self->handle_resolve(code, eps);
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 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
341
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 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
343 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 // 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
345 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
346 socket_.emplace<monostate>();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 }
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 void requester::timer()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 const auto self = shared_from_this();
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 timer_.expires_from_now(seconds(config::timeout));
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 timer_.async_wait([self] (auto code) {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 self->handle_timer(code);
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 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
358
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 void requester::start()
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 if (url_.protocol == "http")
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 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
363 else
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 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
365
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
366 resolve();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
368
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
369 requester::requester(io_context& io,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 shared_ptr<server> server,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 string channel,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 string origin,
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 url url)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 : server_(move(server))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 , channel_(move(channel))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 , origin_(move(origin))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 , url_(move(url))
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 , timer_(io)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 , resolver_(io)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
380 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 }
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 void requester::run(io_context& io, const message_event& ev)
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
384 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 auto url = url::parse(ev.message);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
386
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 if (url.protocol.empty() || url.host.empty())
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
388 return;
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 shared_ptr<requester>(new requester(io, ev.server, ev.channel, ev.origin, move(url)))->start();
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 }
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 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
394
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 // {{{ links_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 class links_plugin : public plugin {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 public:
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 using plugin::plugin;
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 void set_config(plugin_config) override;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
402 void set_formats(plugin_formats) override;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 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
404 };
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
405
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 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
407 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 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
409 config::timeout = *v;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
411
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 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
413 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 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
415 formats::info = it->second;
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
416 }
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 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
419 {
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 requester::run(irccd.get_service(), ev);
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 }
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
422
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 // }}}
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
424
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
425 } // !namespace
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
426
706
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
427 extern "C" {
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
428
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
429 BOOST_SYMBOL_EXPORT
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
430 auto irccd_abi_links() -> unsigned
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
431 {
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
432 return IRCCD_VERSION_SHLIB;
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
433 }
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
434
706
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
435 BOOST_SYMBOL_EXPORT
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
436 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
437 {
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
438 return std::make_unique<links_plugin>("links", "");
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
439 }
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
440
bd7feaa002cb Irccd: check ABI compatibility in dynlib_plugin
David Demelier <markand@malikania.fr>
parents: 705
diff changeset
441 } // !C
705
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
442
4b5dba257d81 Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 } // !irccd