Skip to content

Commit 1013faa

Browse files
committed
Tweaking and debugging HTTP server implementations.
1 parent 7205bcd commit 1013faa

File tree

6 files changed

+26
-27
lines changed

6 files changed

+26
-27
lines changed

boost/network/protocol/http/impl/response.ipp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ namespace boost { namespace network { namespace http {
2727
template <>
2828
struct basic_response<tags::http_server> {
2929
typedef tags::http_server tag;
30+
typedef response_header<tags::http_server>::type header_type;
3031

3132
/// The status of the reply.
3233
enum status_type {
@@ -51,7 +52,7 @@ namespace boost { namespace network { namespace http {
5152
} status;
5253

5354
/// The headers to be included in the reply.
54-
typedef vector<tags::http_server>::apply<request_header<tags::http_server>::type>::type headers_vector;
55+
typedef vector<tags::http_server>::apply<header_type>::type headers_vector;
5556
headers_vector headers;
5657

5758
/// The content to be sent in the reply.
@@ -69,7 +70,7 @@ namespace boost { namespace network { namespace http {
6970
std::vector<const_buffer> buffers;
7071
buffers.push_back(to_buffer(status));
7172
for (std::size_t i = 0; i < headers.size(); ++i) {
72-
request_header<tags::http_server>::type & h = headers[i];
73+
header_type & h = headers[i];
7374
buffers.push_back(buffer(h.name));
7475
buffers.push_back(buffer(name_value_separator));
7576
buffers.push_back(buffer(h.value));

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ namespace boost { namespace network { namespace http {
4848

4949
void run() {
5050
listen();
51-
io_service.run();
51+
service_.run();
5252
};
5353

5454
void stop() {
@@ -59,7 +59,6 @@ namespace boost { namespace network { namespace http {
5959
}
6060

6161
void listen() {
62-
if (listening) return;
6362
boost::unique_lock<boost::mutex> listening_lock(listening_mutex_);
6463
if (!listening) start_listening();
6564
}
@@ -68,8 +67,6 @@ namespace boost { namespace network { namespace http {
6867
Handler & handler;
6968
string_type address_, port_;
7069
utils::thread_pool & thread_pool;
71-
std::auto_ptr<asio::io_service> self_service;
72-
asio::io_service io_service;
7370
asio::ip::tcp::acceptor acceptor;
7471
bool stopping;
7572
connection_ptr new_connection;
@@ -83,7 +80,7 @@ namespace boost { namespace network { namespace http {
8380
if (!stopping) {
8481
new_connection.reset(
8582
new connection(
86-
io_service
83+
service_
8784
, handler
8885
, thread_pool
8986
)
@@ -101,20 +98,20 @@ namespace boost { namespace network { namespace http {
10198

10299
void start_listening() {
103100
using boost::asio::ip::tcp;
104-
tcp::resolver resolver(io_service);
101+
tcp::resolver resolver(service_);
105102
tcp::resolver::query query(address_, port_);
106103
tcp::endpoint endpoint = *resolver.resolve(query);
107104
acceptor.open(endpoint.protocol());
108105
acceptor.bind(endpoint);
109106
socket_options_base::acceptor_options(acceptor);
110107
acceptor.listen();
111-
listening = true;
112-
new_connection.reset(new connection(io_service, handler, thread_pool));
108+
new_connection.reset(new connection(service_, handler, thread_pool));
113109
acceptor.async_accept(new_connection->socket(),
114110
boost::bind(
115111
&async_server_base<Tag,Handler>::handle_accept
116112
, this
117113
, boost::asio::placeholders::error));
114+
listening = true;
118115
}
119116
};
120117

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ namespace boost { namespace network { namespace http {
2525
socket_options_base(ArgPack const & args)
2626
: acceptor_reuse_address(args[_reuse_address|false])
2727
, acceptor_report_aborted(args[_report_aborted|false])
28-
, receive_buffer_size(args[_receive_buffer_size|1024])
29-
, send_buffer_size(args[_send_buffer_size|1024])
30-
, receive_low_watermark(args[_receive_low_watermark|512])
31-
, send_low_watermark(args[_send_low_watermark|512])
28+
, receive_buffer_size(args[_receive_buffer_size|4096])
29+
, send_buffer_size(args[_send_buffer_size|4096])
30+
, receive_low_watermark(args[_receive_low_watermark|1024])
31+
, send_low_watermark(args[_send_low_watermark|1024])
3232
, non_blocking_io(args[_non_blocking_io|true])
3333
, linger(args[_linger|true], args[_linger_timeout|0])
3434
{}
@@ -39,12 +39,13 @@ namespace boost { namespace network { namespace http {
3939
}
4040

4141
void socket_options(boost::asio::ip::tcp::socket & socket) {
42-
socket.set_option(receive_buffer_size);
43-
socket.set_option(receive_low_watermark);
44-
socket.set_option(send_buffer_size);
45-
socket.set_option(send_low_watermark);
46-
socket.io_control(non_blocking_io);
47-
socket.set_option(linger);
42+
boost::system::error_code ignored;
43+
socket.io_control(non_blocking_io, ignored);
44+
socket.set_option(linger, ignored);
45+
socket.set_option(receive_buffer_size, ignored);
46+
socket.set_option(receive_low_watermark, ignored);
47+
socket.set_option(send_buffer_size, ignored);
48+
socket.set_option(send_low_watermark, ignored);
4849
}
4950
};
5051

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,8 @@ namespace boost { namespace network { namespace http {
6161
}
6262

6363
void listen() {
64-
if (listening_) return;
6564
boost::unique_lock<boost::mutex> listening_lock(listening_mutex_);
6665
if (!listening_) start_listening();
67-
listening_lock.unlock();
6866
}
6967

7068
private:
@@ -93,14 +91,14 @@ namespace boost { namespace network { namespace http {
9391
tcp::resolver::query query(address_, port_);
9492
tcp::endpoint endpoint = *resolver.resolve(query);
9593
acceptor_.open(endpoint.protocol());
96-
acceptor_.bind(endpoint);
9794
socket_options_base::acceptor_options(acceptor_);
95+
acceptor_.bind(endpoint);
9896
acceptor_.listen();
99-
listening_ = true;
10097
new_connection.reset(new sync_connection<Tag,Handler>(service_, handler_));
10198
acceptor_.async_accept(new_connection->socket(),
10299
boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
103100
this, boost::asio::placeholders::error));
101+
listening_ = true;
104102
}
105103
};
106104

libs/network/test/http/server_async.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ struct async_hello_world {
4242
int main(int argc, char * argv[]) {
4343
utils::thread_pool thread_pool(2);
4444
async_hello_world handler;
45-
server instance("127.0.0.1", "8000", handler, thread_pool);
45+
server instance("127.0.0.1", "8000", handler, thread_pool, http::_reuse_address=true);
4646
instance.run();
4747
return 0;
4848
}

libs/network/test/http/server_hello_world.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ typedef http::server<hello_world> server;
2626
struct hello_world {
2727

2828
void operator()(server::request const & request, server::response & response) {
29+
static server::response::header_type header = {"Connection", "close"};
2930
response = server::response::stock_reply(server::response::ok, "Hello, World!");
31+
response.headers.push_back(header);
3032
assert(response.status == server::response::ok);
31-
assert(response.headers.size() == 2);
33+
assert(response.headers.size() == 3);
3234
assert(response.content == "Hello, World!");
3335
}
3436

@@ -41,7 +43,7 @@ struct hello_world {
4143

4244
int main(int argc, char * argv[]) {
4345
hello_world handler;
44-
server server_("127.0.0.1", "8000", handler);
46+
server server_("127.0.0.1", "8000", handler, http::_reuse_address=true);
4547
server_.run();
4648
return EXIT_SUCCESS;
4749
}

0 commit comments

Comments
 (0)