Mercurial > irccd
annotate plugins/links/links.cpp @ 763:4283dc118339
Irccd: style (transport_util)
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 13 Aug 2018 13:50:11 +0200 |
parents | 1e1eb83a3f0b |
children | 80e2d5284b4a |
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_); |
750
1e1eb83a3f0b
Irccd: IRC code cleanup
David Demelier <markand@malikania.fr>
parents:
732
diff
changeset
|
168 subst.keywords.emplace("nickname", irc::user::parse(origin_).nick); |
705
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 subst.keywords.emplace("origin", origin_); |
732
e53b013c8938
Irccd: server style and cleanup
David Demelier <markand@malikania.fr>
parents:
731
diff
changeset
|
170 subst.keywords.emplace("server", server_->get_id()); |
705
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: |
731
9d13aabfd63a
Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
395 using plugin::plugin; |
9d13aabfd63a
Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
396 |
722
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
397 auto get_name() const noexcept -> std::string_view override; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
398 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
399 auto get_author() const noexcept -> std::string_view override; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
400 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
401 auto get_license() const noexcept -> std::string_view override; |
705
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
402 |
722
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
403 auto get_summary() const noexcept -> std::string_view override; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
404 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
405 auto get_version() const noexcept -> std::string_view override; |
716
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
406 |
722
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
407 void set_options(const map&) override; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
408 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
409 void set_formats(const map&) override; |
716
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
410 |
705
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
411 void handle_message(irccd&, const message_event&) override; |
716
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
412 |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
413 static auto abi() -> version; |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
414 |
731
9d13aabfd63a
Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
415 static auto init(std::string) -> std::unique_ptr<plugin>; |
705
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 |
722
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
418 auto links_plugin::get_name() const noexcept -> std::string_view |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
419 { |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
420 return "links"; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
421 } |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
422 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
423 auto links_plugin::get_author() const noexcept -> std::string_view |
705
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
424 { |
722
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
425 return "David Demelier <markand@malikania.fr>"; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
426 } |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
427 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
428 auto links_plugin::get_license() const noexcept -> std::string_view |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
429 { |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
430 return "ISC"; |
705
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
431 } |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
432 |
722
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
433 auto links_plugin::get_summary() const noexcept -> std::string_view |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
434 { |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
435 return "show webpage title"; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
436 } |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
437 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
438 auto links_plugin::get_version() const noexcept -> std::string_view |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
439 { |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
440 return IRCCD_VERSION; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
441 } |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
442 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
443 void links_plugin::set_options(const map& conf) |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
444 { |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
445 if (const auto it = conf.find("timeout"); it != conf.end()) |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
446 if (const auto v = string_util::to_uint(it->second); v) |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
447 config::timeout = *v; |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
448 } |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
449 |
3e816cebed2c
Irccd: make plugin pure abstract, closes #796 @3h
David Demelier <markand@malikania.fr>
parents:
716
diff
changeset
|
450 void links_plugin::set_formats(const map& formats) |
705
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
451 { |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
452 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
|
453 formats::info = it->second; |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
454 } |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
455 |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
456 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
|
457 { |
712
e0cd4f544b24
Plugin links: create new request in case of redirection
David Demelier <markand@malikania.fr>
parents:
707
diff
changeset
|
458 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
|
459 } |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
460 |
716
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
461 auto links_plugin::abi() -> version |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
462 { |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
463 return version(); |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
464 } |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
465 |
731
9d13aabfd63a
Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
466 auto links_plugin::init(std::string id) -> std::unique_ptr<plugin> |
716
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
467 { |
731
9d13aabfd63a
Irccd: plugin now have internal id
David Demelier <markand@malikania.fr>
parents:
722
diff
changeset
|
468 return std::make_unique<links_plugin>(std::move(id)); |
716
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
469 } |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
470 |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
471 BOOST_DLL_ALIAS(links_plugin::abi, irccd_abi_links) |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
472 BOOST_DLL_ALIAS(links_plugin::init, irccd_init_links) |
16e83b636cb8
Irccd: use BOOST_DLL_ALIAS to avoid warnings
David Demelier <markand@malikania.fr>
parents:
712
diff
changeset
|
473 |
705
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
474 // }}} |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
475 |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
476 } // !namespace |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
477 |
4b5dba257d81
Plugin links: brand new plugin, closes #872 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
478 } // !irccd |