commit baf34b96cf3969eb0a517d5993a39632e98c2f26 Author: David Fifield david@bamsoftware.com Date: Sat Mar 22 00:13:11 2014 -0700
Move helper code to its own file. --- meek-client/helper.go | 104 ++++++++++++++++++++++++++++++++++++++++++++ meek-client/meek-client.go | 90 -------------------------------------- 2 files changed, 104 insertions(+), 90 deletions(-)
diff --git a/meek-client/helper.go b/meek-client/helper.go new file mode 100644 index 0000000..98fd771 --- /dev/null +++ b/meek-client/helper.go @@ -0,0 +1,104 @@ +package main + +import ( + "bytes" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "time" +) + +// The code in this file has to do communicating with the meek-http-helper +// browser extension. + +type JSONRequest struct { + Method string `json:"method,omitempty"` + URL string `json:"url,omitempty"` + Header map[string]string `json:"header,omitempty"` + Body []byte `json:"body,omitempty"` +} + +type JSONResponse struct { + Error string `json:"error,omitempty"` + Status int `json:"status"` + Body []byte `json:"body"` +} + +// Ask a locally running browser extension to make the request for us. +func roundTripWithHelper(buf []byte, info *RequestInfo) (*http.Response, error) { + s, err := net.DialTCP("tcp", nil, options.HelperAddr) + if err != nil { + return nil, err + } + defer s.Close() + + // Encode our JSON. + req := JSONRequest{ + Method: "POST", + URL: info.URL.String(), + Header: make(map[string]string), + Body: buf, + } + req.Header["X-Session-Id"] = info.SessionID + if info.Host != "" { + req.Header["Host"] = info.Host + } + encReq, err := json.Marshal(&req) + if err != nil { + return nil, err + } + // log.Printf("encoded %s", encReq) + + // Send the request. + s.SetWriteDeadline(time.Now().Add(helperWriteTimeout)) + err = binary.Write(s, binary.BigEndian, uint32(len(encReq))) + if err != nil { + return nil, err + } + _, err = s.Write(encReq) + if err != nil { + return nil, err + } + + // Read the response. + var length uint32 + s.SetReadDeadline(time.Now().Add(helperReadTimeout)) + err = binary.Read(s, binary.BigEndian, &length) + if err != nil { + return nil, err + } + if length > maxHelperResponseLength { + return nil, errors.New(fmt.Sprintf("helper's returned data is too big (%d > %d)", + length, maxHelperResponseLength)) + } + encResp := make([]byte, length) + _, err = io.ReadFull(s, encResp) + if err != nil { + return nil, err + } + // log.Printf("received %s", encResp) + + // Decode their JSON. + var jsonResp JSONResponse + err = json.Unmarshal(encResp, &jsonResp) + if err != nil { + return nil, err + } + if jsonResp.Error != "" { + return nil, errors.New(fmt.Sprintf("helper returned error: %s", jsonResp.Error)) + } + + // Mock up an HTTP response. + resp := http.Response{ + Status: http.StatusText(jsonResp.Status), + StatusCode: jsonResp.Status, + Body: ioutil.NopCloser(bytes.NewReader(jsonResp.Body)), + ContentLength: int64(len(jsonResp.Body)), + } + return &resp, nil +} diff --git a/meek-client/meek-client.go b/meek-client/meek-client.go index 930b123..6ce95f0 100644 --- a/meek-client/meek-client.go +++ b/meek-client/meek-client.go @@ -4,13 +4,10 @@ import ( "bytes" "crypto/rand" "encoding/base64" - "encoding/binary" - "encoding/json" "errors" "flag" "fmt" "io" - "io/ioutil" "log" "net" "net/http" @@ -82,93 +79,6 @@ func roundTripWithHTTP(buf []byte, info *RequestInfo) (*http.Response, error) { return tr.RoundTrip(req) }
-type JSONRequest struct { - Method string `json:"method,omitempty"` - URL string `json:"url,omitempty"` - Header map[string]string `json:"header,omitempty"` - Body []byte `json:"body,omitempty"` -} - -type JSONResponse struct { - Error string `json:"error,omitempty"` - Status int `json:"status"` - Body []byte `json:"body"` -} - -// Ask a locally running browser extension to make the request for us. -func roundTripWithHelper(buf []byte, info *RequestInfo) (*http.Response, error) { - s, err := net.DialTCP("tcp", nil, options.HelperAddr) - if err != nil { - return nil, err - } - defer s.Close() - - // Encode our JSON. - req := JSONRequest{ - Method: "POST", - URL: info.URL.String(), - Header: make(map[string]string), - Body: buf, - } - req.Header["X-Session-Id"] = info.SessionID - if info.Host != "" { - req.Header["Host"] = info.Host - } - encReq, err := json.Marshal(&req) - if err != nil { - return nil, err - } - // log.Printf("encoded %s", encReq) - - // Send the request. - s.SetWriteDeadline(time.Now().Add(helperWriteTimeout)) - err = binary.Write(s, binary.BigEndian, uint32(len(encReq))) - if err != nil { - return nil, err - } - _, err = s.Write(encReq) - if err != nil { - return nil, err - } - - // Read the response. - var length uint32 - s.SetReadDeadline(time.Now().Add(helperReadTimeout)) - err = binary.Read(s, binary.BigEndian, &length) - if err != nil { - return nil, err - } - if length > maxHelperResponseLength { - return nil, errors.New(fmt.Sprintf("helper's returned data is too big (%d > %d)", - length, maxHelperResponseLength)) - } - encResp := make([]byte, length) - _, err = io.ReadFull(s, encResp) - if err != nil { - return nil, err - } - // log.Printf("received %s", encResp) - - // Decode their JSON. - var jsonResp JSONResponse - err = json.Unmarshal(encResp, &jsonResp) - if err != nil { - return nil, err - } - if jsonResp.Error != "" { - return nil, errors.New(fmt.Sprintf("helper returned error: %s", jsonResp.Error)) - } - - // Mock up an HTTP response. - resp := http.Response{ - Status: http.StatusText(jsonResp.Status), - StatusCode: jsonResp.Status, - Body: ioutil.NopCloser(bytes.NewReader(jsonResp.Body)), - ContentLength: int64(len(jsonResp.Body)), - } - return &resp, nil -} - func sendRecv(buf []byte, conn net.Conn, info *RequestInfo) (int64, error) { roundTrip := roundTripWithHTTP if options.HelperAddr != nil {
tor-commits@lists.torproject.org