Skip to content

Commit a5feaa6

Browse files
committed
Merge remote-tracking branch 'deanberris/0.9-devel' into 0.9-devel
2 parents c834e47 + f3f2f79 commit a5feaa6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+383
-121
lines changed

CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ if (OPENSSL_FOUND)
2121
include_directories(${OPENSSL_INCLUDE_DIR})
2222
endif()
2323

24+
if (${CMAKE_CXX_COMPILER_ID} MATCHES GNU)
25+
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
26+
endif()
27+
2428
if (Boost_FOUND)
2529
if (MSVC)
2630
add_definitions(-D_SCL_SECURE_NO_WARNINGS)

boost/network/protocol/http/algorithms/linearize.hpp

Lines changed: 76 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// (See accompanying file LICENSE_1_0.txt or copy at
77
// http://www.boost.org/LICENSE_1_0.txt)
88

9+
#include <algorithm>
10+
#include <bitset>
911
#include <boost/network/traits/string.hpp>
1012
#include <boost/network/protocol/http/message/header/name.hpp>
1113
#include <boost/network/protocol/http/message/header/value.hpp>
@@ -15,6 +17,7 @@
1517
#include <boost/concept/requires.hpp>
1618
#include <boost/optional.hpp>
1719
#include <boost/range/algorithm/copy.hpp>
20+
#include <boost/algorithm/string/compare.hpp>
1821

1922
namespace boost { namespace network { namespace http {
2023

@@ -92,48 +95,86 @@ namespace boost { namespace network { namespace http {
9295
*oi = consts::dot_char();
9396
boost::copy(version_minor_str, oi);
9497
boost::copy(crlf, oi);
95-
boost::copy(host, oi);
96-
*oi = consts::colon_char();
97-
*oi = consts::space_char();
98-
boost::copy(request.host(), oi);
99-
boost::optional<boost::uint16_t> port_ = port(request);
100-
if (port_) {
101-
string_type port_str = boost::lexical_cast<string_type>(*port_);
102-
*oi = consts::colon_char();
103-
boost::copy(port_str, oi);
104-
}
105-
boost::copy(crlf, oi);
106-
boost::copy(accept, oi);
107-
*oi = consts::colon_char();
108-
*oi = consts::space_char();
109-
boost::copy(accept_mime, oi);
110-
boost::copy(crlf, oi);
111-
if (version_major == 1u && version_minor == 1u) {
112-
boost::copy(accept_encoding, oi);
113-
*oi = consts::colon_char();
114-
*oi = consts::space_char();
115-
boost::copy(default_accept_encoding, oi);
116-
boost::copy(crlf, oi);
117-
}
98+
99+
// We need to determine whether we've seen any of the following headers
100+
// before setting the defaults. We use a bitset to keep track of the
101+
// defaulted headers.
102+
enum { ACCEPT, ACCEPT_ENCODING, HOST, MAX };
103+
std::bitset<MAX> found_headers;
104+
static char const* defaulted_headers[][2] = {
105+
{consts::accept(),
106+
consts::accept() + std::strlen(consts::accept())},
107+
{consts::accept_encoding(),
108+
consts::accept_encoding() + std::strlen(consts::accept_encoding())},
109+
{consts::host(), consts::host() + std::strlen(consts::host())}
110+
};
111+
118112
typedef typename headers_range<Request>::type headers_range;
119113
typedef typename range_value<headers_range>::type headers_value;
120-
BOOST_FOREACH(const headers_value &header, headers(request))
121-
{
122-
string_type header_name = name(header),
123-
header_value = value(header);
124-
boost::copy(header_name, oi);
125-
*oi = consts::colon_char();
126-
*oi = consts::space_char();
127-
boost::copy(header_value, oi);
128-
boost::copy(crlf, oi);
114+
BOOST_FOREACH(const headers_value & header, headers(request)) {
115+
string_type header_name = name(header), header_value = value(header);
116+
// Here we check that we have not seen an override to the defaulted
117+
// headers.
118+
for (int header_index = 0; header_index < MAX; ++header_index)
119+
if (std::distance(header_name.begin(), header_name.end()) ==
120+
std::distance(defaulted_headers[header_index][0],
121+
defaulted_headers[header_index][1]) &&
122+
std::equal(header_name.begin(),
123+
header_name.end(),
124+
defaulted_headers[header_index][0],
125+
algorithm::is_iequal()))
126+
found_headers.set(header_index, true);
127+
128+
// We ignore empty headers.
129+
if (header_value.empty()) continue;
130+
boost::copy(header_name, oi);
131+
*oi = consts::colon_char();
132+
*oi = consts::space_char();
133+
boost::copy(header_value, oi);
134+
boost::copy(crlf, oi);
135+
136+
}
137+
138+
if (!found_headers[HOST]) {
139+
boost::copy(host, oi);
140+
*oi = consts::colon_char();
141+
*oi = consts::space_char();
142+
boost::copy(request.host(), oi);
143+
boost::optional<boost::uint16_t> port_ = port(request);
144+
if (port_) {
145+
string_type port_str = boost::lexical_cast<string_type>(*port_);
146+
*oi = consts::colon_char();
147+
boost::copy(port_str, oi);
148+
}
149+
boost::copy(crlf, oi);
150+
}
151+
152+
if (!found_headers[ACCEPT]) {
153+
boost::copy(accept, oi);
154+
*oi = consts::colon_char();
155+
*oi = consts::space_char();
156+
boost::copy(accept_mime, oi);
157+
boost::copy(crlf, oi);
158+
}
159+
160+
if (version_major == 1u &&
161+
version_minor == 1u &&
162+
!found_headers[ACCEPT_ENCODING]) {
163+
boost::copy(accept_encoding, oi);
164+
*oi = consts::colon_char();
165+
*oi = consts::space_char();
166+
boost::copy(default_accept_encoding, oi);
167+
boost::copy(crlf, oi);
129168
}
169+
130170
if (!connection_keepalive<Tag>::value) {
131-
boost::copy(connection, oi);
132-
*oi = consts::colon_char();
133-
*oi = consts::space_char();
171+
boost::copy(connection, oi);
172+
*oi = consts::colon_char();
173+
*oi = consts::space_char();
134174
boost::copy(close, oi);
135175
boost::copy(crlf, oi);
136176
}
177+
137178
boost::copy(crlf, oi);
138179
typename body_range<Request>::type body_data = body(request).range();
139180
return boost::copy(body_data, oi);

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,20 +90,21 @@ namespace boost { namespace network { namespace http {
9090
scoped_mutex_lock stopping_lock(stopping_mutex_);
9191
if (stopping) return; // we dont want to add another handler instance, and we dont want to know about errors for a socket we dont need anymore
9292
}
93-
if (!ec) {
94-
socket_options_base::socket_options(new_connection->socket());
95-
new_connection->start();
96-
new_connection.reset(
97-
new connection(service_, handler, *thread_pool));
98-
acceptor.async_accept(
99-
new_connection->socket(),
100-
boost::bind(
101-
&async_server_base<Tag,Handler>::handle_accept,
102-
this,
103-
boost::asio::placeholders::error));
104-
} else {
105-
BOOST_NETWORK_MESSAGE("Error accepting connection, reason: " << ec);
93+
94+
if (ec) {
95+
BOOST_NETWORK_MESSAGE("Error accepting connection, reason: "
96+
<< ec);
10697
}
98+
99+
socket_options_base::socket_options(new_connection->socket());
100+
new_connection->start();
101+
new_connection.reset(
102+
new connection(service_, handler, *thread_pool));
103+
acceptor.async_accept(
104+
new_connection->socket(),
105+
boost::bind(&async_server_base<Tag, Handler>::handle_accept,
106+
this,
107+
boost::asio::placeholders::error));
107108
}
108109

109110
void start_listening() {

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,18 @@ namespace boost { namespace network { namespace http {
6868
boost::mutex listening_mutex_;
6969
bool listening_;
7070

71-
void handle_accept(boost::system::error_code const & ec) {
72-
if (!ec) {
73-
socket_options_base::socket_options(new_connection->socket());
74-
new_connection->start();
75-
new_connection.reset(new sync_connection<Tag,Handler>(service_, handler_));
76-
acceptor_.async_accept(new_connection->socket(),
77-
boost::bind(&sync_server_base<Tag,Handler>::handle_accept,
78-
this, boost::asio::placeholders::error));
79-
}
71+
void handle_accept(boost::system::error_code const& ec) {
72+
if (ec) {
73+
}
74+
socket_options_base::socket_options(new_connection->socket());
75+
new_connection->start();
76+
new_connection.reset(
77+
new sync_connection<Tag, Handler>(service_, handler_));
78+
acceptor_.async_accept(
79+
new_connection->socket(),
80+
boost::bind(&sync_server_base<Tag, Handler>::handle_accept,
81+
this,
82+
boost::asio::placeholders::error));
8083
}
8184

8285
void start_listening() {
@@ -87,24 +90,24 @@ namespace boost { namespace network { namespace http {
8790
tcp::resolver::iterator endpoint_iterator = resolver.resolve(query, error);
8891
if (error) {
8992
BOOST_NETWORK_MESSAGE("Error resolving address: " << address_ << ':' << port_);
90-
return;
93+
boost::throw_exception(std::runtime_error("Error resolving address."));
9194
}
9295
tcp::endpoint endpoint = *endpoint_iterator;
9396
acceptor_.open(endpoint.protocol(), error);
9497
if (error) {
9598
BOOST_NETWORK_MESSAGE("Error opening socket: " << address_ << ':' << port_ << " -- reason: '" << error << '\'');
96-
return;
99+
boost::throw_exception(std::runtime_error("Error opening socket."));
97100
}
98101
socket_options_base::acceptor_options(acceptor_);
99102
acceptor_.bind(endpoint, error);
100103
if (error) {
101104
BOOST_NETWORK_MESSAGE("Error binding to socket: " << address_ << ':' << port_ << " -- reason: '" << error << '\'');
102-
return;
105+
boost::throw_exception(std::runtime_error("Error binding to socket."));
103106
}
104107
acceptor_.listen(tcp::socket::max_connections, error);
105108
if (error) {
106109
BOOST_NETWORK_MESSAGE("Error listening on socket: " << address_ << ':' << port_ << " -- reason: '" << error << '\'');
107-
return;
110+
boost::throw_exception(std::runtime_error("Error listening on socket."));
108111
}
109112
new_connection.reset(new sync_connection<Tag,Handler>(service_, handler_));
110113
acceptor_.async_accept(new_connection->socket(),

boost/network/support/is_udp.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ namespace boost { namespace network {
2424

2525
} // namespace boost
2626

27-
#endif // BOOST_NETWORK_SUPPORT_IS_UDP_HPP_20100622
27+
#endif // BOOST_NETWORK_SUPPORT_IS_UDP_HPP_20100622
28+

boost/network/version.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
#define BOOST_NETLIB_VERSION_MAJOR 0
1313
#define BOOST_NETLIB_VERSION_MINOR 10
14-
#define BOOST_NETLIB_VERSION_INCREMENT 0
14+
#define BOOST_NETLIB_VERSION_INCREMENT 1
1515

1616
#ifndef BOOST_NETLIB_VERSION
1717
# define BOOST_NETLIB_VERSION \
-274 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.
-7 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)