Commit 3c1cad92 authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

shrpx_client_handler: Use std::unique_ptr for upstream_

parent ab39ae84
...@@ -34,10 +34,12 @@ ...@@ -34,10 +34,12 @@
#include "shrpx_http_downstream_connection.h" #include "shrpx_http_downstream_connection.h"
#include "shrpx_spdy_downstream_connection.h" #include "shrpx_spdy_downstream_connection.h"
#include "shrpx_accesslog.h" #include "shrpx_accesslog.h"
#ifdef HAVE_SPDYLAY #ifdef HAVE_SPDYLAY
#include "shrpx_spdy_upstream.h" #include "shrpx_spdy_upstream.h"
#endif // HAVE_SPDYLAY #endif // HAVE_SPDYLAY
#include "util.h"
using namespace nghttp2;
namespace shrpx { namespace shrpx {
...@@ -214,7 +216,6 @@ ClientHandler::ClientHandler(bufferevent *bev, int fd, SSL *ssl, ...@@ -214,7 +216,6 @@ ClientHandler::ClientHandler(bufferevent *bev, int fd, SSL *ssl,
: bev_(bev), : bev_(bev),
fd_(fd), fd_(fd),
ssl_(ssl), ssl_(ssl),
upstream_(nullptr),
ipaddr_(ipaddr), ipaddr_(ipaddr),
should_close_after_write_(false), should_close_after_write_(false),
spdy_(nullptr), spdy_(nullptr),
...@@ -231,7 +232,7 @@ ClientHandler::ClientHandler(bufferevent *bev, int fd, SSL *ssl, ...@@ -231,7 +232,7 @@ ClientHandler::ClientHandler(bufferevent *bev, int fd, SSL *ssl,
// For non-TLS version, first create HttpsUpstream. It may be // For non-TLS version, first create HttpsUpstream. It may be
// upgraded to HTTP/2.0 through HTTP Upgrade or direct HTTP/2.0 // upgraded to HTTP/2.0 through HTTP Upgrade or direct HTTP/2.0
// connection. // connection.
upstream_ = new HttpsUpstream(this); upstream_ = util::make_unique<HttpsUpstream>(this);
set_bev_cb(upstream_http1_connhd_readcb, nullptr, upstream_eventcb); set_bev_cb(upstream_http1_connhd_readcb, nullptr, upstream_eventcb);
} }
} }
...@@ -251,7 +252,6 @@ ClientHandler::~ClientHandler() ...@@ -251,7 +252,6 @@ ClientHandler::~ClientHandler()
} }
shutdown(fd_, SHUT_WR); shutdown(fd_, SHUT_WR);
close(fd_); close(fd_);
delete upstream_;
for(std::set<DownstreamConnection*>::iterator i = dconn_pool_.begin(); for(std::set<DownstreamConnection*>::iterator i = dconn_pool_.begin();
i != dconn_pool_.end(); ++i) { i != dconn_pool_.end(); ++i) {
delete *i; delete *i;
...@@ -263,7 +263,7 @@ ClientHandler::~ClientHandler() ...@@ -263,7 +263,7 @@ ClientHandler::~ClientHandler()
Upstream* ClientHandler::get_upstream() Upstream* ClientHandler::get_upstream()
{ {
return upstream_; return upstream_.get();
} }
bufferevent* ClientHandler::get_bev() const bufferevent* ClientHandler::get_bev() const
...@@ -304,13 +304,13 @@ int ClientHandler::validate_next_proto() ...@@ -304,13 +304,13 @@ int ClientHandler::validate_next_proto()
if(proto == NGHTTP2_PROTO_VERSION_ID) { if(proto == NGHTTP2_PROTO_VERSION_ID) {
set_bev_cb(upstream_http2_connhd_readcb, upstream_writecb, set_bev_cb(upstream_http2_connhd_readcb, upstream_writecb,
upstream_eventcb); upstream_eventcb);
upstream_ = new Http2Upstream(this); upstream_ = util::make_unique<Http2Upstream>(this);
return 0; return 0;
} else { } else {
#ifdef HAVE_SPDYLAY #ifdef HAVE_SPDYLAY
uint16_t version = spdylay_npn_get_version(next_proto, next_proto_len); uint16_t version = spdylay_npn_get_version(next_proto, next_proto_len);
if(version) { if(version) {
upstream_ = new SpdyUpstream(version, this); upstream_ = util::make_unique<SpdyUpstream>(version, this);
return 0; return 0;
} }
#endif // HAVE_SPDYLAY #endif // HAVE_SPDYLAY
...@@ -323,7 +323,7 @@ int ClientHandler::validate_next_proto() ...@@ -323,7 +323,7 @@ int ClientHandler::validate_next_proto()
if(LOG_ENABLED(INFO)) { if(LOG_ENABLED(INFO)) {
CLOG(INFO, this) << "Use HTTP/1.1"; CLOG(INFO, this) << "Use HTTP/1.1";
} }
upstream_ = new HttpsUpstream(this); upstream_ = util::make_unique<HttpsUpstream>(this);
return 0; return 0;
} }
...@@ -425,20 +425,18 @@ void ClientHandler::set_left_connhd_len(size_t left) ...@@ -425,20 +425,18 @@ void ClientHandler::set_left_connhd_len(size_t left)
void ClientHandler::direct_http2_upgrade() void ClientHandler::direct_http2_upgrade()
{ {
delete upstream_; upstream_= util::make_unique<Http2Upstream>(this);
upstream_= new Http2Upstream(this);
set_bev_cb(upstream_readcb, upstream_writecb, upstream_eventcb); set_bev_cb(upstream_readcb, upstream_writecb, upstream_eventcb);
} }
int ClientHandler::perform_http2_upgrade(HttpsUpstream *http) int ClientHandler::perform_http2_upgrade(HttpsUpstream *http)
{ {
int rv; int rv;
auto upstream = new Http2Upstream(this); auto upstream = util::make_unique<Http2Upstream>(this);
if(upstream->upgrade_upstream(http) != 0) { if(upstream->upgrade_upstream(http) != 0) {
delete upstream;
return -1; return -1;
} }
upstream_ = upstream; upstream_ = std::move(upstream);
set_bev_cb(upstream_http2_connhd_readcb, upstream_writecb, upstream_eventcb); set_bev_cb(upstream_http2_connhd_readcb, upstream_writecb, upstream_eventcb);
static char res[] = "HTTP/1.1 101 Switching Protocols\r\n" static char res[] = "HTTP/1.1 101 Switching Protocols\r\n"
"Connection: Upgrade\r\n" "Connection: Upgrade\r\n"
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "shrpx.h" #include "shrpx.h"
#include <set> #include <set>
#include <memory>
#include <event.h> #include <event.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
...@@ -78,7 +79,7 @@ private: ...@@ -78,7 +79,7 @@ private:
bufferevent *bev_; bufferevent *bev_;
int fd_; int fd_;
SSL *ssl_; SSL *ssl_;
Upstream *upstream_; std::unique_ptr<Upstream> upstream_;
std::string ipaddr_; std::string ipaddr_;
bool should_close_after_write_; bool should_close_after_write_;
std::set<DownstreamConnection*> dconn_pool_; std::set<DownstreamConnection*> dconn_pool_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment