Skip to content

Commit bb1afcc

Browse files
committed
add more tests
1 parent d3b03e4 commit bb1afcc

File tree

7 files changed

+609
-46
lines changed

7 files changed

+609
-46
lines changed

Dockerfile.mod

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
FROM golang:1-alpine as builder
2+
3+
RUN apk add --no-cache musl-dev git gcc
4+
5+
ADD . /data
6+
7+
WORKDIR /data
8+
9+
ENV GO111MODULE=on
10+
11+
RUN cd cmd/gost && go build
12+
13+
FROM alpine:latest
14+
15+
WORKDIR /bin/
16+
17+
COPY --from=builder /data/cmd/gost/gost .
18+
19+
RUN /bin/gost -V
20+
21+
ENTRYPOINT ["/bin/gost"]

cmd/gost/route.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ func parseChainNode(ns string) (nodes []gost.Node, err error) {
110110
wsOpts.WriteBufferSize = node.GetInt("wbuf")
111111
wsOpts.UserAgent = node.Get("agent")
112112

113+
var host string
114+
113115
var tr gost.Transporter
114116
switch node.Transport {
115117
case "tls":
@@ -160,6 +162,7 @@ func parseChainNode(ns string) (nodes []gost.Node, err error) {
160162
case "obfs4":
161163
tr = gost.Obfs4Transporter()
162164
case "ohttp":
165+
host = node.Get("host")
163166
tr = gost.ObfsHTTPTransporter()
164167
default:
165168
tr = gost.TCPTransporter()
@@ -197,9 +200,12 @@ func parseChainNode(ns string) (nodes []gost.Node, err error) {
197200
gost.TimeoutDialOption(time.Duration(timeout)*time.Second),
198201
)
199202

203+
if host == "" {
204+
host = node.Host
205+
}
200206
handshakeOptions := []gost.HandshakeOption{
201207
gost.AddrHandshakeOption(node.Addr),
202-
gost.HostHandshakeOption(node.Host),
208+
gost.HostHandshakeOption(host),
203209
gost.UserHandshakeOption(node.User),
204210
gost.TLSConfigHandshakeOption(tlsCfg),
205211
gost.IntervalHandshakeOption(time.Duration(node.GetInt("ping")) * time.Second),

http2.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ func HTTP2Connector(user *url.Userinfo) Connector {
3434
}
3535

3636
func (c *http2Connector) Connect(conn net.Conn, addr string, options ...ConnectOption) (net.Conn, error) {
37+
opts := &ConnectOptions{}
38+
for _, option := range options {
39+
option(opts)
40+
}
41+
3742
cc, ok := conn.(*http2ClientConn)
3843
if !ok {
3944
return nil, errors.New("wrong connection type")
@@ -142,7 +147,7 @@ func (tr *http2Transporter) Dial(addr string, options ...DialOption) (net.Conn,
142147
}
143148
client = &http.Client{
144149
Transport: &transport,
145-
Timeout: timeout,
150+
// Timeout: timeout,
146151
}
147152
tr.clients[addr] = client
148153
}
@@ -214,7 +219,7 @@ func (tr *h2Transporter) Dial(addr string, options ...DialOption) (net.Conn, err
214219
}
215220
client = &http.Client{
216221
Transport: &transport,
217-
Timeout: timeout,
222+
// Timeout: timeout,
218223
}
219224
tr.clients[addr] = client
220225
}

obfs.go

Lines changed: 25 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,7 @@ func (l *obfsHTTPListener) Accept() (net.Conn, error) {
6767
type obfsHTTPConn struct {
6868
net.Conn
6969
host string
70-
request *http.Request
71-
response *http.Response
72-
rbuf []byte
73-
wbuf []byte
70+
buf []byte
7471
isServer bool
7572
handshaked bool
7673
handshakeMutex sync.Mutex
@@ -99,19 +96,19 @@ func (c *obfsHTTPConn) Handshake() (err error) {
9996

10097
func (c *obfsHTTPConn) serverHandshake() (err error) {
10198
br := bufio.NewReader(c.Conn)
102-
c.request, err = http.ReadRequest(br)
99+
r, err := http.ReadRequest(br)
103100
if err != nil {
104101
return
105102
}
106103
if Debug {
107-
dump, _ := httputil.DumpRequest(c.request, false)
104+
dump, _ := httputil.DumpRequest(r, false)
108105
log.Logf("[ohttp] %s -> %s\n%s", c.Conn.RemoteAddr(), c.Conn.LocalAddr(), string(dump))
109106
}
110107

111-
if br.Buffered() > 0 {
112-
c.rbuf, err = br.Peek(br.Buffered())
108+
if r.ContentLength > 0 {
109+
c.buf, err = ioutil.ReadAll(r.Body)
113110
} else {
114-
c.rbuf, err = ioutil.ReadAll(c.request.Body)
111+
c.buf, err = br.Peek(br.Buffered())
115112
}
116113

117114
if err != nil {
@@ -120,13 +117,13 @@ func (c *obfsHTTPConn) serverHandshake() (err error) {
120117
}
121118

122119
b := bytes.Buffer{}
123-
if c.request.Header.Get("Upgrade") == "websocket" {
120+
if r.Header.Get("Upgrade") == "websocket" {
124121
b.WriteString("HTTP/1.1 101 Switching Protocols\r\n")
125122
b.WriteString("Server: nginx/1.10.0\r\n")
126123
b.WriteString("Date: " + time.Now().Format(time.RFC1123) + "\r\n")
127124
b.WriteString("Connection: Upgrade\r\n")
128125
b.WriteString("Upgrade: websocket\r\n")
129-
b.WriteString(fmt.Sprintf("Sec-WebSocket-Accept: %s\r\n", computeAcceptKey(c.request.Header.Get("Sec-WebSocket-Key"))))
126+
b.WriteString(fmt.Sprintf("Sec-WebSocket-Accept: %s\r\n", computeAcceptKey(r.Header.Get("Sec-WebSocket-Key"))))
130127
b.WriteString("\r\n")
131128
} else {
132129
b.WriteString("HTTP/1.1 200 OK\r\n")
@@ -146,24 +143,19 @@ func (c *obfsHTTPConn) serverHandshake() (err error) {
146143
}
147144

148145
func (c *obfsHTTPConn) clientHandshake() (err error) {
149-
r := c.request
150-
if r == nil {
151-
r = &http.Request{
152-
Method: http.MethodGet,
153-
ProtoMajor: 1,
154-
ProtoMinor: 1,
155-
URL: &url.URL{Scheme: "http", Host: c.host},
156-
Header: make(http.Header),
157-
}
158-
r.Header.Set("Connection", "keep-alive")
159-
r.Header.Set("Upgrade", "websocket")
160-
r.Header.Set("User-Agent", DefaultUserAgent)
161-
if len(c.wbuf) > 0 {
162-
log.Log("write buf", len(c.wbuf))
163-
r.Body = ioutil.NopCloser(bytes.NewReader(c.wbuf))
164-
r.ContentLength = int64(len(c.wbuf))
165-
}
166-
}
146+
r := &http.Request{
147+
Method: http.MethodGet,
148+
ProtoMajor: 1,
149+
ProtoMinor: 1,
150+
URL: &url.URL{Scheme: "http", Host: c.host},
151+
Header: make(http.Header),
152+
}
153+
r.Header.Set("User-Agent", "curl/7.49.1")
154+
r.Header.Set("Connection", "Upgrade")
155+
r.Header.Set("Upgrade", "websocket")
156+
key, _ := generateChallengeKey()
157+
r.Header.Set("Sec-WebSocket-Key", key)
158+
167159
if err = r.Write(c.Conn); err != nil {
168160
return
169161
}
@@ -182,31 +174,26 @@ func (c *obfsHTTPConn) clientHandshake() (err error) {
182174
dump, _ := httputil.DumpResponse(resp, false)
183175
log.Logf("[ohttp] %s <- %s\n%s", c.Conn.LocalAddr(), c.Conn.RemoteAddr(), string(dump))
184176
}
177+
185178
return nil
186179
}
187180

188181
func (c *obfsHTTPConn) Read(b []byte) (n int, err error) {
189182
if err = c.Handshake(); err != nil {
190183
return
191184
}
192-
if len(c.rbuf) > 0 {
193-
n = copy(b, c.rbuf)
194-
c.rbuf = c.rbuf[n:]
185+
if len(c.buf) > 0 {
186+
n = copy(b, c.buf)
187+
c.buf = c.buf[n:]
195188
return
196189
}
197190
return c.Conn.Read(b)
198191
}
199192

200193
func (c *obfsHTTPConn) Write(b []byte) (n int, err error) {
201-
handshaked := c.handshaked
202-
c.wbuf = b
203194
if err = c.Handshake(); err != nil {
204195
return
205196
}
206-
if !handshaked {
207-
n = len(c.wbuf)
208-
return
209-
}
210197
return c.Conn.Write(b)
211198
}
212199

0 commit comments

Comments
 (0)