修订代码,注释;fix #158

This commit is contained in:
e1732a364fed
2000-01-01 00:00:00 +00:00
parent 1eb4568792
commit 52e829fa00
4 changed files with 27 additions and 15 deletions

View File

@@ -66,7 +66,7 @@ type incomingInserverConnState struct {
isInner bool
inTag string //在inServer为nil时可用此项确定 inTag
inTag string //在inServer为nil时可用此项确定 inTag。比如tproxy就属于这种情况
useSniffing bool //在inServer为nil时可用此项确定 是否使用sniffing
cachedRemoteAddr string
@@ -114,7 +114,7 @@ func (iics *incomingInserverConnState) extractFirstBufFromErr(err error) bool {
//通过err找出 并赋值给 iics.theFallbackFirstBuffer
{
fe, ok := err.(*utils.ErrBuffer)
be, ok := err.(*utils.ErrBuffer)
if !ok {
// 能fallback 但是返回的 err却不是fallback err证明遇到了更大问题可能是底层read问题所以也不用继续fallback了
if iics.wrappedConn != nil {
@@ -123,7 +123,7 @@ func (iics *incomingInserverConnState) extractFirstBufFromErr(err error) bool {
return false
}
if firstbuffer := fe.Buf; firstbuffer == nil {
if firstbuffer := be.Buf; firstbuffer == nil {
//不应该至少能读到1字节的。
panic("No FirstBuffer")

30
main.go
View File

@@ -523,11 +523,25 @@ func handshakeInserver_and_passToOutClient(iics incomingInserverConnState) {
case utils.ErrHandled:
return
default:
default: //回落
if !iics.extractFirstBufFromErr(err) {
return
}
if iics.isTlsLazyServerEnd {
iics.isTlsLazyServerEnd = false
/*
我们这里取巧认为只要进行了回落那么客户端就一定不是vs客户端进而不再应用lazy
关联 issue #158
开启了lazy后如果进行回落了那么是要先从iics.firstbuffer 来读的但是目前lazy函数根本不接收 iics.
而回落一般用于正常客户端的浏览网页一般的客户端就是浏览器是不用lazy的所以可以如此取巧
*/
}
passToOutClient(iics, true, nil, nil, netLayer.Addr{})
}
@@ -847,7 +861,7 @@ func passToOutClient(iics incomingInserverConnState, isfallback bool, wlc net.Co
ce.Write(zap.Any("source", desc))
}
outtag := re.RoutePolicy.GetOutTag(desc)
outtag := re.RoutePolicy.CalcuOutTag(desc)
if len(re.ClientsTagMap) > 0 {
if tagC := re.GetClient(outtag); tagC != nil {
@@ -1038,24 +1052,24 @@ func dialClient(iics incomingInserverConnState, targetAddr netLayer.Addr,
if iics.fallbackXver >= 0 {
if iics.fallbackXver > 0 {
ce.Write(
zap.String("fallback from", iics.cachedRemoteAddr),
zap.String("target", targetAddr.UrlString()),
zap.String("Fallback from", iics.cachedRemoteAddr),
zap.String("Target", targetAddr.UrlString()),
zap.String("through", proxy.GetVSI_url(client)),
zap.Int("with xver", iics.fallbackXver),
)
} else {
ce.Write(
zap.String("fallback from", iics.cachedRemoteAddr),
zap.String("target", targetAddr.UrlString()),
zap.String("Fallback from", iics.cachedRemoteAddr),
zap.String("Target", targetAddr.UrlString()),
zap.String("through", proxy.GetVSI_url(client)),
)
}
} else {
ce.Write(
zap.String("from", iics.cachedRemoteAddr),
zap.String("target", targetAddr.UrlString()),
zap.String("From", iics.cachedRemoteAddr),
zap.String("Target", targetAddr.UrlString()),
zap.String("through", proxy.GetVSI_url(client)),
)
}

View File

@@ -284,10 +284,10 @@ func (rp *RoutePolicy) AddRouteSet(rs *RouteSet) {
}
}
// 返回一个 proxy.Client 的 tag。
// 根据td 以及 RoutePolicy的配置 计算出 一个 对应的 proxy.Client 的 tag。
// 默认情况下始终具有direct这个tag以及 proxy这个tag无需用户额外在配置文件中指定。
// 默认如果不匹配任何值的话,就会流向 "proxy" tag也就是客户设置的 remoteClient的值。
func (rp *RoutePolicy) GetOutTag(td *TargetDescription) string {
func (rp *RoutePolicy) CalcuOutTag(td *TargetDescription) string {
for _, rs := range rp.List {
if rs.IsIn(td) {
switch n := len(rs.OutTags); n {

View File

@@ -108,8 +108,6 @@ func (c *UserTCPConn) WriteBuffers(buffers [][]byte) (int64, error) {
}
//如果是udp则是多线程不安全的如果是tcp则安不安全看底层的链接。
// 这里规定如果是UDP则 每Write一遍都要Write一个 完整的UDP 数据包
func (c *UserTCPConn) Write(p []byte) (int, error) {
if c.version == 0 {