mirror of
https://github.com/e1732a364fed/v2ray_simple.git
synced 2025-12-24 13:27:56 +08:00
http添加no_resp_h_c配置,遇到http响应后绕过默认响应头
这样可以配合真实服务器响应.
This commit is contained in:
@@ -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 文档中所描述的默认值
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user