Skip to content

Commit bf7d33f

Browse files
committed
net/proxy migrate connector interface
1 parent c0cae07 commit bf7d33f

11 files changed

Lines changed: 90 additions & 192 deletions

File tree

MODULE.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ bazel_dep(name = "trunk")
1616

1717
git_override(
1818
module_name = "trunk",
19-
commit = "d9d03b506ebb1cf2089dfba27baa1fa936122096",
19+
commit = "b736efe53ad1e13d2e00c72fb98832c61441d3ce",
2020
remote = "https://github.com/iceboy233/trunk.git",
2121
)

net/proxy/route/connector.cc

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,34 +23,23 @@ Connector::Connector(absl::Span<Rule const> rules) {
2323
}
2424

2525
void Connector::connect(
26-
const tcp::endpoint &endpoint,
26+
const HostPort &target,
2727
const_buffer initial_data,
2828
absl::AnyInvocable<void(
2929
std::error_code, std::unique_ptr<Stream>) &&> callback) {
30-
// TODO
31-
auto *connector = default_connector_;
32-
if (!connector) {
33-
std::move(callback)(
34-
make_error_code(std::errc::network_unreachable), nullptr);
35-
return;
30+
net::Connector *connector = default_connector_;
31+
if (target.is_name_port()) {
32+
std::optional<int> index = host_matcher_.match(target.name());
33+
if (index) {
34+
connector = connectors_[*index];
35+
}
3636
}
37-
connector->connect(endpoint, initial_data, std::move(callback));
38-
}
39-
40-
void Connector::connect(
41-
std::string_view host,
42-
uint16_t port,
43-
const_buffer initial_data,
44-
absl::AnyInvocable<void(
45-
std::error_code, std::unique_ptr<Stream>) &&> callback) {
46-
std::optional<int> index = host_matcher_.match(host);
47-
auto *connector = index ? connectors_[*index] : default_connector_;
4837
if (!connector) {
4938
std::move(callback)(
5039
make_error_code(std::errc::network_unreachable), nullptr);
5140
return;
5241
}
53-
connector->connect(host, port, initial_data, std::move(callback));
42+
connector->connect(target, initial_data, std::move(callback));
5443
}
5544

5645
std::error_code Connector::bind(

net/proxy/route/connector.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,7 @@ class Connector : public net::Connector {
2222
explicit Connector(absl::Span<Rule const> rules);
2323

2424
void connect(
25-
const tcp::endpoint &endpoint,
26-
const_buffer initial_data,
27-
absl::AnyInvocable<void(
28-
std::error_code, std::unique_ptr<Stream>) &&> callback) override;
29-
30-
void connect(
31-
std::string_view host,
32-
uint16_t port,
25+
const HostPort &target,
3326
const_buffer initial_data,
3427
absl::AnyInvocable<void(
3528
std::error_code, std::unique_ptr<Stream>) &&> callback) override;

net/proxy/shadowsocks/connector.cc

Lines changed: 41 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "net/proxy/shadowsocks/connector.h"
22

33
#include <chrono>
4+
#include <limits>
45
#include <memory>
56
#include <utility>
67

@@ -19,13 +20,7 @@ class Connector::TcpStream : public net::Stream {
1920
explicit TcpStream(Connector &connector);
2021

2122
void start(
22-
const tcp::endpoint &endpoint,
23-
const_buffer initial_data,
24-
absl::AnyInvocable<void(std::error_code) &&> callback);
25-
26-
void start(
27-
std::string_view host,
28-
uint16_t port,
23+
const HostPort &target,
2924
const_buffer initial_data,
3025
absl::AnyInvocable<void(std::error_code) &&> callback);
3126

@@ -78,34 +73,13 @@ bool Connector::init(const InitOptions &options) {
7873
}
7974

8075
void Connector::connect(
81-
const tcp::endpoint &endpoint,
76+
const HostPort &target,
8277
const_buffer initial_data,
8378
absl::AnyInvocable<void(
8479
std::error_code, std::unique_ptr<Stream>) &&> callback) {
8580
auto stream = std::make_unique<TcpStream>(*this);
8681
stream->start(
87-
endpoint,
88-
initial_data,
89-
[stream = std::move(stream), callback = std::move(callback)](
90-
std::error_code ec) mutable {
91-
if (ec) {
92-
std::move(callback)(ec, nullptr);
93-
return;
94-
}
95-
std::move(callback)({}, std::move(stream));
96-
});
97-
}
98-
99-
void Connector::connect(
100-
std::string_view host,
101-
uint16_t port,
102-
const_buffer initial_data,
103-
absl::AnyInvocable<void(
104-
std::error_code, std::unique_ptr<Stream>) &&> callback) {
105-
auto stream = std::make_unique<TcpStream>(*this);
106-
stream->start(
107-
host,
108-
port,
82+
target,
10983
initial_data,
11084
[stream = std::move(stream), callback = std::move(callback)](
11185
std::error_code ec) mutable {
@@ -128,79 +102,61 @@ Connector::TcpStream::TcpStream(Connector &connector)
128102
: connector_(connector) {}
129103

130104
void Connector::TcpStream::start(
131-
const tcp::endpoint &endpoint,
105+
const HostPort &target,
132106
const_buffer initial_data,
133107
absl::AnyInvocable<void(std::error_code) &&> callback) {
134108
encryptor_.init(connector_.pre_shared_key_);
135109
connector_.salt_filter_.insert({
136110
encryptor_.salt(), connector_.pre_shared_key_.method().salt_size()});
137-
// TODO: split chunks if too large
111+
112+
// Request fixed-length header.
138113
encryptor_.start_chunk();
139-
address address = endpoint.address();
140-
size_t address_size = address.is_v4() ? 4 : 16;
141-
size_t padding_size = absl::Uniform<size_t>(
142-
connector_.bit_gen_,
143-
connector_.min_padding_length_,
144-
connector_.max_padding_length_);
114+
size_t header_size;
115+
if (target.is_name_port()) {
116+
header_size = 4 + target.name().size();
117+
} else if (target.address().is_v4()) {
118+
header_size = 7;
119+
} else {
120+
header_size = 19;
121+
}
122+
size_t padding_size;
145123
if (connector_.pre_shared_key_.method().is_spec_2022()) {
146124
encryptor_.push_u8(0); // request
147125
encryptor_.push_big_u64(
148126
std::chrono::duration_cast<std::chrono::seconds>(
149127
std::chrono::system_clock::now().time_since_epoch()).count());
150-
encryptor_.push_big_u16(
151-
address_size + padding_size + initial_data.size() + 5);
152-
} else {
153-
encryptor_.push_big_u16(address_size + initial_data.size() + 3);
128+
padding_size = absl::Uniform<size_t>(
129+
connector_.bit_gen_,
130+
connector_.min_padding_length_,
131+
connector_.max_padding_length_);
132+
header_size += 2 + padding_size;
154133
}
155-
encryptor_.finish_chunk();
156-
encryptor_.start_chunk();
157-
if (address.is_v4()) {
158-
encryptor_.push_u8(1); // ipv4
159-
encryptor_.push_buffer(address.to_v4().to_bytes());
160-
} else {
161-
encryptor_.push_u8(4); // ipv6
162-
encryptor_.push_buffer(address.to_v6().to_bytes());
163-
}
164-
encryptor_.push_big_u16(endpoint.port());
165-
if (connector_.pre_shared_key_.method().is_spec_2022()) {
166-
encryptor_.push_big_u16(padding_size);
167-
encryptor_.push_random(padding_size);
134+
header_size += initial_data.size();
135+
if (header_size > std::numeric_limits<uint16_t>::max()) {
136+
std::move(callback)(make_error_code(std::errc::message_size));
137+
return;
168138
}
169-
encryptor_.push_buffer({initial_data.data(), initial_data.size()});
139+
encryptor_.push_big_u16(header_size);
170140
encryptor_.finish_chunk();
171-
connect(std::move(callback));
172-
}
173141

174-
void Connector::TcpStream::start(
175-
std::string_view host,
176-
uint16_t port,
177-
const_buffer initial_data,
178-
absl::AnyInvocable<void(std::error_code) &&> callback) {
179-
encryptor_.init(connector_.pre_shared_key_);
180-
connector_.salt_filter_.insert({
181-
encryptor_.salt(), connector_.pre_shared_key_.method().salt_size()});
182-
// TODO: split chunks if too large
142+
// Request variable-length header.
183143
encryptor_.start_chunk();
184-
size_t padding_size = absl::Uniform<size_t>(
185-
connector_.bit_gen_,
186-
connector_.min_padding_length_,
187-
connector_.max_padding_length_);
188-
if (connector_.pre_shared_key_.method().is_spec_2022()) {
189-
encryptor_.push_u8(0); // request
190-
encryptor_.push_big_u64(
191-
std::chrono::duration_cast<std::chrono::seconds>(
192-
std::chrono::system_clock::now().time_since_epoch()).count());
193-
encryptor_.push_big_u16(
194-
host.size() + padding_size + initial_data.size() + 6);
144+
if (target.is_name_port()) {
145+
encryptor_.push_u8(3); // host
146+
if (target.name().size() > std::numeric_limits<uint8_t>::max()) {
147+
std::move(callback)(make_error_code(std::errc::invalid_argument));
148+
return;
149+
}
150+
encryptor_.push_u8(target.name().size());
151+
encryptor_.push_buffer(target.name());
152+
} else if (target.address().is_v4()) {
153+
encryptor_.push_u8(1); // ipv4
154+
encryptor_.push_buffer(target.address().to_v4().to_bytes());
195155
} else {
196-
encryptor_.push_big_u16(host.size() + initial_data.size() + 4);
156+
encryptor_.push_u8(4); // ipv6
157+
encryptor_.push_buffer(target.address().to_v6().to_bytes());
197158
}
198-
encryptor_.finish_chunk();
199-
encryptor_.start_chunk();
200-
encryptor_.push_u8(3); // host
201-
encryptor_.push_u8(host.size());
202-
encryptor_.push_buffer(host);
203-
encryptor_.push_big_u16(port);
159+
encryptor_.push_big_u16(target.port());
204160
if (connector_.pre_shared_key_.method().is_spec_2022()) {
205161
encryptor_.push_big_u16(padding_size);
206162
encryptor_.push_random(padding_size);

net/proxy/shadowsocks/connector.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,7 @@ class Connector : public net::Connector {
3636
bool init(const InitOptions &options);
3737

3838
void connect(
39-
const tcp::endpoint &endpoint,
40-
const_buffer initial_data,
41-
absl::AnyInvocable<void(
42-
std::error_code, std::unique_ptr<Stream>) &&> callback) override;
43-
44-
void connect(
45-
std::string_view host,
46-
uint16_t port,
39+
const HostPort &target,
4740
const_buffer initial_data,
4841
absl::AnyInvocable<void(
4942
std::error_code, std::unique_ptr<Stream>) &&> callback) override;

net/proxy/shadowsocks/handler.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ void Handler::TcpConnection::forward_parse_ipv4(size_t header_length) {
208208
decryptor_.pop_buffer(initial_data_length),
209209
initial_data_length);
210210
handler_.connector_.connect(
211-
{address_v4(address_bytes), port}, initial_data,
211+
{address_v4(address_bytes), port},
212+
initial_data,
212213
[connection = boost::intrusive_ptr<TcpConnection>(this)](
213214
std::error_code ec, std::unique_ptr<Stream> stream) {
214215
if (ec) {
@@ -258,7 +259,8 @@ void Handler::TcpConnection::forward_parse_ipv6(size_t header_length) {
258259
decryptor_.pop_buffer(initial_data_length),
259260
initial_data_length);
260261
handler_.connector_.connect(
261-
{address_v6(address_bytes), port}, initial_data,
262+
{address_v6(address_bytes), port},
263+
initial_data,
262264
[connection = boost::intrusive_ptr<TcpConnection>(this)](
263265
std::error_code ec, std::unique_ptr<Stream> stream) {
264266
if (ec) {
@@ -308,7 +310,8 @@ void Handler::TcpConnection::forward_parse_host(size_t header_length) {
308310
decryptor_.pop_buffer(initial_data_length),
309311
initial_data_length);
310312
handler_.connector_.connect(
311-
host, port, initial_data,
313+
{host, port},
314+
initial_data,
312315
[connection = boost::intrusive_ptr<TcpConnection>(this)](
313316
std::error_code ec, std::unique_ptr<Stream> stream) {
314317
if (ec) {

net/proxy/socks/handler.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ void Handler::TcpConnection::connect_host(ConstBufferSpan buffer) {
214214
forward_size_ = 0;
215215
state_ = State::connect;
216216
handler_.connector_.connect(
217-
host, port, {buffer.data(), buffer.size()},
217+
{host, port},
218+
{buffer.data(), buffer.size()},
218219
[connection = boost::intrusive_ptr<TcpConnection>(this)](
219220
std::error_code ec, std::unique_ptr<Stream> stream) {
220221
if (ec) {

net/proxy/system/connector.cc

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,24 +44,17 @@ Connector::Connector(const any_io_executor &executor, const Options &options)
4444
tcp_fast_open_connect_(options.tcp_fast_open_connect) {}
4545

4646
void Connector::connect(
47-
const tcp::endpoint &endpoint,
47+
const HostPort &target,
4848
const_buffer initial_data,
4949
absl::AnyInvocable<void(
5050
std::error_code, std::unique_ptr<Stream>) &&> callback) {
5151
auto *operation = new ConnectOperation(
5252
*this, initial_data, std::move(callback));
53-
operation->connect(endpoint.address(), endpoint.port());
54-
}
55-
56-
void Connector::connect(
57-
std::string_view host,
58-
uint16_t port,
59-
const_buffer initial_data,
60-
absl::AnyInvocable<void(
61-
std::error_code, std::unique_ptr<Stream>) &&> callback) {
62-
auto *operation = new ConnectOperation(
63-
*this, initial_data, std::move(callback));
64-
operation->resolve(host, port);
53+
if (target.is_name_port()) {
54+
operation->resolve(target.name(), target.port());
55+
} else {
56+
operation->connect(target.address(), target.port());
57+
}
6558
}
6659

6760
std::error_code Connector::bind(

net/proxy/system/connector.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,7 @@ class Connector : public net::Connector {
2828
Connector &operator=(const Connector &) = delete;
2929

3030
void connect(
31-
const tcp::endpoint &endpoint,
32-
const_buffer initial_data,
33-
absl::AnyInvocable<void(
34-
std::error_code, std::unique_ptr<Stream>) &&> callback) override;
35-
36-
void connect(
37-
std::string_view host,
38-
uint16_t port,
31+
const HostPort &target,
3932
const_buffer initial_data,
4033
absl::AnyInvocable<void(
4134
std::error_code, std::unique_ptr<Stream>) &&> callback) override;

net/tools/BUILD

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ cc_binary(
2828
"@trunk//base:flags",
2929
"@trunk//base:logging",
3030
"@trunk//net:asio",
31-
"@trunk//util:strings",
31+
"@trunk//net:blocking-result",
32+
"@trunk//net/types:host-port",
3233
],
3334
)

0 commit comments

Comments
 (0)