summaryrefslogtreecommitdiff
path: root/src/lib/http_server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/http_server.cc')
-rw-r--r--src/lib/http_server.cc76
1 files changed, 38 insertions, 38 deletions
diff --git a/src/lib/http_server.cc b/src/lib/http_server.cc
index 0ee62756a..3dab26d1e 100644
--- a/src/lib/http_server.cc
+++ b/src/lib/http_server.cc
@@ -72,7 +72,7 @@ Response::add_header(string key, string value)
void
Response::send(shared_ptr<Socket> socket)
{
- socket->write(String::compose("HTTP/1.1 %1 OK\r\n", _code));
+ socket->write(fmt::format("HTTP/1.1 {} OK\r\n", _code));
switch (_type) {
case Type::HTML:
socket->write("Content-Type: text/html; charset=utf-8\r\n");
@@ -81,9 +81,9 @@ Response::send(shared_ptr<Socket> socket)
socket->write("Content-Type: text/json; charset=utf-8\r\n");
break;
}
- socket->write(String::compose("Content-Length: %1\r\n", _payload.length()));
+ socket->write(fmt::format("Content-Length: {}\r\n", _payload.length()));
for (auto const& header: _headers) {
- socket->write(String::compose("%1: %2\r\n", header.first, header.second));
+ socket->write(fmt::format("{}: {}\r\n", header.first, header.second));
}
socket->write("\r\n");
socket->write(_payload);
@@ -94,21 +94,21 @@ Response
HTTPServer::get(string const& url)
{
if (url == "/") {
- return Response(200, String::compose(dcp::file_to_string(resources_path() / "web" / "index.html"), variant::dcpomatic_player()));
+ return Response(200, fmt::format(dcp::file_to_string(resources_path() / "web" / "index.html"), variant::dcpomatic_player()));
} else if (url == "/api/v1/status") {
auto json = string{"{ "};
{
boost::mutex::scoped_lock lm(_mutex);
- json += String::compose("\"playing\": %1, ", _playing ? "true" : "false");
- json += String::compose("\"position\": \"%1\", ", seconds_to_hms(_position.seconds()));
- json += String::compose("\"dcp_name\": \"%1\"", _dcp_name);
+ json += fmt::format("\"playing\": {}, ", _playing ? "true" : "false");
+ json += fmt::format("\"position\": \"{}\", ", seconds_to_hms(_position.seconds()));
+ json += fmt::format("\"dcp_name\": \"{}\"", _dcp_name);
}
json += " }";
auto response = Response(200, json);
response.set_type(Response::Type::JSON);
return response;
} else {
- LOG_HTTP("404 %1", url);
+ LOG_HTTP("404 {}", url);
return Response::ERROR_404;
}
}
@@ -144,19 +144,19 @@ HTTPServer::request(vector<string> const& request)
try {
if (parts[0] == "GET") {
- LOG_HTTP("GET %1", parts[1]);
+ LOG_HTTP("GET {}", parts[1]);
return get(parts[1]);
} else if (parts[0] == "POST") {
- LOG_HTTP("POST %1", parts[1]);
+ LOG_HTTP("POST {}", parts[1]);
return post(parts[1]);
}
} catch (std::exception& e) {
- LOG_ERROR("Error while handling HTTP request: %1", e.what());
+ LOG_ERROR("Error while handling HTTP request: {}", e.what());
} catch (...) {
- LOG_ERROR_NC("Unknown exception while handling HTTP request");
+ LOG_ERROR("Unknown exception while handling HTTP request");
}
- LOG_HTTP("404 %1", parts[0]);
+ LOG_HTTP("404 {}", parts[0]);
return Response::ERROR_404;
}
@@ -191,7 +191,7 @@ HTTPServer::handle(shared_ptr<Socket> socket)
} else if (_line.size() >= 2) {
_line = _line.substr(0, _line.length() - 2);
}
- LOG_HTTP("Receive: %1", _line);
+ LOG_HTTP("Receive: {}", _line);
_request.push_back(_line);
_line = "";
}
@@ -223,33 +223,33 @@ HTTPServer::handle(shared_ptr<Socket> socket)
boost::system::error_code _error_code;
};
- while (true) {
+ Reader reader;
- Reader reader;
+ vector<uint8_t> buffer(2048);
+ socket->set_deadline_from_now(2);
+ socket->socket().async_read_some(
+ boost::asio::buffer(buffer.data(), buffer.size()),
+ [&reader, &buffer, socket](boost::system::error_code const& ec, std::size_t bytes_transferred) {
+ reader.read_block(ec, buffer.data(), bytes_transferred);
+ });
- vector<uint8_t> buffer(2048);
- socket->socket().async_read_some(
- boost::asio::buffer(buffer.data(), buffer.size()),
- [&reader, &buffer, socket](boost::system::error_code const& ec, std::size_t bytes_transferred) {
- socket->set_deadline_from_now(1);
- reader.read_block(ec, buffer.data(), bytes_transferred);
- });
-
- while (!reader.got_request() && !reader.close() && socket->is_open()) {
- socket->run();
- }
-
- if (reader.got_request() && !reader.close()) {
- try {
- auto response = request(reader.get());
- response.send(socket);
- } catch (runtime_error& e) {
- LOG_ERROR_NC(e.what());
- }
- }
+ while (!reader.got_request() && !reader.close() && socket->is_open()) {
+ socket->run();
+ }
- if (reader.close()) {
- break;
+ if (reader.got_request() && !reader.close()) {
+ try {
+ auto response = request(reader.get());
+ response.send(socket);
+ } catch (runtime_error& e) {
+ LOG_ERROR(e.what());
}
}
+
+ /* I think we should keep the socket open if the client requested keep-alive, but some browsers
+ * send keep-alive then don't re-use the connection. Since we can only accept one request at once,
+ * this blocks until our request read (above) times out. We probably should accept multiple
+ * requests in parallel, but it's easier for not to use close the socket.
+ */
+ socket->close();
}