Repository navigation
Expand file tree
/
Copy pathconnection.cpp
More file actions
77 lines (65 loc) · 1.89 KB
/
Copy pathconnection.cpp
File metadata and controls
77 lines (65 loc) · 1.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "connection.h"
#include "connection_manager.h"
#include "request_handler.h"
#include <sstream>
using namespace asio::ip;
connection::connection(tcp::socket socket, connection_manager &manager, request_handler &handler)
: socket_(std::move(socket))
, connection_manager_(manager)
, request_handler_(handler)
{
}
tcp::socket& connection::socket()
{
return socket_;
}
void connection::start()
{
read();
}
void connection::stop()
{
socket_.close();
}
void connection::read()
{
socket_.async_read_some(asio::buffer(buffer_),
[this](const asio::error_code &ec, size_t bytes_transferred)
{
if(!ec)
{
std::stringstream ss(std::string(buffer_.data(), bytes_transferred));
request_parser::result_type result = request_parser_.parse(request_, ss);
if(result == request_parser::result_type::good)
{
request_handler_.handle_request(request_, reply_);
write();
}
else if(result == request_parser::result_type::bad)
{
reply_ = reply::stock_reply(reply::bad_request);
write();
}
}
else if(ec != asio::error::operation_aborted)
{
connection_manager_.stop(shared_from_this());
}
});
}
void connection::write()
{
socket_.async_write_some(reply_.to_buffers(),
[this](asio::error_code ec, size_t bytes_transferred)
{
if(!ec)
{
asio::error_code ignored_ec;
socket_.shutdown(asio::ip::tcp::socket::shutdown_both, ignored_ec);
}
if(ec != asio::error::operation_aborted)
{
connection_manager_.stop(shared_from_this());
}
});
}