Refactor request building

This commit is contained in:
Dimitri Lozeve 2023-10-02 13:33:52 +02:00
parent 87c91fdb98
commit de7eb31ed0
2 changed files with 108 additions and 47 deletions

153
curl.bqn
View file

@ -1,8 +1,16 @@
Get,Post
# Simple API
Get,Post,
# Advanced API
OpenSession,ResetSession,CloseSession, # session management
SetURL,SetHeaders,SetVerbose,SetTimeout,SetTimeoutms,SetPost,SetData, # request parameters
Perform, # perform request
easyInit, easyInit,
easyCleanup, easyCleanup,
easyReset,
easySetoptStr, easySetoptStr,
easySetoptPtr, easySetoptPtr,
easySetoptLong, easySetoptLong,
@ -19,36 +27,116 @@
•Import"ffi.bqn" •Import"ffi.bqn"
RandID•Import"utils.bqn" RandID•Import"utils.bqn"
# Simple GET request, with optional headers as left argument
Get{
𝕊 url: 𝕊 url ;
headers 𝕊 url:
sessionOpenSession @
rPerform headers SetHeaders url SetURL session
CloseSession session
r
}
# Simple POST request, with optional headers as left argument
Post{
𝕊 urldata: 𝕊 urldata ;
headers 𝕊 urldata:
sessionOpenSession @
rPerform data SetData SetPost headers SetHeaders url SetURL session
CloseSession session
r
}
# Raise an error if the return code 𝕩 is not 0, with custom message 𝕨
Check{ Check{
msg"Curl: "𝕨" ("(•Fmt 𝕩)")" msg"Curl: "𝕨" ("(•Fmt 𝕩)")"
msg ! 𝕩=0 msg ! 𝕩=0
} }
PrepareRequest{session 𝕊 urlheaders: # Create a libcurl session, with default values for user-agent and redirects
OpenSession{𝕊𝕩:
sessionPtrEasyInit
"setting user agent"Check EasySetoptStrsessionPtr,curlOptions.useragent,"curl/bqn"@
"setting redirect option"Check EasySetoptLongsessionPtr,curlOptions.followlocation,1
{sessionPtrsessionPtr,headersSlist80}
}
# Reset a libcurl session to default parameters, as if just created by
# OpenSession, but preserving open connections and caches
ResetSession{𝕊 session:
SlistFreeAll session.headersSlist
"resetting session"Check EasyReset session.sessionPtr
"setting user agent"Check EasySetoptStrsession.sessionPtr,curlOptions.useragent,"curl/bqn"@
"setting redirect option"Check EasySetoptLongsession.sessionPtr,curlOptions.followlocation,1
{sessionPtrsession.sessionPtr,headersSlist80}
}
# Close a libcurl session, freeing memory
CloseSession{𝕊 session:
SlistFreeAll session.headersSlist
EasyCleanup session.sessionPtr
@
}
# Set URL for the next request
SetURL{url 𝕊 session:
"setting URL"Check EasySetoptStrsession.sessionPtr,curlOptions.url,url@
session
}
# Set headers for the next request, as a list of strings
SetHeaders{headers 𝕊 session:
slistsession.headersSlist{SlistAppend𝕩,𝕨@}´headers
"setting headers"Check rheadersEasySetoptPtrsession.sessionPtr,curlOptions.httpHeader,slist
{sessionPtrsession.sessionPtr,headersSlistslist}
}
# Set the next request as verbose (logging to standard output)
SetVerbose{𝕊 session:
"setting verbose option"Check EasySetoptLongsession.sessionPtr,curlOptions.verbose,1
session
}
# Set timeout in seconds for the next request
SetTimeout{timeout 𝕊 session:
"setting timeout"Check EasySetoptLongsession.sessionPtr,curlOptions.timeout,timeout
session
}
# Set timeout in milliseconds for the next request
SetTimeoutms{timeoutms 𝕊 session:
"setting timeout (ms)"Check EasySetoptLongsession.sessionPtr,curlOptions.timeoutms,timeoutms
session
}
# Use a POST method for the next request
SetPost{𝕊 session:
"setting up POST request"Check EasySetoptLongsession.sessionPtr,curlOptions.post,1
session
}
# Set data to post
SetData{data 𝕊 session:
"setting POST data"Check EasySetoptStrsession.sessionPtr,curlOptions.postfields,data
"setting POST data size"Check EasySetoptLongsession.sessionPtr,curlOptions.postfieldsize,data
session
}
# Perform a request and get response in a namespace
Perform{𝕊 session:
idRandID 32 idRandID 32
filename"/tmp/bqncurl."id filename"/tmp/bqncurl."id
filePtrFopenfilename@,"w+" filePtrFopenfilename@,"w+"
headerFilename"/tmp/bqncurl.header."id headerFilename"/tmp/bqncurl.header."id
headerFilePtrFopenheaderFilename@,"w+" headerFilePtrFopenheaderFilename@,"w+"
"setting response file target"Check EasySetoptPtrsession.sessionPtr,curlOptions.writedata,filePtr
"setting header file target"Check EasySetoptPtrsession.sessionPtr,curlOptions.headerdata,headerFilePtr
"setting user agent"Check EasySetoptStrsession,curlOptions.useragent,"curl/bqn"@ "performing request"Check EasyPerformsession.sessionPtr
"setting URL"Check EasySetoptStrsession,curlOptions.url,url@
"setting file target"Check EasySetoptPtrsession,curlOptions.writedata,filePtr
"setting header file target"Check EasySetoptPtrsession,curlOptions.headerdata,headerFilePtr
"setting redirect option"Check EasySetoptLongsession,curlOptions.followlocation,1
# "setting verbosity"Check EasySetoptLong⟨session,curlOptions.verbose,1⟩
slist(80){SlistAppend𝕩,𝕨@}´headers
"setting headers"Check rheadersEasySetoptPtrsession,curlOptions.httpHeader,slist
slistfilenamefilePtrheaderFilenameheaderFilePtr rcodecodeEasyGetinfoLongsession.sessionPtr,curlInfo.responseCode,0
}
ReadResponse{session 𝕊 slistfilenamefilePtrheaderFilenameheaderFilePtr:
SlistFreeAll slist
rcodecodeEasyGetinfoLongsession,curlInfo.responseCode,0
"retrieving response code"Check rcode "retrieving response code"Check rcode
rtimetimeEasyGetinfoDoublesession,curlInfo.totalTime,0.0 rtimetimeEasyGetinfoDoublesession.sessionPtr,curlInfo.totalTime,0.0
"retrieving request time"Check rtime "retrieving request time"Check rtime
Fclose filePtr Fclose filePtr
@ -67,32 +155,3 @@ ReadResponse←{session 𝕊 slist‿filename‿filePtr‿headerFilename‿heade
contentcontent, contentcontent,
} }
} }
Get{
𝕊 url: 𝕊 url ;
headers 𝕊 url:
sessionEasyInit
dsession PrepareRequest urlheaders
"performing request"Check EasyPerformsession
responsesession ReadResponse d
EasyCleanup session
response
}
Post{
𝕊 urldata: 𝕊 urldata ;
headers 𝕊 urldata:
sessionEasyInit
dsession PrepareRequest urlheaders
"setting up POST request"Check EasySetoptLongsession,curlOptions.post,1
"setting POST data"Check EasySetoptStrsession,curlOptions.postfields,data
"setting POST data size"Check EasySetoptLongsession,curlOptions.postfieldsize,data
"performing request"Check EasyPerformsession
responsesession ReadResponse d
EasyCleanup session
response
}

View file

@ -1,6 +1,7 @@
easyInit, easyInit,
easyCleanup, easyCleanup,
easyReset,
easySetoptStr, easySetoptStr,
easySetoptPtr, easySetoptPtr,
easySetoptLong, easySetoptLong,
@ -28,6 +29,7 @@ curlCode←"i32"
easyInitCurlFFI curlPtr"curl_easy_init" easyInitCurlFFI curlPtr"curl_easy_init"
easyCleanupCurlFFI """curl_easy_cleanup"(">"curlPtr) easyCleanupCurlFFI """curl_easy_cleanup"(">"curlPtr)
easyResetCurlFFI """curl_easy_reset"(">"curlPtr)
easySetoptStrCurlFFI curlCode"curl_easy_setopt"curlPtrcurlOption"*u8:c8" easySetoptStrCurlFFI curlCode"curl_easy_setopt"curlPtrcurlOption"*u8:c8"
easySetoptPtrCurlFFI curlCode"curl_easy_setopt"curlPtrcurlOption"*:i8" easySetoptPtrCurlFFI curlCode"curl_easy_setopt"curlPtrcurlOption"*:i8"