bqn-curl/curl.bqn

159 lines
4.9 KiB
BQN
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Simple API
Get,Post,
# Advanced API
OpenSession,ResetSession,CloseSession, # session management
SetURL,SetHeaders,SetVerbose,SetTimeout,SetTimeoutms,SetData, # request parameters
Perform, # perform request
easyInit,
easyCleanup,
easyReset,
easySetoptStr,
easySetoptPtr,
easySetoptLong,
easyPerform,
easyGetinfoStr,
easyGetinfoLong,
easyGetinfoDouble,
slistAppend,
slistFreeAll,
fopen,
fclose,
curlOptions,
curlInfo
•Import"ffi.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 headers SetHeaders url SetURL session
CloseSession session
r
}
# Raise an error if the return code 𝕩 is not 0, with custom message 𝕨
Check{
msg"Curl: "𝕨" ("(•Fmt 𝕩)")"
msg ! 𝕩=0
}
# 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
slistSlistAppend80,""
"creating slist" ! slist80
{sessionPtrsessionPtr,headersSlistslist}
}
# Reset a libcurl session to default parameters, as if just created by
# OpenSession, but preserving open connections and caches
ResetSession{𝕊 session:
SlistFreeAll session.headersSlist
EasyReset session.sessionPtr
"setting user agent"Check EasySetoptStrsession.sessionPtr,curlOptions.useragent,"curl/bqn"@
"setting redirect option"Check EasySetoptLongsession.sessionPtr,curlOptions.followlocation,1
slistSlistAppend80,""
"creating slist" ! slist80
{sessionPtrsession.sessionPtr,headersSlistslist}
}
# 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
session
}
# 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 and set data to post
SetData{data 𝕊 session:
"setting up POST request"Check EasySetoptLongsession.sessionPtr,curlOptions.post,1
"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
filename"/tmp/bqncurl."id
filePtrFopenfilename@,"w+"
headerFilename"/tmp/bqncurl.header."id
headerFilePtrFopenheaderFilename@,"w+"
"setting response file target"Check EasySetoptPtrsession.sessionPtr,curlOptions.writedata,filePtr
"setting header file target"Check EasySetoptPtrsession.sessionPtr,curlOptions.headerdata,headerFilePtr
"performing request"Check EasyPerformsession.sessionPtr
rcodecodeEasyGetinfoLongsession.sessionPtr,curlInfo.responseCode,0
"retrieving response code"Check rcode
rredirectcountredirectCountEasyGetinfoLongsession.sessionPtr,curlInfo.redirectCount,0
"retrieving redirect count"Check rredirectcount
rtimetimeEasyGetinfoDoublesession.sessionPtr,curlInfo.totalTime,0.0
"retrieving request time"Check rtime
Fclose filePtr
Fclose headerFilePtr
content•file.Bytes filename
responseHeaders•file.Chars headerFilename
•file.Remove filename
•file.Remove headerFilename
{
codecode,
headersresponseHeaders,
contentcontent,
timetime,
redirectCountredirectCount,
}
}