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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy