diff --git a/code/client/rule/code/h_forward_request.go b/code/client/rule/code/h_forward_request.go index 5885999..260ce69 100644 --- a/code/client/rule/code/h_forward_request.go +++ b/code/client/rule/code/h_forward_request.go @@ -1,19 +1,27 @@ package code import ( + "bytes" + "compress/gzip" "fmt" + "io" + "io/ioutil" "net/http" "github.com/lwch/logging" "github.com/lwch/natpass/code/network" + "github.com/lwch/runtime" ) func (code *Code) handleRequest(workspace *Workspace, w http.ResponseWriter, r *http.Request) { reqID, err := workspace.SendRequest(r) if err != nil { + logging.Error("send: %v", err) http.Error(w, err.Error(), http.StatusBadGateway) return } + logging.Info("send request [%s] [%s] successed, request_id=%d", + workspace.id, workspace.name, reqID) defer workspace.closeMessage(reqID) resp := workspace.onResponse(reqID) if resp == nil { @@ -22,6 +30,8 @@ func (code *Code) handleRequest(workspace *Workspace, w http.ResponseWriter, r * http.Error(w, "no response", http.StatusInternalServerError) return } + logging.Info("wait response [%s] [%s] successed, request_id=%d", + workspace.id, workspace.name, reqID) if resp.GetXType() != network.Msg_code_response_hdr { logging.Error("got invalid message type [%s] [%s]: %s", @@ -37,14 +47,14 @@ func (code *Code) handleRequest(workspace *Workspace, w http.ResponseWriter, r * } } - logging.Info("header: %v", hdr.GetHeader()) - w.WriteHeader(int(hdr.GetCode())) var idx uint32 + var buf []byte for { msg := workspace.onResponse(reqID) if msg == nil { + logging.Error("no response") http.Error(w, "no response", http.StatusBadGateway) return } @@ -65,12 +75,22 @@ func (code *Code) handleRequest(workspace *Workspace, w http.ResponseWriter, r * http.Error(w, fmt.Sprintf("read error: %s", string(resp.GetBody())), http.StatusResetContent) return } - _, err = w.Write(resp.GetBody()) - if err != nil { - logging.Error("write body: %v", err) - return - } + buf = append(buf, resp.GetBody()...) + // _, err = buf.Write(resp.GetBody()) + // if err != nil { + // logging.Error("write body: %v", err) + // return + // } if resp.GetMask()&2 > 0 { + _, err = io.Copy(w, bytes.NewReader(buf)) + if err != nil { + logging.Info("header: %s", hdr.String()) + r, err := gzip.NewReader(bytes.NewReader(buf)) + runtime.Assert(err) + data, err := ioutil.ReadAll(r) + runtime.Assert(err) + logging.Error("write body: %v\n%s", err, string(data)) + } return } idx++ diff --git a/code/client/rule/code/workspace_remote_response.go b/code/client/rule/code/workspace_remote_response.go index 82815c9..1f6c2f3 100644 --- a/code/client/rule/code/workspace_remote_response.go +++ b/code/client/rule/code/workspace_remote_response.go @@ -39,7 +39,7 @@ func (ws *Workspace) handleRequest(msg *network.Msg) { n, err := response.Body.Read(buf) if err != nil { if err == io.EOF { - send := ws.remote.SendCodeResponseBody(ws.target, ws.id, req.GetRequestId(), idx, true, true, nil) + send := ws.remote.SendCodeResponseBody(ws.target, ws.id, req.GetRequestId(), idx, true, true, buf[:n]) ws.sendBytes += send ws.sendPacket++ idx++