Skip to content

Commit 22df4eb

Browse files
committed
Done a lot of stuff to play around with HTTP - it successfully makes a query, but there remain problems with the implementation and tests.
1 parent b80ab15 commit 22df4eb

File tree

8 files changed

+117
-33
lines changed

8 files changed

+117
-33
lines changed

http/src/network/http/v2/client/client.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ namespace network {
7979

8080
client_options &io_service(boost::asio::io_service &io_service) {
8181
io_service_ = io_service;
82+
return *this;
8283
}
8384

8485
boost::optional<boost::asio::io_service &> io_service() const {

http/src/network/http/v2/client/connection/async_resolver_delegate.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
#ifndef __NETWORK_HTTP_V2_CLIENT_CONNECTION_ASYNC_RESOLVER_DELEGATE_INC__
77
#define __NETWORK_HTTP_V2_CLIENT_CONNECTION_ASYNC_RESOLVER_DELEGATE_INC__
88

9-
#include "network/http/v2/client/connection/resolver_delegate.hpp"
9+
#include <stdexcept>
10+
#include <cstdint>
11+
#include <string>
12+
#include <unordered_map>
1013
#include <boost/asio/io_service.hpp>
1114
#include <boost/asio/strand.hpp>
1215
#include <boost/asio/ip/tcp.hpp>
1316
#include <boost/range/iterator_range.hpp>
1417
#include <boost/algorithm/string/case_conv.hpp>
1518
#include <boost/exception/all.hpp>
16-
#include <stdexcept>
17-
#include <cstdint>
18-
#include <string>
19-
#include <unordered_map>
19+
#include <network/http/v2/client/connection/resolver_delegate.hpp>
2020

2121
namespace network {
2222
namespace http {

http/src/network/http/v2/client/connection/connection_delegate.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <future>
1212
#include <boost/asio/ip/tcp.hpp>
1313
#include <boost/asio/streambuf.hpp>
14+
#include <boost/asio/buffer.hpp>
1415

1516
namespace network {
1617
namespace http {
@@ -30,11 +31,11 @@ namespace network {
3031
connect(boost::asio::ip::tcp::endpoint &endpoint,
3132
const std::string &host) = 0;
3233

33-
virtual void write(boost::asio::streambuf &command_streambuf,
34-
std::function<void (const boost::system::error_code &, size_t)> handler) = 0;
34+
virtual std::future<std::pair<boost::system::error_code, std::size_t>>
35+
write(boost::asio::streambuf &command_streambuf) = 0;
3536

36-
virtual void read_some(const boost::asio::mutable_buffers_1 &read_buffer,
37-
std::function<void (const boost::system::error_code &, size_t)> handler) = 0;
37+
virtual std::future<std::pair<boost::system::error_code, std::size_t>>
38+
read_some(const boost::asio::mutable_buffers_1 &read_buffer) = 0;
3839

3940
};
4041
} // namespace v2

http/src/network/http/v2/client/connection/normal_connection_delegate.hpp

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,33 +32,54 @@ namespace network {
3232
virtual std::future<boost::system::error_code>
3333
connect(boost::asio::ip::tcp::endpoint &endpoint,
3434
const std::string &host) {
35+
auto promise = std::make_shared<std::promise<boost::system::error_code>>();
36+
auto result = promise->get_future();
37+
3538
socket_.reset(new boost::asio::ip::tcp::socket(io_service_));
36-
// socket_->async_connect(endpoint,
37-
// [this](const boost::system::error_code &ec) {
38-
// std::cout << "oh" << std::endl;
39-
// promise_.set_value(ec);
40-
// });
41-
boost::system::error_code ec;
42-
socket_->connect(endpoint, ec);
43-
promise_.set_value(ec);
44-
return promise_.get_future();
39+
socket_->async_connect(endpoint,
40+
[=](const boost::system::error_code &ec) {
41+
promise->set_value(ec);
42+
});
43+
// boost::system::error_code ec;
44+
// socket_->connect(endpoint, ec);
45+
// promise->set_value(ec);
46+
return std::move(result);
4547
}
4648

47-
virtual void write(boost::asio::streambuf &command_streambuf,
48-
std::function<void (const boost::system::error_code &, size_t)> handler) {
49-
boost::asio::async_write(*socket_, command_streambuf, handler);
49+
virtual std::future<std::pair<boost::system::error_code, std::size_t>>
50+
write(boost::asio::streambuf &command_streambuf) {
51+
auto promise = std::make_shared<
52+
std::promise<std::pair<boost::system::error_code, std::size_t>>>();
53+
auto result = promise->get_future();
54+
55+
boost::asio::async_write(*socket_, command_streambuf,
56+
[&promise] (const boost::system::error_code &ec, std::size_t size) {
57+
promise->set_value(std::make_pair(ec, size));
58+
});
59+
return std::move(result);
5060
}
5161

52-
virtual void read_some(const boost::asio::mutable_buffers_1 &read_buffer,
53-
std::function<void (const boost::system::error_code &, size_t)> handler) {
54-
socket_->async_read_some(read_buffer, handler);
62+
virtual std::future<std::pair<boost::system::error_code, std::size_t>>
63+
read_some(const boost::asio::mutable_buffers_1 &read_buffer) {
64+
auto promise = std::make_shared<
65+
std::promise<std::pair<boost::system::error_code, std::size_t>>>();
66+
auto result = promise->get_future();
67+
68+
// socket_->async_read_some(read_buffer,
69+
// [this] (const boost::system::error_code &ec, std::size_t bytes_read) {
70+
// read_promise_.set_value(std::make_pair(ec, bytes_read));
71+
// });
72+
boost::system::error_code ec;
73+
auto bytes_read = boost::asio::read(*socket_, read_buffer, ec);
74+
promise->set_value(std::make_pair(ec, bytes_read));
75+
return std::move(result);
5576
}
5677

5778
private:
5879

5980
boost::asio::io_service &io_service_;
6081
std::unique_ptr<boost::asio::ip::tcp::socket> socket_;
61-
std::promise<boost::system::error_code> promise_;
82+
std::promise<std::pair<boost::system::error_code, std::size_t>> read_promise_;
6283

6384
};
6485
} // namespace v2

http/src/network/http/v2/client/request.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -376,10 +376,7 @@ namespace network {
376376

377377
friend std::ostream &operator << (std::ostream &os, const request &req) {
378378
os << req.method_ << " " << *req.destination_.path() << " HTTP/" << req.version_ << "\r\n";
379-
os << "Host: ";
380-
os << *req.destination_.scheme();
381-
os << "://";
382-
os << *req.destination_.authority();
379+
os << "Host: " << *req.destination_.host();
383380
os << "\r\n";
384381
for (auto header : req.headers_) {
385382
os << header.first << ": " << header.second << "\r\n";

http/test/v2/features/client/async_resolver_test.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "network/http/v2/client/connection/async_resolver_delegate.hpp"
1111

1212
using namespace igloo;
13+
using boost::asio::ip::tcp;
1314
namespace http = network::http::v2;
1415

1516
Describe(async_resolver) {
@@ -28,8 +29,9 @@ Describe(async_resolver) {
2829
auto result = endpoints.get();
2930
Assert::That(result.first, Equals(boost::system::error_code()));
3031
for (auto endpoint : result.second) {
31-
Assert::That(endpoint.endpoint().address().to_string(), Equals("127.0.0.1"));
32-
Assert::That(endpoint.endpoint().port(), Equals(80));
32+
tcp::endpoint endpoint_ = endpoint;
33+
Assert::That(endpoint_.address().to_string(), Equals("127.0.0.1"));
34+
Assert::That(endpoint_.port(), Equals(80));
3335
}
3436
}
3537

http/test/v2/features/client/normal_connection_test.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
// http://www.boost.org/LICENSE_1_0.txt)
55

66
#include <memory>
7+
#include <thread>
78
#include <igloo/igloo_alt.h>
89
#include <boost/asio.hpp>
910
#include "network/http/v2/client/connection/async_resolver_delegate.hpp"
1011
#include "network/http/v2/client/connection/normal_connection_delegate.hpp"
12+
#include "network/http/v2/client/request.hpp"
1113

1214
using namespace igloo;
1315
using boost::asio::ip::tcp;
@@ -26,6 +28,10 @@ Describe(normal_http_connection) {
2628
endpoints_ = endpoints.get();
2729
}
2830

31+
void TearDown() {
32+
33+
}
34+
2935
It(connects_to_localhost) {
3036
auto it = std::begin(endpoints_.second);
3137
tcp::endpoint endpoint(it->endpoint().address(), 80);
@@ -35,6 +41,62 @@ Describe(normal_http_connection) {
3541
Assert::That(connected_, Equals(boost::system::error_code()));
3642
}
3743

44+
It(writes_to_localhost) {
45+
auto it = std::begin(endpoints_.second);
46+
tcp::endpoint endpoint(it->endpoint().address(), 80);
47+
auto connected = connection_->connect(endpoint, "127.0.0.1");
48+
io_service_->run_one();
49+
auto connected_ = connected.get();
50+
Assert::That(connected_, Equals(boost::system::error_code()));
51+
52+
http::request request{network::uri{"http://127.0.0.1/"}};
53+
request.set_method(http::method::GET);
54+
request.set_version("1.0");
55+
request.append_header("User-Agent", "normal_connection_test");
56+
request.append_header("Connection", "close");
57+
58+
boost::asio::streambuf request_;
59+
std::ostream request_stream(&request_);
60+
request_stream << request;
61+
auto written = connection_->write(request_);
62+
io_service_->run_one();
63+
auto written_ = written.get();
64+
Assert::That(written_.first, Equals(boost::system::error_code()));
65+
}
66+
67+
It(reads_from_localhost) {
68+
auto it = std::begin(endpoints_.second);
69+
tcp::endpoint endpoint(it->endpoint().address(), 80);
70+
auto connected = connection_->connect(endpoint, "127.0.0.1");
71+
io_service_->run_one();
72+
auto connected_ = connected.get();
73+
Assert::That(connected_, Equals(boost::system::error_code()));
74+
75+
http::request request{network::uri{"http://127.0.0.1/"}};
76+
request.set_method(http::method::GET);
77+
request.set_version("1.0");
78+
request.append_header("User-Agent", "normal_connection_test");
79+
request.append_header("Connection", "close");
80+
81+
boost::asio::streambuf request_;
82+
std::ostream request_stream(&request_);
83+
request_stream << request;
84+
auto written = connection_->write(request_);
85+
//io_service_->run_one();
86+
std::cout << 0 << std::endl;
87+
//auto written_ = written.get();
88+
std::cout << 1 << std::endl;
89+
90+
char output[8192];
91+
std::memset(output, 0, sizeof(output));
92+
std::cout << "A" << std::endl;
93+
auto read = connection_->read_some(boost::asio::mutable_buffers_1(output, sizeof(output)));
94+
std::cout << "A" << std::endl;
95+
//auto read_ = read.get();
96+
97+
std::cout << output << std::endl;
98+
}
99+
38100
std::unique_ptr<boost::asio::io_service> io_service_;
39101
std::unique_ptr<http::async_resolver_delegate> resolver_;
40102
std::pair<boost::system::error_code,

http/test/v2/units/client/request_test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ TEST(request_test, stream) {
4343
std::ostringstream oss;
4444
oss << instance;
4545
ASSERT_EQ("GET / HTTP/1.1\r\n"
46-
"Host: http://www.example.com\r\n"
46+
"Host: www.example.com\r\n"
4747
"Connection: close\r\n"
4848
"User-Agent: request_test\r\n\r\n", oss.str());
4949
}
@@ -57,7 +57,7 @@ TEST(request_test, stream_2) {
5757
std::ostringstream oss;
5858
oss << instance;
5959
ASSERT_EQ("GET /path/to/resource/index.html HTTP/1.1\r\n"
60-
"Host: http://www.example.com\r\n"
60+
"Host: www.example.com\r\n"
6161
"Connection: close\r\n"
6262
"User-Agent: request_test\r\n\r\n", oss.str());
6363
}

0 commit comments

Comments
 (0)