diff --git a/include/opendht/http.h b/include/opendht/http.h index 947414a22947c33747bf7c6d2614799b681e3568..cccbe18da0ddf3234160a0a45e372032c9603be8 100644 --- a/include/opendht/http.h +++ b/include/opendht/http.h @@ -310,7 +310,7 @@ private: restinio::http_request_header_t header_; std::map<restinio::http_field_t, std::string> headers_; - restinio::http_connection_header_t connection_type_; + restinio::http_connection_header_t connection_type_ {restinio::http_connection_header_t::close}; std::string body_; std::mutex cbs_mutex_; diff --git a/src/dht_proxy_client.cpp b/src/dht_proxy_client.cpp index 3495802a6029f2a97ab5a5f0417702382ef71cba..275923dda998082d10a1ebcd5e92cb0437bcdafd 100644 --- a/src/dht_proxy_client.cpp +++ b/src/dht_proxy_client.cpp @@ -270,9 +270,9 @@ DhtProxyClient::get(const InfoHash& key, GetCallback cb, DoneCallback donecb, Va if (logger_) logger_->d("[proxy:client] [get] [search %s]", key.to_c_str()); - auto request = buildRequest("/" + key.toString()); - auto reqid = request->id(); try { + auto request = buildRequest("/" + key.toString()); + auto reqid = request->id(); request->set_connection_type(restinio::http_connection_header_t::keep_alive); request->set_method(restinio::http_method_get()); setHeaderFields(*request); @@ -343,7 +343,6 @@ DhtProxyClient::get(const InfoHash& key, GetCallback cb, DoneCallback donecb, Va catch (const std::exception &e){ if (logger_) logger_->e("[proxy:client] [get %s] error: %s", key.to_c_str(), e.what()); - requests_.erase(reqid); } } @@ -438,9 +437,9 @@ DhtProxyClient::doPut(const InfoHash& key, Sp<Value> val, DoneCallbackSimple cb, if (logger_) logger_->d("[proxy:client] [put] [search %s] executing for %s", key.to_c_str(), val->toString().c_str()); - auto request = buildRequest("/" + key.toString()); - auto reqid = request->id(); try { + auto request = buildRequest("/" + key.toString()); + auto reqid = request->id(); request->set_method(restinio::http_method_post()); setHeaderFields(*request); @@ -480,7 +479,6 @@ DhtProxyClient::doPut(const InfoHash& key, Sp<Value> val, DoneCallbackSimple cb, catch (const std::exception &e){ if (logger_) logger_->e("[proxy:client] [put %s] error: %s", key.to_c_str(), e.what()); - requests_.erase(reqid); } } @@ -564,9 +562,9 @@ DhtProxyClient::queryProxyInfo(std::shared_ptr<InfoState> infoState, sa_family_t { if (logger_) logger_->d("[proxy:client] [status] query ipv%i info", family == AF_INET ? 4 : 6); - auto request = std::make_shared<http::Request>(httpContext_, resolver, family); - auto reqid = request->id(); try { + auto request = std::make_shared<http::Request>(httpContext_, resolver, family); + auto reqid = request->id(); request->set_method(restinio::http_method_get()); setHeaderFields(*request); request->add_on_state_change_callback([this, reqid, family, infoState] @@ -605,7 +603,6 @@ DhtProxyClient::queryProxyInfo(std::shared_ptr<InfoState> infoState, sa_family_t catch (const std::exception &e){ if (logger_) logger_->e("[proxy:client] [status] error sending request: %s", e.what()); - requests_.erase(reqid); } } @@ -901,10 +898,10 @@ DhtProxyClient::sendListen(const restinio::http_request_header_t header, { if (logger_) logger_->e("[proxy:client] [listen] sendListen: %d", (int)method); - auto request = buildRequest(); - listener.request = request; - auto reqid = request->id(); try { + auto request = buildRequest(); + listener.request = request; + auto reqid = request->id(); request->set_header(header); setHeaderFields(*request); if (method == ListenMethod::LISTEN) @@ -973,8 +970,7 @@ DhtProxyClient::sendListen(const restinio::http_request_header_t header, } catch (const std::exception &e){ if (logger_) - logger_->e("[proxy:client] [listen] request #%i failed: %s", reqid, e.what()); - requests_.erase(reqid); + logger_->e("[proxy:client] [listen] request failed: %s", e.what()); } } diff --git a/src/http.cpp b/src/http.cpp index 42d654030f4f3b04df46fd187e5df2d716921c59..8f80dffa7fffadde567bafaf3575655de9d2f940 100644 --- a/src/http.cpp +++ b/src/http.cpp @@ -624,14 +624,15 @@ Request::build() std::string conn_str = ""; switch (connection_type_){ case restinio::http_connection_header_t::upgrade: - throw std::invalid_argument("upgrade"); + if (logger_) + logger_->e("Unsupported connection type 'upgrade', fallback to 'close'"); + // fallthrough + case restinio::http_connection_header_t::close: + conn_str = "close"; break; case restinio::http_connection_header_t::keep_alive: conn_str = "keep-alive"; break; - case restinio::http_connection_header_t::close: - conn_str = "close"; - connection_type_ = restinio::http_connection_header_t::close; } if (!conn_str.empty()) request << "Connection: " << conn_str << "\r\n";