@@ -67,10 +67,7 @@ func (l *obfsHTTPListener) Accept() (net.Conn, error) {
67
67
type obfsHTTPConn struct {
68
68
net.Conn
69
69
host string
70
- request * http.Request
71
- response * http.Response
72
- rbuf []byte
73
- wbuf []byte
70
+ buf []byte
74
71
isServer bool
75
72
handshaked bool
76
73
handshakeMutex sync.Mutex
@@ -99,19 +96,19 @@ func (c *obfsHTTPConn) Handshake() (err error) {
99
96
100
97
func (c * obfsHTTPConn ) serverHandshake () (err error ) {
101
98
br := bufio .NewReader (c .Conn )
102
- c . request , err = http .ReadRequest (br )
99
+ r , err : = http .ReadRequest (br )
103
100
if err != nil {
104
101
return
105
102
}
106
103
if Debug {
107
- dump , _ := httputil .DumpRequest (c . request , false )
104
+ dump , _ := httputil .DumpRequest (r , false )
108
105
log .Logf ("[ohttp] %s -> %s\n %s" , c .Conn .RemoteAddr (), c .Conn .LocalAddr (), string (dump ))
109
106
}
110
107
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 )
113
110
} else {
114
- c .rbuf , err = ioutil . ReadAll ( c . request . Body )
111
+ c .buf , err = br . Peek ( br . Buffered () )
115
112
}
116
113
117
114
if err != nil {
@@ -120,13 +117,13 @@ func (c *obfsHTTPConn) serverHandshake() (err error) {
120
117
}
121
118
122
119
b := bytes.Buffer {}
123
- if c . request .Header .Get ("Upgrade" ) == "websocket" {
120
+ if r .Header .Get ("Upgrade" ) == "websocket" {
124
121
b .WriteString ("HTTP/1.1 101 Switching Protocols\r \n " )
125
122
b .WriteString ("Server: nginx/1.10.0\r \n " )
126
123
b .WriteString ("Date: " + time .Now ().Format (time .RFC1123 ) + "\r \n " )
127
124
b .WriteString ("Connection: Upgrade\r \n " )
128
125
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" ))))
130
127
b .WriteString ("\r \n " )
131
128
} else {
132
129
b .WriteString ("HTTP/1.1 200 OK\r \n " )
@@ -146,24 +143,19 @@ func (c *obfsHTTPConn) serverHandshake() (err error) {
146
143
}
147
144
148
145
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
+
167
159
if err = r .Write (c .Conn ); err != nil {
168
160
return
169
161
}
@@ -182,31 +174,26 @@ func (c *obfsHTTPConn) clientHandshake() (err error) {
182
174
dump , _ := httputil .DumpResponse (resp , false )
183
175
log .Logf ("[ohttp] %s <- %s\n %s" , c .Conn .LocalAddr (), c .Conn .RemoteAddr (), string (dump ))
184
176
}
177
+
185
178
return nil
186
179
}
187
180
188
181
func (c * obfsHTTPConn ) Read (b []byte ) (n int , err error ) {
189
182
if err = c .Handshake (); err != nil {
190
183
return
191
184
}
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 :]
195
188
return
196
189
}
197
190
return c .Conn .Read (b )
198
191
}
199
192
200
193
func (c * obfsHTTPConn ) Write (b []byte ) (n int , err error ) {
201
- handshaked := c .handshaked
202
- c .wbuf = b
203
194
if err = c .Handshake (); err != nil {
204
195
return
205
196
}
206
- if ! handshaked {
207
- n = len (c .wbuf )
208
- return
209
- }
210
197
return c .Conn .Write (b )
211
198
}
212
199
0 commit comments