Close #66 修正POP/IMAP等服务端首先发送数据的协议处理异常的问题
* 原实现在upstream连接成功时,立即使能了EV_READ事件。在downstream创建成功以前,无法正确转发upstream发来的数据; * 现修正为,在upstream, downstream都创建成功时,再使能upstream, downstream的EV_READ事件。
This commit is contained in:
@@ -31,6 +31,7 @@
|
|||||||
#include <tcp_stream.h>
|
#include <tcp_stream.h>
|
||||||
#include <proxy.h>
|
#include <proxy.h>
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
|
#include <event2/bufferevent_struct.h>
|
||||||
|
|
||||||
#ifndef TFE_CONFIG_OUTPUT_LIMIT_DEFAULT
|
#ifndef TFE_CONFIG_OUTPUT_LIMIT_DEFAULT
|
||||||
#define TFE_CONFIG_OUTPUT_LIMIT_DEFAULT (1024 * 1024)
|
#define TFE_CONFIG_OUTPUT_LIMIT_DEFAULT (1024 * 1024)
|
||||||
@@ -265,8 +266,7 @@ static tfe_conn_private * __conn_private_create_by_bev(struct tfe_stream_private
|
|||||||
__conn_private->fd = bufferevent_getfd(bev);
|
__conn_private->fd = bufferevent_getfd(bev);
|
||||||
|
|
||||||
bufferevent_setcb(__conn_private->bev, __stream_bev_readcb, __stream_bev_writecb, __stream_bev_eventcb, stream);
|
bufferevent_setcb(__conn_private->bev, __stream_bev_readcb, __stream_bev_writecb, __stream_bev_eventcb, stream);
|
||||||
bufferevent_enable(__conn_private->bev, EV_READ | EV_WRITE);
|
bufferevent_disable(__conn_private->bev, EV_READ | EV_WRITE);
|
||||||
|
|
||||||
return __conn_private;
|
return __conn_private;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -691,6 +691,7 @@ static tfe_conn_private * __conn_private_create_by_fd(struct tfe_stream_private
|
|||||||
__conn_private->bev = bufferevent_socket_new(__ev_base, fd, BEV_OPT_DEFER_CALLBACKS);
|
__conn_private->bev = bufferevent_socket_new(__ev_base, fd, BEV_OPT_DEFER_CALLBACKS);
|
||||||
__conn_private->fd = fd;
|
__conn_private->fd = fd;
|
||||||
|
|
||||||
|
struct bufferevent * __bev = __conn_private->bev;
|
||||||
if (!__conn_private->bev)
|
if (!__conn_private->bev)
|
||||||
{
|
{
|
||||||
TFE_LOG_ERROR(__STREAM_LOGGER(stream), "Failed at creating bufferevent for fd %d", fd);
|
TFE_LOG_ERROR(__STREAM_LOGGER(stream), "Failed at creating bufferevent for fd %d", fd);
|
||||||
@@ -708,6 +709,7 @@ static tfe_conn_private * __conn_private_create_by_fd(struct tfe_stream_private
|
|||||||
__stream_bev_writecb, __stream_bev_eventcb, stream);
|
__stream_bev_writecb, __stream_bev_eventcb, stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bufferevent_disable(__conn_private->bev, EV_READ | EV_WRITE);
|
||||||
return __conn_private;
|
return __conn_private;
|
||||||
|
|
||||||
__errout:
|
__errout:
|
||||||
@@ -746,7 +748,8 @@ void ssl_downstream_create_on_fail(enum e_future_error err, const char * what, v
|
|||||||
struct tfe_stream_private * _stream = (struct tfe_stream_private *) user;
|
struct tfe_stream_private * _stream = (struct tfe_stream_private *) user;
|
||||||
assert(_stream != NULL && _stream->session_type == STREAM_PROTO_SSL);
|
assert(_stream != NULL && _stream->session_type == STREAM_PROTO_SSL);
|
||||||
|
|
||||||
TFE_STREAM_LOG_ERROR(_stream, "Failed to create SSL downstream, close the connection : %s. ", what);
|
TFE_STREAM_LOG_ERROR(_stream, "%s - Failed to create SSL downstream, close the connection : %s. ",
|
||||||
|
_stream->str_stream_addr, what);
|
||||||
|
|
||||||
/* There is nothing we can do because upstream has been handshake,
|
/* There is nothing we can do because upstream has been handshake,
|
||||||
* Close the stream */
|
* Close the stream */
|
||||||
@@ -786,8 +789,10 @@ void ssl_upstream_create_on_fail(enum e_future_error err, const char * what, voi
|
|||||||
struct tfe_stream_private * _stream = (struct tfe_stream_private *) user;
|
struct tfe_stream_private * _stream = (struct tfe_stream_private *) user;
|
||||||
assert(_stream != NULL && _stream->session_type == STREAM_PROTO_SSL);
|
assert(_stream != NULL && _stream->session_type == STREAM_PROTO_SSL);
|
||||||
|
|
||||||
TFE_STREAM_LOG_ERROR(_stream, "Failed to create SSL upstream, pass-through the connection : %s. ", what);
|
TFE_STREAM_LOG_ERROR(_stream, "%s - Failed to create SSL upstream, pass-through the connection : %s. ",
|
||||||
|
_stream->str_stream_addr, what);
|
||||||
|
|
||||||
|
_stream->passthough = true;
|
||||||
_stream->conn_downstream = __conn_private_create_by_fd(_stream, _stream->defer_fd_downstream);
|
_stream->conn_downstream = __conn_private_create_by_fd(_stream, _stream->defer_fd_downstream);
|
||||||
_stream->conn_upstream = __conn_private_create_by_fd(_stream, _stream->defer_fd_downstream);
|
_stream->conn_upstream = __conn_private_create_by_fd(_stream, _stream->defer_fd_downstream);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user