Skip to content

Commit 7411ddf

Browse files
Fix decode bug with http_request
1 parent b19e821 commit 7411ddf

5 files changed

Lines changed: 91 additions & 1 deletion

File tree

pkg/platforms/postgres/postgres.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -835,7 +835,7 @@ func requests(
835835
e.elem->>'method' AS method,
836836
e.elem->>'url' AS url,
837837
e.elem->'headers' AS headers,
838-
e.elem->'data' AS data
838+
decode(e.elem->>'data', 'base64') AS data
839839
FROM jsonb_array_elements(locked.events)
840840
WITH ORDINALITY AS e(elem, idx)
841841
WHERE e.elem->>'type' = 'HttpRequestEvent'

pkg/runtimes/dupher/testutil_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,7 @@ import (
572572
"encoding/gob"
573573
"encoding/json"
574574
"fmt"
575+
"io"
575576
"net/http"
576577
"os"
577578
"os/signal"
@@ -751,6 +752,15 @@ func spawnCtrl(
751752
},
752753
)
753754
755+
mux.HandleFunc(
756+
"POST /echo",
757+
func(w http.ResponseWriter, r *http.Request) {
758+
body, _ := io.ReadAll(r.Body)
759+
w.Header().Set("Content-Type", "application/json")
760+
w.Write(body)
761+
},
762+
)
763+
754764
server := &http.Server{Addr: controlAddr, Handler: mux}
755765
go func() {
756766
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {

pkg/runtimes/dupher/worker_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,39 @@ func ImpureHttpRequestTestSpec() {
255255
},
256256
},
257257
},
258+
{
259+
name: "http_request_body",
260+
flowName: "EchoRequestTest",
261+
source: map[string]string{
262+
"echorequestflow.ds.go": `package main
263+
264+
import "github.com/RainingComputers/deepslate/prelude"
265+
266+
func EchoRequestTestSpec() {
267+
var body []byte
268+
var err error
269+
body, err = prelude.JsonMarshal(42)
270+
_ = err
271+
272+
url := "http://localhost:18766/echo"
273+
var responseData []byte
274+
responseData, err = prelude.HttpRequest("POST", url, map[string]string{}, body)
275+
276+
value, err := prelude.JsonUnmarshal[int](responseData)
277+
_ = err
278+
_ = value
279+
}
280+
`,
281+
},
282+
steps: []workerTestStep{
283+
{
284+
sleep: 500 * time.Millisecond,
285+
wantVars: map[string]any{
286+
"value": 42,
287+
},
288+
},
289+
},
290+
},
258291
{
259292
name: "flow_with_args",
260293
flowName: "Add",

pkg/runtimes/dython/deepslate/tests/test_utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,19 @@ def do_GET(self) -> None:
434434
self.end_headers()
435435
self.wfile.write(json.dumps({"Status": "healthy", "Code": 200}).encode())
436436

437+
def do_POST(self) -> None:
438+
if self.path != "/echo":
439+
self.send_response(404)
440+
self.end_headers()
441+
return
442+
443+
length = int(self.headers.get("Content-Length", 0))
444+
body = self.rfile.read(length)
445+
self.send_response(200)
446+
self.send_header("Content-Type", "application/json")
447+
self.end_headers()
448+
self.wfile.write(body)
449+
437450
server = HTTPServer(("localhost", port), HTTPHandler)
438451
thread = threading.Thread(target=server.serve_forever, daemon=True)
439452
thread.start()

pkg/runtimes/dython/deepslate/tests/test_worker.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,40 @@ async def impure_http_request_test():
195195
),
196196
],
197197
),
198+
WorkerTestCase(
199+
name="http_request_body",
200+
flow_name="echo_request_test",
201+
source={
202+
"echo_request_test.py": """\
203+
from deepslate import flow, http_request, json_marshal, json_unmarshal, DSError
204+
205+
206+
@flow
207+
async def echo_request_test():
208+
body: bytes | DSError
209+
response_data: bytes | DSError
210+
value: int = 0
211+
url: str = "http://localhost:18769/echo"
212+
213+
body = json_marshal(42)
214+
if not isinstance(body, bytes):
215+
return body
216+
217+
response_data = http_request("POST", url, {}, body)
218+
if not isinstance(response_data, bytes):
219+
return response_data
220+
221+
value = json_unmarshal[int](response_data)
222+
""",
223+
},
224+
steps=[
225+
WorkerTestStep(
226+
sleep=0.5,
227+
want_vars={"value": 42},
228+
),
229+
],
230+
want_traces=[],
231+
),
198232
WorkerTestCase(
199233
name="flow_with_args",
200234
flow_name="add",

0 commit comments

Comments
 (0)