Skip to content

Commit 709ef28

Browse files
committed
simplifying EPP-side buffer
1 parent 296247b commit 709ef28

File tree

1 file changed

+8
-26
lines changed

1 file changed

+8
-26
lines changed

pkg/epp/handlers/streamingserver.go

+8-26
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ func (s *StreamingServer) Process(srv extProcPb.ExternalProcessor_ProcessServer)
5555
RequestState: RequestReceived,
5656
}
5757

58-
reader, writer := io.Pipe()
59-
decoder := json.NewDecoder(reader)
58+
var body []byte
6059

6160
var requestBody, responseBody map[string]interface{}
6261
// Create error handling var as each request should only report once for
@@ -95,28 +94,18 @@ func (s *StreamingServer) Process(srv extProcPb.ExternalProcessor_ProcessServer)
9594
case *extProcPb.ProcessingRequest_RequestBody:
9695
loggerVerbose.Info("Incoming body chunk", "body", string(v.RequestBody.Body), "EoS", v.RequestBody.EndOfStream)
9796
// In the stream case, we can receive multiple request bodies.
98-
// To buffer the full message, we create a goroutine with a writer.Write()
99-
// call, which will block until the corresponding reader reads from it.
100-
// We do not read until we receive the EndofStream signal, and then
101-
// decode the entire JSON body.
102-
go func() {
103-
_, err := writer.Write(v.RequestBody.Body)
104-
if err != nil {
105-
logger.V(logutil.DEFAULT).Error(err, "Error populating writer")
106-
}
107-
}()
97+
body = append(body, v.RequestBody.Body...)
10898

10999
// Message is buffered, we can read and decode.
110100
if v.RequestBody.EndOfStream {
111101
loggerVerbose.Info("decoding")
112-
err = decoder.Decode(&requestBody)
102+
err = json.Unmarshal(body, &requestBody)
113103
if err != nil {
114104
logger.V(logutil.DEFAULT).Error(err, "Error unmarshaling request body")
115105
}
116-
// Body stream complete. Close the reader pipe, and start anew for response.
117-
reader.Close()
118-
reader, writer = io.Pipe()
119-
decoder = json.NewDecoder(reader)
106+
107+
// Body stream complete. Allocate empty slice for response to use.
108+
body = []byte{}
120109

121110
reqCtx, err = s.HandleRequestBody(ctx, reqCtx, req, requestBody)
122111
if err != nil {
@@ -184,25 +173,18 @@ func (s *StreamingServer) Process(srv extProcPb.ExternalProcessor_ProcessServer)
184173
},
185174
}
186175
} else {
187-
go func() {
188-
_, err := writer.Write(v.ResponseBody.Body)
189-
if err != nil {
190-
logger.V(logutil.DEFAULT).Error(err, "Error populating writer")
191-
}
192-
}()
176+
body = append(body, v.ResponseBody.Body...)
193177

194178
// Message is buffered, we can read and decode.
195179
if v.ResponseBody.EndOfStream {
196180
// Don't send a 500 on a response error. Just let the message passthrough and log our error for debugging purposes.
197181
// We assume the body is valid JSON, err messages are not guaranteed to be json, and so capturing and sending a 500 obfuscates the response message.
198182
// using the standard 'err' var will send an immediate error response back to the caller.
199183
var responseErr error
200-
responseErr = decoder.Decode(&responseBody)
184+
responseErr = json.Unmarshal(body, &responseBody)
201185
if responseErr != nil {
202186
logger.V(logutil.DEFAULT).Error(responseErr, "Error unmarshaling request body")
203187
}
204-
// Body stream complete. Close the reader pipe.
205-
reader.Close()
206188

207189
reqCtx, responseErr = s.HandleResponseBody(ctx, reqCtx, responseBody)
208190
if responseErr != nil {

0 commit comments

Comments
 (0)