Skip to content

Commit 034098c

Browse files
committed
WIP: More Changes
Here's some more changes that are really part of the previous commit. I should really be using the command-line utility more than this Github app...
1 parent 007fef7 commit 034098c

File tree

11 files changed

+256
-82
lines changed

11 files changed

+256
-82
lines changed

boost/network/protocol/http/request_parser.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
// request_parser.hpp
33
// ~~~~~~~~~~~~~~~~~~
44
//
5-
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6-
// Copyright (c) 2009 Dean Michael Berris (mikhailberis at gmail dot com)
7-
// Copyright (c) 2009 Tarro, Inc.
5+
// Copyright 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6+
// Copyright 2009-2012 Dean Michael Berris <dberris@google.com>.
7+
// Copyright 2012 Google, Inc.
8+
// Copyright 2009 Tarroo, Inc.
89
//
910
// Distributed under the Boost Software License, Version 1.0. (See accompanying
1011
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -26,12 +27,11 @@ namespace tag {
2627
}
2728

2829
/// Parser for incoming requests.
29-
template <class Tag>
30-
class basic_request_parser
30+
class request_parser
3131
{
3232
public:
3333
/// Construct ready to parse the request method.
34-
basic_request_parser() : state_(method_start) {}
34+
request_parser() : state_(method_start) {}
3535

3636
/// Reset to initial parser state.
3737
void reset() { state_ = method_start; }
@@ -41,7 +41,7 @@ class basic_request_parser
4141
/// data is required. The InputIterator return value indicates how much of the
4242
/// input has been consumed.
4343
template <typename InputIterator>
44-
boost::tuple<boost::tribool, InputIterator> parse_headers(basic_request<Tag> & req,
44+
boost::tuple<boost::tribool, InputIterator> parse_headers(request & req,
4545
InputIterator begin, InputIterator end)
4646
{
4747
while (begin != end)
@@ -56,7 +56,7 @@ class basic_request_parser
5656

5757
private:
5858
/// Handle the next character of input.
59-
boost::tribool consume(basic_request<Tag> & req, char input);
59+
boost::tribool consume(request & req, char input);
6060

6161
/// Check if a byte is an HTTP character.
6262
static bool is_char(int c);

boost/network/protocol/http/server/async_impl.hpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <boost/asio/ip/tcp.hpp>
1313
#include <boost/thread/mutex.hpp>
1414
#include <boost/network/protocol/http/server/options.hpp>
15+
#include <boost/network/protocol/http/server/impl/socket_options_setter.hpp>
1516

1617
namespace boost { namespace network { namespace utils {
1718

@@ -29,7 +30,7 @@ struct request;
2930

3031
class async_server_connection;
3132

32-
class async_server_impl {
33+
class async_server_impl : protected socket_options_setter {
3334
public:
3435
typedef shared_ptr<async_server_connection> connection_ptr;
3536
async_server_impl(server_options const &options,
@@ -54,9 +55,6 @@ class async_server_impl {
5455
void handle_stop();
5556
void start_listening();
5657
void handle_accept(system::error_code const &ec);
57-
58-
void set_socket_options(asio::ip::tcp::socket &socket);
59-
void set_acceptor_options(asio::ip::tcp::acceptor &acceptor);
6058
};
6159

6260
} // namespace http

boost/network/protocol/http/server/async_impl.ipp

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ void async_server_impl::handle_accept(boost::system::error_code const & ec) {
9090
if (stopping_) return;
9191
}
9292
if (!ec) {
93-
set_socket_options(new_connection_->socket());
93+
set_socket_options(options_, new_connection_->socket());
9494
new_connection_->start();
9595
new_connection_.reset(
9696
new async_server_connection(*service_, handler_, pool_));
@@ -122,7 +122,7 @@ void async_server_impl::start_listening() {
122122
BOOST_NETWORK_MESSAGE("error opening socket: " << address_ << ":" << port_);
123123
BOOST_THROW_EXCEPTION(std::runtime_error("Error opening socket."));
124124
}
125-
set_acceptor_options(*acceptor_);
125+
set_acceptor_options(options_, *acceptor_);
126126
acceptor_->bind(endpoint, error);
127127
if (error) {
128128
BOOST_NETWORK_MESSAGE("error binding socket: " << address_ << ":" << port_);
@@ -146,41 +146,6 @@ void async_server_impl::start_listening() {
146146
BOOST_NETWORK_MESSAGE("now listening on '" << address_ << ":" << port_ << "'");
147147
}
148148

149-
void async_server_impl::set_socket_options(asio::ip::tcp::socket &socket) {
150-
system::error_code ignored;
151-
socket.non_blocking(options_.non_blocking_io(), ignored);
152-
if (options_.linger()) {
153-
asio::ip::tcp::socket::linger linger(true, options_.linger_timeout());
154-
socket.set_option(linger, ignored);
155-
}
156-
if (int buf_size = options_.receive_buffer_size() >= 0) {
157-
asio::ip::tcp::socket::receive_buffer_size receive_buffer_size(buf_size);
158-
socket.set_option(receive_buffer_size, ignored);
159-
}
160-
if (int buf_size = options_.send_buffer_size() >= 0) {
161-
asio::ip::tcp::socket::send_buffer_size send_buffer_size(buf_size);
162-
socket.set_option(send_buffer_size, ignored);
163-
}
164-
if (int buf_size = options_.receive_low_watermark() >= 0) {
165-
asio::ip::tcp::socket::receive_low_watermark receive_low_watermark(buf_size);
166-
socket.set_option(receive_low_watermark, ignored);
167-
}
168-
if (int buf_size = options_.send_low_watermark() >= 0) {
169-
asio::ip::tcp::socket::send_low_watermark send_low_watermark(buf_size);
170-
socket.set_option(send_low_watermark, ignored);
171-
}
172-
}
173-
174-
void async_server_impl::set_acceptor_options(asio::ip::tcp::acceptor &acceptor) {
175-
system::error_code ignored;
176-
acceptor.set_option(
177-
asio::ip::tcp::acceptor::reuse_address(options_.reuse_address()),
178-
ignored);
179-
acceptor.set_option(
180-
asio::ip::tcp::acceptor::enable_connection_aborted(options_.report_aborted()),
181-
ignored);
182-
}
183-
184149
} // namespace http
185150

186151
} // namespace network

boost/network/protocol/http/server/connection/sync.hpp

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
#define BOOST_NETWORK_HTTP_SERVER_SYNC_CONNECTION_HPP_
1010

1111
#ifndef BOOST_NETWORK_HTTP_SERVER_CONNECTION_BUFFER_SIZE
12-
#define BOOST_NETWORK_HTTP_SERVER_CONNECTION_BUFFER_SIZE 1024uL
12+
#define BOOST_NETWORK_HTTP_SERVER_CONNECTION_BUFFER_SIZE 4096uL
1313
#endif
1414

1515
#include <boost/enable_shared_from_this.hpp>
16-
#include <boost/network/protocol/http/request_parser.hpp>
16+
#include <boost/network/protocol/http/server/request_parser.hpp>
1717
#include <boost/network/protocol/http/request.hpp>
1818
#include <boost/network/protocol/http/response.hpp>
1919
#include <boost/asio/ip/tcp.hpp>
@@ -29,10 +29,9 @@
2929

3030
namespace boost { namespace network { namespace http {
3131

32-
template <class Tag, class Handler>
33-
struct sync_connection : boost::enable_shared_from_this<sync_connection<Tag,Handler> > {
32+
class sync_server_connection : public boost::enable_shared_from_this<sync_server_connection> {
3433

35-
sync_connection(boost::asio::io_service & service, Handler & handler)
34+
sync_server_connection(boost::asio::io_service & service, function<void(request const &, response &)> handler)
3635
: service_(service)
3736
, handler_(handler)
3837
, socket_(service_)
@@ -58,8 +57,8 @@ namespace boost { namespace network { namespace http {
5857
boost::asio::buffer(buffer_),
5958
wrapper_.wrap(
6059
boost::bind(
61-
&sync_connection<Tag,Handler>::handle_read_headers,
62-
sync_connection<Tag,Handler>::shared_from_this(),
60+
&sync_server_connection::handle_read_headers,
61+
sync_server_connection::shared_from_this(),
6362
boost::asio::placeholders::error,
6463
boost::asio::placeholders::bytes_transferred
6564
)
@@ -92,14 +91,14 @@ namespace boost { namespace network { namespace http {
9291
is_content_length()
9392
);
9493
if (it == request_.headers.end()) {
95-
response_= basic_response<Tag>::stock_reply(basic_response<Tag>::bad_request);
94+
response_= stock_reply(bad_request);
9695
boost::asio::async_write(
9796
socket_,
9897
response_.to_buffers(),
9998
wrapper_.wrap(
10099
boost::bind(
101-
&sync_connection<Tag,Handler>::handle_write,
102-
sync_connection<Tag,Handler>::shared_from_this(),
100+
&sync_server_connection::handle_write,
101+
sync_server_connection::shared_from_this(),
103102
boost::asio::placeholders::error
104103
)
105104
)
@@ -112,14 +111,14 @@ namespace boost { namespace network { namespace http {
112111
try {
113112
content_length = boost::lexical_cast<size_t>(it->value);
114113
} catch (...) {
115-
response_= basic_response<Tag>::stock_reply(basic_response<Tag>::bad_request);
114+
response_= stock_reply(bad_request);
116115
boost::asio::async_write(
117116
socket_,
118117
response_.to_buffers(),
119118
wrapper_.wrap(
120119
boost::bind(
121-
&sync_connection<Tag,Handler>::handle_write,
122-
sync_connection<Tag,Handler>::shared_from_this(),
120+
&sync_server_connection::handle_write,
121+
sync_server_connection::shared_from_this(),
123122
boost::asio::placeholders::error
124123
)
125124
)
@@ -137,8 +136,8 @@ namespace boost { namespace network { namespace http {
137136
boost::asio::buffer(buffer_),
138137
wrapper_.wrap(
139138
boost::bind(
140-
&sync_connection<Tag,Handler>::handle_read_body_contents,
141-
sync_connection<Tag,Handler>::shared_from_this(),
139+
&sync_server_connection::handle_read_body_contents,
140+
sync_server_connection::shared_from_this(),
142141
boost::asio::placeholders::error,
143142
content_length,
144143
boost::asio::placeholders::bytes_transferred
@@ -155,8 +154,8 @@ namespace boost { namespace network { namespace http {
155154
response_.to_buffers(),
156155
wrapper_.wrap(
157156
boost::bind(
158-
&sync_connection<Tag,Handler>::handle_write,
159-
sync_connection<Tag,Handler>::shared_from_this(),
157+
&sync_server_connection::handle_write,
158+
sync_server_connection::shared_from_this(),
160159
boost::asio::placeholders::error
161160
)
162161
)
@@ -168,22 +167,22 @@ namespace boost { namespace network { namespace http {
168167
response_.to_buffers(),
169168
wrapper_.wrap(
170169
boost::bind(
171-
&sync_connection<Tag,Handler>::handle_write,
172-
sync_connection<Tag,Handler>::shared_from_this(),
170+
&sync_server_connection::handle_write,
171+
sync_server_connection::shared_from_this(),
173172
boost::asio::placeholders::error
174173
)
175174
)
176175
);
177176
}
178177
} else if (!done) {
179-
response_= basic_response<Tag>::stock_reply(basic_response<Tag>::bad_request);
178+
response_= stock_reply(bad_request);
180179
boost::asio::async_write(
181180
socket_,
182181
response_.to_buffers(),
183182
wrapper_.wrap(
184183
boost::bind(
185-
&sync_connection<Tag,Handler>::handle_write,
186-
sync_connection<Tag,Handler>::shared_from_this(),
184+
&sync_server_connection::handle_write,
185+
sync_server_connection::shared_from_this(),
187186
boost::asio::placeholders::error
188187
)
189188
)
@@ -193,8 +192,8 @@ namespace boost { namespace network { namespace http {
193192
boost::asio::buffer(buffer_),
194193
wrapper_.wrap(
195194
boost::bind(
196-
&sync_connection<Tag,Handler>::handle_read_headers,
197-
sync_connection<Tag,Handler>::shared_from_this(),
195+
&sync_server_connection::handle_read_headers,
196+
sync_server_connection::shared_from_this(),
198197
boost::asio::placeholders::error,
199198
boost::asio::placeholders::bytes_transferred
200199
)
@@ -219,8 +218,8 @@ namespace boost { namespace network { namespace http {
219218
response_.to_buffers(),
220219
wrapper_.wrap(
221220
boost::bind(
222-
&sync_connection<Tag,Handler>::handle_write,
223-
sync_connection<Tag,Handler>::shared_from_this(),
221+
&sync_server_connection::handle_write,
222+
sync_server_connection::shared_from_this(),
224223
boost::asio::placeholders::error
225224
)
226225
)
@@ -230,8 +229,8 @@ namespace boost { namespace network { namespace http {
230229
boost::asio::buffer(buffer_),
231230
wrapper_.wrap(
232231
boost::bind(
233-
&sync_connection<Tag,Handler>::handle_read_body_contents,
234-
sync_connection<Tag,Handler>::shared_from_this(),
232+
&sync_server_connection::handle_read_body_contents,
233+
sync_server_connection::shared_from_this(),
235234
boost::asio::placeholders::error,
236235
difference,
237236
boost::asio::placeholders::bytes_transferred
@@ -252,16 +251,16 @@ namespace boost { namespace network { namespace http {
252251
}
253252

254253
boost::asio::io_service & service_;
255-
Handler & handler_;
254+
function<void(request const &, response &)> handler_;
256255
boost::asio::ip::tcp::socket socket_;
257256
boost::asio::io_service::strand wrapper_;
258257

259258
typedef boost::array<char,BOOST_NETWORK_HTTP_SERVER_CONNECTION_BUFFER_SIZE> buffer_type;
260259
buffer_type buffer_;
261-
typedef basic_request_parser<Tag> request_parser;
260+
request_parser request_parser;
262261
request_parser parser_;
263-
basic_request<Tag> request_;
264-
basic_response<Tag> response_;
262+
request request_;
263+
response response_;
265264
};
266265

267266

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef BOOST_NETWORK_PROTOCOL_HTTP_SERVER_IMPL_SOCKET_OPIONS_SETTER_20120319
2+
#define BOOST_NETWORK_PROTOCOL_HTTP_SERVER_IMPL_SOCKET_OPIONS_SETTER_20120319
3+
4+
// Copyright 2012 Dean Michael Berris <dberris@google.com>.
5+
// Copyright 2012 Google, Inc.
6+
// Distributed under the Boost Software License, Version 1.0.
7+
// (See accompanying file LICENSE_1_0.txt or copy at
8+
// http://www.boost.org/LICENSE_1_0.txt)
9+
10+
#include <boost/asio/ip/tcp.hpp>
11+
12+
namespace boost { namespace network { namespace http {
13+
14+
class server_options;
15+
16+
class socket_options_setter {
17+
protected:
18+
void set_socket_options(server_options const &options, asio::ip::tcp::socket &socket);
19+
void set_acceptor_options(server_options const &options, asio::ip::tcp::acceptor &acceptor);
20+
};
21+
22+
} // namespace http
23+
24+
} // namespace network
25+
26+
} // namespace boost
27+
28+
#endif // BOOST_NETWORK_PROTOCOL_HTTP_SERVER_IMPL_SOCKET_OPIONS_SETTER_20120319
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#ifndef BOOST_NETWORK_PROTOCOL_HTTP_SERVER_IMPL_SOCKET_OPTIONS_SETTER_IPP_20120319
2+
#define BOOST_NETWORK_PROTOCOL_HTTP_SERVER_IMPL_SOCKET_OPTIONS_SETTER_IPP_20120319
3+
4+
// Copyright 2012 Dean Michael Berris <dberris@google.com>.
5+
// Copyright 2012 Google, Inc.
6+
// Distributed under the Boost Software License, Version 1.0.
7+
// (See accompanying file LICENSE_1_0.txt or copy at
8+
// http://www.boost.org/LICENSE_1_0.txt)
9+
10+
#include <boost/network/protocol/http/server/impl/socket_options_setter.hpp>
11+
#include <boost/network/protocol/http/server/options.hpp>
12+
13+
namespace boost { namespace network { namespace http {
14+
15+
void socket_options_setter::set_socket_options(server_options const & options, asio::ip::tcp::socket &socket) {
16+
system::error_code ignored;
17+
socket.non_blocking(options.non_blocking_io(), ignored);
18+
if (options.linger()) {
19+
asio::ip::tcp::socket::linger linger(true, options.linger_timeout());
20+
socket.set_option(linger, ignored);
21+
}
22+
if (int buf_size = options.receive_buffer_size() >= 0) {
23+
asio::ip::tcp::socket::receive_buffer_size receive_buffer_size(buf_size);
24+
socket.set_option(receive_buffer_size, ignored);
25+
}
26+
if (int buf_size = options.send_buffer_size() >= 0) {
27+
asio::ip::tcp::socket::send_buffer_size send_buffer_size(buf_size);
28+
socket.set_option(send_buffer_size, ignored);
29+
}
30+
if (int buf_size = options.receive_low_watermark() >= 0) {
31+
asio::ip::tcp::socket::receive_low_watermark receive_low_watermark(buf_size);
32+
socket.set_option(receive_low_watermark, ignored);
33+
}
34+
if (int buf_size = options.send_low_watermark() >= 0) {
35+
asio::ip::tcp::socket::send_low_watermark send_low_watermark(buf_size);
36+
socket.set_option(send_low_watermark, ignored);
37+
}
38+
}
39+
40+
void socket_options_setter::set_acceptor_options(server_options const &options, asio::ip::tcp::acceptor &acceptor) {
41+
system::error_code ignored;
42+
acceptor.set_option(
43+
asio::ip::tcp::acceptor::reuse_address(options.reuse_address()),
44+
ignored);
45+
acceptor.set_option(
46+
asio::ip::tcp::acceptor::enable_connection_aborted(options.report_aborted()),
47+
ignored);
48+
}
49+
50+
} // namespace http
51+
52+
} // namespace network
53+
54+
} // namespace boost
55+
56+
#endif // BOOST_NETWORK_PROTOCOL_HTTP_SERVER_IMPL_SOCKET_OPTIONS_SETTER_IPP_20120319

0 commit comments

Comments
 (0)