From 5b22260f2824068624def5fff5fc5a4960b791d9 Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Sun, 1 Oct 2023 18:14:54 +0200 Subject: [PATCH] Refactor GET and POST requests --- curl.bqn | 78 ++++++++++++++++---------------------------------------- test.bqn | 5 ++++ 2 files changed, 27 insertions(+), 56 deletions(-) diff --git a/curl.bqn b/curl.bqn index 95b9327..d62cc31 100644 --- a/curl.bqn +++ b/curl.bqn @@ -19,17 +19,13 @@ ⟩←•Import"ffi.bqn" ⟨RandID⟩←•Import"utils.bqn" -Get←{ -𝕊 url: ⟨⟩ 𝕊 url ; -headers 𝕊 url: +PrepareRequest←{session 𝕊 url‿headers: id←RandID 32 filename←"/tmp/bqncurl."∾id filePtr←Fopen⟨filename∾@,"w+"⟩ headerFilename←"/tmp/bqncurl.header."∾id headerFilePtr←Fopen⟨headerFilename∾@,"w+"⟩ - session←EasyInit⟨⟩ - ruseragent←EasySetoptStr⟨session,curlOptions.useragent,"curl/bqn"∾@⟩ ("Error setting user agent: "∾•Fmt ruseragent)!ruseragent=0 rurl←EasySetoptStr⟨session,curlOptions.url,url∾@⟩ @@ -47,27 +43,26 @@ headers 𝕊 url: rheaders←EasySetoptPtr⟨session,curlOptions.httpHeader,slist⟩ ("Error setting headers: "∾•Fmt rheaders)!rheaders=0 - rperform←EasyPerform⟨session⟩ - ("Error performing request: "∾•Fmt rperform)!rperform=0 + slist‿filename‿filePtr‿headerFilename‿headerFilePtr +} +ReadResponse←{session 𝕊 slist‿filename‿filePtr‿headerFilename‿headerFilePtr: SlistFreeAll slist rcode‿⟨code⟩←EasyGetinfoLong⟨session,curlInfo.responseCode,⟨0⟩⟩ ("Error retrieving response code: "∾•Fmt rcode)!rcode=0 - # ("Request failed with status code "∾•Fmt code)!2=⌊code÷100 rtime‿⟨time⟩←EasyGetinfoDouble⟨session,curlInfo.totalTime,⟨0.0⟩⟩ ("Error retrieving request time: "∾•Fmt rtime)!rtime=0 Fclose filePtr Fclose headerFilePtr + content←•file.Bytes filename responseHeaders←•file.Chars headerFilename •file.Remove filename •file.Remove headerFilename - EasyCleanup session - { code⇐code, time⇐time, @@ -76,65 +71,36 @@ headers 𝕊 url: } } +Get←{ +𝕊 url: ⟨⟩ 𝕊 url ; +headers 𝕊 url: + session←EasyInit⟨⟩ + d←session PrepareRequest url‿headers + + rperform←EasyPerform⟨session⟩ + ("Error performing request: "∾•Fmt rperform)!rperform=0 + + response←session ReadResponse d + EasyCleanup session + response +} + Post←{ 𝕊 url‿data: ⟨⟩ 𝕊 url‿data ; headers 𝕊 url‿data: - id←RandID 32 - filename←"/tmp/bqncurl."∾id - filePtr←Fopen⟨filename∾@,"w+"⟩ - headerFilename←"/tmp/bqncurl.header."∾id - headerFilePtr←Fopen⟨headerFilename∾@,"w+"⟩ - session←EasyInit⟨⟩ - - ruseragent←EasySetoptStr⟨session,curlOptions.useragent,"curl/bqn"∾@⟩ - ("Error setting user agent: "∾•Fmt ruseragent)!ruseragent=0 - rurl←EasySetoptStr⟨session,curlOptions.url,url∾@⟩ - ("Error setting URL: "∾•Fmt rurl)!rurl=0 - rfile←EasySetoptPtr⟨session,curlOptions.writedata,filePtr⟩ - ("Error setting file target: "∾•Fmt rfile)!rfile=0 - rheaderfile←EasySetoptPtr⟨session,curlOptions.headerdata,headerFilePtr⟩ - ("Error setting header file target: "∾•Fmt rheaderfile)!rheaderfile=0 - rredirect←EasySetoptLong⟨session,curlOptions.followlocation,1⟩ - ("Error setting redirect option: "∾•Fmt rredirect)!rredirect=0 + d←session PrepareRequest url‿headers rpost←EasySetoptLong⟨session,curlOptions.post,1⟩ ("Error setting up POST request: "∾•Fmt rpost)!rpost=0 rpostfields←EasySetoptStr⟨session,curlOptions.postfields,data⟩ ("Error setting POST data: "∾•Fmt rpostfields)!rpostfields=0 rpostfieldsize←EasySetoptLong⟨session,curlOptions.postfieldsize,≠data⟩ ("Error setting POST data size: "∾•Fmt rpostfieldsize)!rpostfieldsize=0 - # EasySetoptLong⟨session,curlOptions.header,1⟩ - # EasySetoptLong⟨session,curlOptions.verbose,1⟩ - - slist←(8↑0){SlistAppend⟨𝕩,𝕨∾@⟩}´headers - rheaders←EasySetoptPtr⟨session,curlOptions.httpHeader,slist⟩ - ("Error setting headers: "∾•Fmt rheaders)!rheaders=0 rperform←EasyPerform⟨session⟩ ("Error performing request: "∾•Fmt rperform)!rperform=0 - SlistFreeAll slist - - rcode‿⟨code⟩←EasyGetinfoLong⟨session,curlInfo.responseCode,⟨0⟩⟩ - ("Error retrieving response code: "∾•Fmt rcode)!rcode=0 - # ("Request failed with status code "∾•Fmt code)!2=⌊code÷100 - rtime‿⟨time⟩←EasyGetinfoDouble⟨session,curlInfo.totalTime,⟨0.0⟩⟩ - ("Error retrieving request time: "∾•Fmt rtime)!rtime=0 - - Fclose filePtr - Fclose headerFilePtr - content←•file.Bytes filename - responseHeaders←•file.Chars headerFilename - - •file.Remove filename - •file.Remove headerFilename - + response←session ReadResponse d EasyCleanup session - - { - code⇐code, - time⇐time, - headers⇐responseHeaders, - content⇐content, - } + response } diff --git a/test.bqn b/test.bqn index 03ace93..00296b8 100644 --- a/test.bqn +++ b/test.bqn @@ -1,5 +1,10 @@ ⟨Get,Post⟩←•Import"curl.bqn" +r←Get"http://localhost:8080/get" +r.code +r.headers +r.content + r←⟨"Content-Type: application/json"⟩Post"http://localhost:8080/post"‿"{""key"": ""value""}" r.code r.headers