Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit20e3e6e

Browse files
committed
Merge branch '0.7-devel' of git://github.com/mikhailberis/cpp-netlib into 0.7-devel
2 parents30de417 +0944773 commit20e3e6e

32 files changed

+938
-241
lines changed

‎boost/network/message/message_concept.hpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
// Copyright (c) Glyn Matthews 2010.
2+
// Copyright 2010 (c) Dean Michael Berris.
3+
// Copyright 2010 (c) Sinefunc, Inc.
24
// Distributed under the Boost Software License, Version 1.0.
35
// (See accompanying file LICENSE_1_0.txt or copy at
46
// http://www.boost.org/LICENSE_1_0.txt)
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#ifndef BOOST_NETWORK_PROTOCOL_HTTP_IMPL_HTTP_SYNC_CONNECTION_20100601
2+
#defineBOOST_NETWORK_PROTOCOL_HTTP_IMPL_HTTP_SYNC_CONNECTION_20100601
3+
4+
// Copyright 2010 (C) Dean Michael Berris
5+
// Copyright 2010 (C) Sinefunc, 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+
namespaceboost {namespacenetwork {namespacehttp {namespaceimpl {
11+
12+
template<classTag,unsigned version_major,unsigned version_minor>
13+
structsync_connection_base_impl;
14+
15+
template<classTag,unsigned version_major,unsigned version_minor>
16+
structsync_connection_base;
17+
18+
template<classTag,unsigned version_major,unsigned version_minor>
19+
structhttp_sync_connection :publicvirtual sync_connection_base<Tag, version_major, version_minor>, detail::connection_helper<Tag, version_major, version_minor>, sync_connection_base_impl<Tag, version_major, version_minor> {
20+
typedeftypename resolver_policy<Tag>::type resolver_base;
21+
typedeftypename resolver_base::resolver_type resolver_type;
22+
typedeftypename string<Tag>::type string_type;
23+
typedef function<typenameresolver_base::resolver_iterator_pair(resolver_type&, string_typeconst &, string_typeconst &)> resolver_function_type;
24+
typedef sync_connection_base_impl<Tag,version_major,version_minor> connection_base;
25+
26+
http_sync_connection(resolver_type & resolver, resolver_function_type resolve)
27+
: connection_base(), resolver_(resolver), resolve_(resolve), socket_(resolver.io_service()) { }
28+
29+
voidinit_socket(string_typeconst & hostname, string_typeconst & port) {
30+
connection_base::init_socket(socket_, resolver_, hostname, port, resolve_);
31+
}
32+
33+
voidsend_request_impl(string_typeconst & method, basic_request<Tag>const & request_) {
34+
boost::asio::streambuf request_buffer;
35+
create_request(request_buffer, method, request_);
36+
connection_base::send_request_impl(socket_, method, request_buffer);
37+
}
38+
39+
voidread_status(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
40+
connection_base::read_status(socket_, response_, response_buffer);
41+
}
42+
43+
voidread_headers(basic_response<Tag> & response, boost::asio::streambuf & response_buffer) {
44+
connection_base::read_headers(socket_, response, response_buffer);
45+
}
46+
47+
voidread_body(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
48+
connection_base::read_body(socket_, response_, response_buffer);
49+
typename headers_range<basic_response<Tag> >::type connection_range =
50+
headers(response_)["Connection"];
51+
if (version_major ==1 && version_minor ==1 && !empty(connection_range) &&boost::iequals(boost::begin(connection_range)->second,"close")) {
52+
close_socket();
53+
}elseif (version_major ==1 && version_minor ==0) {
54+
close_socket();
55+
}
56+
}
57+
58+
boolis_open() {return socket_.is_open(); }
59+
60+
voidclose_socket() {
61+
boost::system::error_code ignored;
62+
socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
63+
socket_.close(ignored);
64+
}
65+
66+
~http_sync_connection() {
67+
close_socket();
68+
}
69+
70+
private:
71+
72+
resolver_type & resolver_;
73+
resolver_function_type resolve_;
74+
boost::asio::ip::tcp::socket socket_;
75+
76+
};
77+
78+
}// namespace impl
79+
80+
}// nmaespace http
81+
82+
}// namespace network
83+
84+
}// nmaespace boost
85+
86+
#endif// BOOST_NETWORK_PROTOCOL_HTTP_IMPL_HTTP_SYNC_CONNECTION_20100
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#ifndef BOOST_NETWORK_PROTOCOL_HTTP_IMPL_HTTPS_SYNC_CONNECTION_HTTP_20100601
2+
#defineBOOST_NETWORK_PROTOCOL_HTTP_IMPL_HTTPS_SYNC_CONNECTION_HTTP_20100601
3+
4+
// Copyright 2010 (C) Dean Michael Berris
5+
// Copyright 2010 (C) Sinefunc, 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/ssl.hpp>
11+
12+
namespaceboost {namespacenetwork {namespacehttp {namespaceimpl {
13+
14+
template<classTag,unsigned version_major,unsigned version_minor>
15+
structsync_connection_base_impl;
16+
17+
template<classTag,unsigned version_major,unsigned version_minor>
18+
structsync_connection_base;
19+
20+
template<classTag,unsigned version_major,unsigned version_minor>
21+
structhttps_sync_connection :publicvirtual sync_connection_base<Tag,version_major,version_minor>, detail::connection_helper<Tag, version_major, version_minor>, sync_connection_base_impl<Tag, version_major, version_minor> {
22+
typedeftypename resolver_policy<Tag>::type resolver_base;
23+
typedeftypename resolver_base::resolver_type resolver_type;
24+
typedeftypename string<Tag>::type string_type;
25+
typedef function<typenameresolver_base::resolver_iterator_pair(resolver_type&, string_typeconst &, string_typeconst &)> resolver_function_type;
26+
typedef sync_connection_base_impl<Tag,version_major,version_minor> connection_base;
27+
28+
https_sync_connection(resolver_type & resolver, resolver_function_type resolve, optional<string_type>const & certificate_filename = optional<string_type>())
29+
: connection_base(), resolver_(resolver), resolve_(resolve), context_(resolver.io_service(), boost::asio::ssl::context::sslv23_client), socket_(resolver.io_service(), context_) {
30+
if (certificate_filename) {
31+
context_.set_verify_mode(boost::asio::ssl::context::verify_peer);
32+
context_.load_verify_file(*certificate_filename);
33+
}else {
34+
context_.set_verify_mode(boost::asio::ssl::context::verify_none);
35+
}
36+
}
37+
38+
voidinit_socket(string_typeconst & hostname, string_typeconst & port) {
39+
connection_base::init_socket(socket_.lowest_layer(), resolver_, hostname, port, resolve_);
40+
socket_.handshake(boost::asio::ssl::stream_base::client);
41+
}
42+
43+
voidsend_request_impl(string_typeconst & method, basic_request<Tag>const & request_) {
44+
boost::asio::streambuf request_buffer;
45+
create_request(request_buffer, method, request_);
46+
connection_base::send_request_impl(socket_, method, request_buffer);
47+
}
48+
49+
voidread_status(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
50+
connection_base::read_status(socket_, response_, response_buffer);
51+
}
52+
53+
voidread_headers(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
54+
connection_base::read_headers(socket_, response_, response_buffer);
55+
}
56+
57+
voidread_body(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
58+
connection_base::read_body(socket_, response_, response_buffer);
59+
typename headers_range<basic_response<Tag> >::type connection_range =
60+
headers(response_)["Connection"];
61+
if (version_major ==1 && version_minor ==1 && !empty(connection_range) &&boost::iequals(boost::begin(connection_range)->second,"close")) {
62+
close_socket();
63+
}elseif (version_major ==1 && version_minor ==0) {
64+
close_socket();
65+
}
66+
}
67+
68+
boolis_open() {
69+
return socket_.lowest_layer().is_open();
70+
}
71+
72+
voidclose_socket() {
73+
boost::system::error_code ignored;
74+
socket_.lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
75+
socket_.lowest_layer().close(ignored);
76+
}
77+
78+
~https_sync_connection() {
79+
close_socket();
80+
}
81+
82+
private:
83+
resolver_type & resolver_;
84+
resolver_function_type resolve_;
85+
boost::asio::ssl::context context_;
86+
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
87+
88+
};
89+
90+
}// namespace impl
91+
92+
}// namespace http
93+
94+
}// namespace network
95+
96+
}// namespace boost
97+
98+
#endif// BOOST_NETWORK_PROTOCOL_HTTP_IMPL_HTTPS_SYNC_CONNECTION_HTTP_20100601

‎boost/network/protocol/http/impl/sync_connection_base.hpp‎

Lines changed: 14 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,21 @@
1010
#include<boost/network/protocol/http/detail/connection_helper.hpp>
1111
#include<boost/network/traits/ostringstream.hpp>
1212
#include<boost/network/traits/istringstream.hpp>
13-
#include<boost/asio/ssl.hpp>
1413
#include<boost/asio/streambuf.hpp>
1514
#include<boost/asio/read.hpp>
15+
#include<boost/asio/write.hpp>
1616
#include<boost/asio/read_until.hpp>
1717
#include<boost/tuple/tuple.hpp>
1818

19+
#include<boost/network/protocol/http/impl/http_sync_connection.hpp>
20+
#ifdef BOOST_NETWORK_ENABLE_HTTPS
21+
#include<boost/network/protocol/http/impl/https_sync_connection.hpp>
22+
#endif
23+
1924
namespaceboost {namespacenetwork {namespacehttp {namespaceimpl {
25+
2026
template<classTag,unsigned version_major,unsigned version_minor>
21-
structconnection_base_impl {
27+
structsync_connection_base_impl {
2228
protected:
2329
typedeftypename resolver_policy<Tag>::type resolver_base;
2430
typedeftypename resolver_base::resolver_type resolver_type;
@@ -119,7 +125,7 @@ namespace boost { namespace network { namespace http { namespace impl {
119125
typename headers_range<basic_response<Tag> >::type transfer_encoding_range =
120126
headers(response_)["Transfer-Encoding"];
121127
if (empty(transfer_encoding_range))throwstd::runtime_error("Missing Transfer-Encoding Header from response.");
122-
if (boost::iequals(begin(transfer_encoding_range)->second,"chunked")) {
128+
if (boost::iequals(boost::begin(transfer_encoding_range)->second,"chunked")) {
123129
bool stopping =false;
124130
do {
125131
std::size_t chunk_size_line =read_until(socket_, response_buffer,"\r\n", error);
@@ -158,7 +164,7 @@ namespace boost { namespace network { namespace http { namespace impl {
158164
}while (!stopping);
159165
}elsethrowstd::runtime_error("Unsupported Transfer-Encoding.");
160166
}else {
161-
size_t length = lexical_cast<size_t>(begin(content_length_range)->second);
167+
size_t length = lexical_cast<size_t>(boost::begin(content_length_range)->second);
162168
size_t bytes_read =0;
163169
while ((bytes_read =boost::asio::read(socket_, response_buffer,boost::asio::transfer_at_least(1), error))) {
164170
body_stream << &response_buffer;
@@ -190,139 +196,6 @@ namespace boost { namespace network { namespace http { namespace impl {
190196

191197
};
192198

193-
template<classTag,unsigned version_major,unsigned version_minor>
194-
structsync_connection_base;
195-
196-
template<classTag,unsigned version_major,unsigned version_minor>
197-
structhttps_sync_connection :publicvirtual sync_connection_base<Tag,version_major,version_minor>, detail::connection_helper<Tag, version_major, version_minor>, connection_base_impl<Tag, version_major, version_minor> {
198-
typedeftypename resolver_policy<Tag>::type resolver_base;
199-
typedeftypename resolver_base::resolver_type resolver_type;
200-
typedeftypename string<Tag>::type string_type;
201-
typedef function<typenameresolver_base::resolver_iterator_pair(resolver_type&, string_typeconst &, string_typeconst &)> resolver_function_type;
202-
typedef connection_base_impl<Tag,version_major,version_minor> connection_base;
203-
204-
https_sync_connection(resolver_type & resolver, resolver_function_type resolve, optional<string_type>const & certificate_filename = optional<string_type>())
205-
: connection_base(), resolver_(resolver), resolve_(resolve), context_(resolver.io_service(), boost::asio::ssl::context::sslv23_client), socket_(resolver.io_service(), context_) {
206-
if (certificate_filename) {
207-
context_.set_verify_mode(boost::asio::ssl::context::verify_peer);
208-
context_.load_verify_file(*certificate_filename);
209-
}else {
210-
context_.set_verify_mode(boost::asio::ssl::context::verify_none);
211-
}
212-
}
213-
214-
voidinit_socket(string_typeconst & hostname, string_typeconst & port) {
215-
connection_base::init_socket(socket_.lowest_layer(), resolver_, hostname, port, resolve_);
216-
socket_.handshake(boost::asio::ssl::stream_base::client);
217-
}
218-
219-
voidsend_request_impl(string_typeconst & method, basic_request<Tag>const & request_) {
220-
boost::asio::streambuf request_buffer;
221-
create_request(request_buffer, method, request_);
222-
connection_base::send_request_impl(socket_, method, request_buffer);
223-
}
224-
225-
voidread_status(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
226-
connection_base::read_status(socket_, response_, response_buffer);
227-
}
228-
229-
voidread_headers(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
230-
connection_base::read_headers(socket_, response_, response_buffer);
231-
}
232-
233-
voidread_body(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
234-
connection_base::read_body(socket_, response_, response_buffer);
235-
typename headers_range<basic_response<Tag> >::type connection_range =
236-
headers(response_)["Connection"];
237-
if (version_major ==1 && version_minor ==1 && !empty(connection_range) &&boost::iequals(begin(connection_range)->second,"close")) {
238-
close_socket();
239-
}elseif (version_major ==1 && version_minor ==0) {
240-
close_socket();
241-
}
242-
}
243-
244-
boolis_open() {
245-
return socket_.lowest_layer().is_open();
246-
}
247-
248-
voidclose_socket() {
249-
boost::system::error_code ignored;
250-
socket_.lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
251-
socket_.lowest_layer().close(ignored);
252-
}
253-
254-
~https_sync_connection() {
255-
close_socket();
256-
}
257-
258-
private:
259-
resolver_type & resolver_;
260-
resolver_function_type resolve_;
261-
boost::asio::ssl::context context_;
262-
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
263-
264-
};
265-
266-
template<classTag,unsigned version_major,unsigned version_minor>
267-
structhttp_sync_connection :publicvirtual sync_connection_base<Tag, version_major, version_minor>, detail::connection_helper<Tag, version_major, version_minor>, connection_base_impl<Tag, version_major, version_minor> {
268-
typedeftypename resolver_policy<Tag>::type resolver_base;
269-
typedeftypename resolver_base::resolver_type resolver_type;
270-
typedeftypename string<Tag>::type string_type;
271-
typedef function<typenameresolver_base::resolver_iterator_pair(resolver_type&, string_typeconst &, string_typeconst &)> resolver_function_type;
272-
typedef connection_base_impl<Tag,version_major,version_minor> connection_base;
273-
274-
http_sync_connection(resolver_type & resolver, resolver_function_type resolve)
275-
: connection_base(), resolver_(resolver), resolve_(resolve), socket_(resolver.io_service()) { }
276-
277-
voidinit_socket(string_typeconst & hostname, string_typeconst & port) {
278-
connection_base::init_socket(socket_, resolver_, hostname, port, resolve_);
279-
}
280-
281-
voidsend_request_impl(string_typeconst & method, basic_request<Tag>const & request_) {
282-
boost::asio::streambuf request_buffer;
283-
create_request(request_buffer, method, request_);
284-
connection_base::send_request_impl(socket_, method, request_buffer);
285-
}
286-
287-
voidread_status(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
288-
connection_base::read_status(socket_, response_, response_buffer);
289-
}
290-
291-
voidread_headers(basic_response<Tag> & response, boost::asio::streambuf & response_buffer) {
292-
connection_base::read_headers(socket_, response, response_buffer);
293-
}
294-
295-
voidread_body(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
296-
connection_base::read_body(socket_, response_, response_buffer);
297-
typename headers_range<basic_response<Tag> >::type connection_range =
298-
headers(response_)["Connection"];
299-
if (version_major ==1 && version_minor ==1 && !empty(connection_range) &&boost::iequals(begin(connection_range)->second,"close")) {
300-
close_socket();
301-
}elseif (version_major ==1 && version_minor ==0) {
302-
close_socket();
303-
}
304-
}
305-
306-
boolis_open() {return socket_.is_open(); }
307-
308-
voidclose_socket() {
309-
boost::system::error_code ignored;
310-
socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
311-
socket_.close(ignored);
312-
}
313-
314-
~http_sync_connection() {
315-
close_socket();
316-
}
317-
318-
private:
319-
320-
resolver_type & resolver_;
321-
resolver_function_type resolve_;
322-
boost::asio::ip::tcp::socket socket_;
323-
324-
};
325-
326199
template<classTag,unsigned version_major,unsigned version_minor>
327200
structsync_connection_base {
328201
typedeftypename resolver_policy<Tag>::type resolver_base;
@@ -332,7 +205,11 @@ namespace boost { namespace network { namespace http { namespace impl {
332205

333206
static sync_connection_base<Tag,version_major,version_minor> *new_connection(resolver_type & resolver, resolver_function_type resolve,bool https) {
334207
if (https) {
208+
#ifdef BOOST_NETWORK_ENABLE_HTTPS
335209
returndynamic_cast<sync_connection_base<Tag,version_major,version_minor>*>(new https_sync_connection<Tag,version_major,version_minor>(resolver, resolve));
210+
#else
211+
throwstd::runtime_error("HTTPS not supported.");
212+
#endif
336213
}
337214
returndynamic_cast<sync_connection_base<Tag,version_major,version_minor>*>(new http_sync_connection<Tag,version_major,version_minor>(resolver, resolve));
338215
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp