http添加no_resp_h_c配置,遇到http响应后绕过默认响应头

这样可以配合真实服务器响应.
This commit is contained in:
e1732a364fed
2000-01-01 00:00:00 +00:00
parent 0f527cfba4
commit dbed52a11e
3 changed files with 49 additions and 5 deletions

View File

@@ -11,6 +11,13 @@ key = "cert.key"
advancedLayer = "ws"
path = "/very"
# 用于读取 回落到 真实http服务器的情况此时我们就不用自定义的响应而是用 真实服务器的响应。
# no_resp_h_c 意思是 no response header conditional
# header.no_resp_h_c = true
# 下面是 http伪装头的 配置
# 完全兼容v2ray, 可参考 https://www.v2fly.org/config/transport/tcp.html#httprequestobject
# 默认值 完全等同于 v2ray 文档中所描述的默认值

View File

@@ -89,7 +89,8 @@ type HeaderPreset struct {
Request *RequestHeader `toml:"request"`
Response *ResponseHeader `toml:"response"`
Strict bool `toml:"strict"`
Strict bool `toml:"strict"`
NoResponseHeaderWhenGotHttpResponse bool `toml:"no_resp_h_c"` //用于读取 回落到 真实http服务器的情况此时我们就不用自定义的响应而是用 真实服务器的响应。no_resp_h_c 意思是 no response header conditional
}
// 将Header改为首字母大写
@@ -399,9 +400,26 @@ func (c *HeaderConn) Write(p []byte) (n int, err error) {
if c.IsServerEnd {
if c.notFirstWrite {
return c.Conn.Write(p)
} else {
c.notFirstWrite = true
var shouldWriteDirectly bool
if c.H.NoResponseHeaderWhenGotHttpResponse {
if len(p) > 5 && string(p[:4]) == "HTTP" {
shouldWriteDirectly = true
}
}
if shouldWriteDirectly {
return c.Conn.Write(p)
} else {
err = c.H.WriteResponse(c.Conn, p)
}
}
c.notFirstWrite = true
err = c.H.WriteResponse(c.Conn, p)
} else {

View File

@@ -8,17 +8,28 @@ import (
"github.com/e1732a364fed/v2ray_simple/httpLayer"
"github.com/e1732a364fed/v2ray_simple/netLayer"
"github.com/e1732a364fed/v2ray_simple/utils"
"go.uber.org/zap"
)
const RejectName = "reject"
func tryRejectWithHttpRespAndClose(rejectType string, underlay net.Conn) {
switch rejectType {
default:
if ce := utils.CanLogDebug("reject server got unimplemented rejectType. Use default response instead."); ce != nil {
ce.Write(
zap.String("type", rejectType),
)
}
fallthrough
case "http":
underlay.Write([]byte(httpLayer.Err403response))
case "nginx":
SetCommonReadTimeout(underlay)
bs := utils.GetPacket()
defer utils.PutPacket(bs)
n, err := underlay.Read(bs)
if err == nil && n > 0 {
@@ -26,14 +37,22 @@ func tryRejectWithHttpRespAndClose(rejectType string, underlay net.Conn) {
_, _, _, _, failreason := httpLayer.ParseH1Request(bs, false)
if failreason == 0 {
underlay.Write([]byte(httpLayer.GetNginx403Response())) //forbiden
} else {
underlay.Write([]byte(httpLayer.GetNginx400Response())) //bad request, for non-http (illegal) request
}
}
} else {
if ce := utils.CanLogDebug("reject server got Read error"); ce != nil {
ce.Write(
zap.Error(err),
)
}
}
}
underlay.Close()
underlay.Close() //实测如果不Write 响应就算Close掉客户端的连接也不会真正被关闭
}
//implements ClientCreator for reject