From 0f67ba1790662de41ede823729732b5f1a7fb9d3 Mon Sep 17 00:00:00 2001 From: Lu Qiuwen Date: Tue, 18 Sep 2018 18:47:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3HTTP=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=B1=82=E4=B8=A2=E5=A4=B1=E9=83=A8=E5=88=86=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BF=AE=E6=AD=A3SSL=20Ses?= =?UTF-8?q?sion=20Reuse=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0=E6=AE=B5?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98=20*=20=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3HTTP=E8=A7=A3=E6=9E=90=E5=B1=82=E4=B8=A2=E5=A4=B1?= =?UTF-8?q?=E9=83=A8=E5=88=86=E8=AF=B7=E6=B1=82=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E5=8E=9F=E5=9B=9B=E5=B1=82=E8=BF=9E=E6=8E=A5=E5=9C=A8?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E6=AC=A1=E8=B0=83open=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E4=BC=9A=E8=B0=83data=E5=9B=9E=E8=B0=83=E5=87=BD?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E7=8E=B0=E4=BF=AE=E6=AD=A3=EF=BC=9B=20*=20?= =?UTF-8?q?=E5=8E=9F=E5=AE=9E=E7=8E=B0=E5=8F=AA=E8=AE=BE=E7=BD=AE=E4=BA=86?= =?UTF-8?q?SSL=E7=9A=84user=20define=20ctx=EF=BC=8C=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E8=AE=BE=E7=BD=AESSL=5FCTX=E7=9A=84user=20define=20ctx?= =?UTF-8?q?=EF=BC=8C=E7=8E=B0=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platform/src/ssl_stream.cpp | 3 +- platform/src/tcp_stream.cpp | 77 ++++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/platform/src/ssl_stream.cpp b/platform/src/ssl_stream.cpp index 19b73c5..39a7f1a 100644 --- a/platform/src/ssl_stream.cpp +++ b/platform/src/ssl_stream.cpp @@ -1033,7 +1033,8 @@ static SSL * downstream_ssl_create(struct ssl_mgr * mgr, struct keyring * crt) SSL_CTX_set_session_cache_mode(sslctx, SSL_SESS_CACHE_SERVER | SSL_SESS_CACHE_NO_INTERNAL); SSL_CTX_set_session_id_context(sslctx, (const unsigned char *) mgr->ssl_session_context, sizeof(mgr->ssl_session_context)); - + ret = SSL_CTX_set_ex_data(sslctx, SSL_EX_DATA_IDX_SSLMGR, mgr); + assert(ret == 1); if (mgr->dh) { SSL_CTX_set_tmp_dh(sslctx, mgr->dh); diff --git a/platform/src/tcp_stream.cpp b/platform/src/tcp_stream.cpp index dc6606d..0b64a2d 100644 --- a/platform/src/tcp_stream.cpp +++ b/platform/src/tcp_stream.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -337,10 +338,15 @@ static void __stream_bev_readcb(struct bufferevent * bev, void * arg) if (_stream->is_plugin_opened == 0) { - p_info_iter->on_open(&_stream->head, _stream->thread_ref->thread_id, dir, &(plug_ctx->pme)); + if (p_info_iter->on_open != NULL) + { + p_info_iter->on_open(&_stream->head, _stream->thread_ref->thread_id, dir, &(plug_ctx->pme)); + } + _stream->is_plugin_opened = 1; } - else + + if (p_info_iter->on_data != NULL) { action_tmp = p_info_iter->on_data(&_stream->head, _stream->thread_ref->thread_id, dir, contiguous_data, contigous_len, &(plug_ctx->pme)); @@ -634,6 +640,67 @@ void tfe_stream_destory(struct tfe_stream_private * stream) thread->load--; } +static struct tfe_stream_addr * __stream_addr_create_by_fds(struct tfe_stream * stream, evutil_socket_t fd_downstream) +{ + struct tfe_stream_addr * __stream_addr = NULL; + + struct sockaddr_storage sk_src_storage{}; + struct sockaddr * sk_src_ptr = (struct sockaddr *) &sk_src_storage; + socklen_t sk_src_len = sizeof(sk_src_storage); + + struct sockaddr_storage sk_dst_storage{}; + struct sockaddr * sk_dst_ptr = (struct sockaddr *) &sk_dst_storage; + socklen_t sk_dst_len = sizeof(sk_dst_storage); + + int ret = getsockname(fd_downstream, sk_src_ptr, &sk_src_len); + if (unlikely(ret < 0)) + { + TFE_STREAM_LOG_ERROR(stream, "Failed at calling getsockaddr() for fd %d : %s", fd_downstream, strerror(errno)); + goto __errout; + } + + ret = getpeername(fd_downstream, sk_dst_ptr, &sk_dst_len); + if (unlikely(ret < 0)) + { + TFE_STREAM_LOG_ERROR(stream, "Failed at calling getpeername() for fd %d : %s", fd_downstream, strerror(errno)); + goto __errout; + } + + assert(sk_src_ptr->sa_family == sk_dst_ptr->sa_family); + if (sk_src_ptr->sa_family == AF_INET) + { + __stream_addr = (struct tfe_stream_addr *) malloc( + sizeof(struct tfe_stream_addr) + sizeof(struct tfe_stream_addr_tuple4_v4)); + + struct tfe_stream_addr_ipv4 * st_addr_v4 = __stream_addr->ipv4; + struct sockaddr_in * sk_v4_src_ptr = (struct sockaddr_in *)sk_src_ptr; + struct sockaddr_in * sk_v4_dst_ptr = (struct sockaddr_in *)sk_dst_ptr; + + __stream_addr->addrtype = TFE_ADDR_STREAM_TUPLE4_V4; + __stream_addr->addrlen = sizeof(struct tfe_stream_addr_tuple4_v4); + + st_addr_v4->saddr.s_addr = sk_v4_src_ptr->sin_addr.s_addr; + st_addr_v4->source = sk_v4_src_ptr->sin_port; + st_addr_v4->daddr.s_addr = sk_v4_dst_ptr->sin_addr.s_addr; + st_addr_v4->dest = sk_v4_dst_ptr->sin_port; + } + else if (sk_src_ptr->sa_family == AF_INET6) + { + assert(0); + } + else + { + TFE_STREAM_LOG_ERROR(stream, "Invalid sockaddr family for fd %d: sa_family is %d.", + fd_downstream, sk_src_ptr->sa_family); goto __errout; + } + + return __stream_addr; + +__errout: + if (__stream_addr != NULL) free(__stream_addr); + return NULL; +} + void tfe_stream_init_by_fds(struct tfe_stream * stream, evutil_socket_t fd_downstream, evutil_socket_t fd_upstream) { struct tfe_stream_private * _stream = container_of(stream, struct tfe_stream_private, head); @@ -645,6 +712,12 @@ void tfe_stream_init_by_fds(struct tfe_stream * stream, evutil_socket_t fd_downs evutil_make_socket_nonblocking(fd_downstream); evutil_make_socket_nonblocking(fd_upstream); + _stream->head.addr = __stream_addr_create_by_fds(stream, fd_downstream); + if(unlikely(_stream->head.addr == NULL)) + { + assert(0); + } + if (_stream->session_type == STREAM_PROTO_PLAIN) { _stream->conn_downstream = __conn_private_create_by_fd(_stream, fd_downstream);