From 8c88497fdfd258ed194deabcaeb2bed7e0d086b4 Mon Sep 17 00:00:00 2001 From: Dimitri Lozeve Date: Sun, 1 Oct 2023 17:46:14 +0200 Subject: [PATCH] Add POST requests --- curl.bqn | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- ffi.bqn | 8 ++++--- test.bqn | 5 ++--- 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/curl.bqn b/curl.bqn index 60b1037..9b29191 100644 --- a/curl.bqn +++ b/curl.bqn @@ -1,4 +1,4 @@ -⟨Get⟩⇐ +⟨Get,Post⟩⇐ ⟨ easyInit, @@ -72,3 +72,64 @@ headers 𝕊 url: content⇐content, } } + + +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,options.useragent,"curl/bqn"∾@⟩ + ("Error setting user agent: "∾•Fmt ruseragent)!ruseragent=0 + rurl←EasySetoptStr⟨session,options.url,url∾@⟩ + ("Error setting URL: "∾•Fmt rurl)!rurl=0 + rfile←EasySetoptPtr⟨session,options.writedata,filePtr⟩ + ("Error setting file target: "∾•Fmt rfile)!rfile=0 + rheaderfile←EasySetoptPtr⟨session,options.headerdata,headerFilePtr⟩ + ("Error setting header file target: "∾•Fmt rheaderfile)!rheaderfile=0 + rredirect←EasySetoptLong⟨session,options.followlocation,1⟩ + ("Error setting redirect option: "∾•Fmt rredirect)!rredirect=0 + rpost←EasySetoptLong⟨session,options.post,1⟩ + ("Error setting up POST request: "∾•Fmt rpost)!rpost=0 + rpostfields←EasySetoptStr⟨session,options.postfields,data⟩ + ("Error setting POST data: "∾•Fmt rpostfields)!rpostfields=0 + rpostfieldsize←EasySetoptLong⟨session,options.postfieldsize,≠data⟩ + ("Error setting POST data size: "∾•Fmt rpostfieldsize)!rpostfieldsize=0 + # EasySetoptLong⟨session,options.header,1⟩ + # EasySetoptLong⟨session,options.verbose,1⟩ + + slist←(8↑0){SlistAppend⟨𝕩,𝕨∾@⟩}´headers + rheaders←EasySetoptPtr⟨session,options.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,info.responseCode,⟨0⟩⟩ + ("Error retrieving response code: "∾•Fmt rcode)!rcode=0 + # ("Request failed with status code "∾•Fmt code)!2=⌊code÷100 + rtime‿⟨time⟩←EasyGetinfoDouble⟨session,info.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 + EasyCleanup session + { + code⇐code, + time⇐time, + headers⇐responseHeaders, + content⇐content, + } +} diff --git a/ffi.bqn b/ffi.bqn index 35a333d..e7b2a5f 100644 --- a/ffi.bqn +++ b/ffi.bqn @@ -59,6 +59,7 @@ options←{ httpget⇐80 # long integer options + postfieldsize⇐60 # size of the POST input data timeout⇐78 # timeout in seconds timeoutms⇐155 # timeout in milliseconds @@ -68,11 +69,12 @@ options←{ useragent⇐strOffset+18 # pointer options - writedata⇐ptrOffset+1 - headerdata⇐ptrOffset+29 + writedata⇐ptrOffset+1 # FILE* in which to write response content + postfields⇐ptrOffset+15 # pointer to POST input data + headerdata⇐ptrOffset+29 # FILE* in which to write response headers # linked list options - httpHeader⇐slistOffset+23 + httpHeader⇐slistOffset+23 # HTTP headers as a list of strings } diff --git a/test.bqn b/test.bqn index ac11318..03ace93 100644 --- a/test.bqn +++ b/test.bqn @@ -1,7 +1,6 @@ -⟨Get⟩←•Import"curl.bqn" +⟨Get,Post⟩←•Import"curl.bqn" -r←⟨"Hello: World","Blabla: Blublu"⟩Get"http://httpbin.org/get?key=value" +r←⟨"Content-Type: application/json"⟩Post"http://localhost:8080/post"‿"{""key"": ""value""}" r.code r.headers r.content -r.time