Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- StmtList
- Call
- Ident "curl"
- StmtList
- Call
- Ident "setup"
- StmtList
- Call
- DotExpr
- Ident "req"
- Ident "add_default_headers"
- Command
- Ident "set_headers"
- DotExpr
- Ident "req"
- Ident "headers"
- Infix
- Ident ">"
- Ident "OPT_URL"
- Prefix
- Ident "$"
- DotExpr
- Ident "req"
- Ident "url"
- Infix
- Ident ">"
- Ident "OPT_FOLLOWLOCATION"
- IntLit 1
- Infix
- Ident ">"
- Ident "OPT_CUSTOMREQUEST"
- Call
- DotExpr
- DotExpr
- Ident "req"
- Ident "verb"
- Ident "toUpperAscii"
- IfStmt
- ElifBranch
- Infix
- Ident ">"
- DotExpr
- DotExpr
- Ident "req"
- Ident "body"
- Ident "len"
- IntLit 0
- StmtList
- Infix
- Ident ">"
- Ident "OPT_POSTFIELDS"
- DotExpr
- Ident "req"
- Ident "body"
- Call
- Ident "run"
- StmtList
- Asgn
- DotExpr
- Ident "result"
- Ident "url"
- DotExpr
- Ident "req"
- Ident "url"
- IfStmt
- ElifBranch
- Infix
- Ident "=="
- Ident "ret"
- Ident "E_OK"
- StmtList
- VarSection
- IdentDefs
- Ident "code"
- Ident "uint32"
- Empty
- Infix
- Ident ">"
- Ident "INFO_RESPONSE_CODE"
- DotExpr
- Ident "code"
- Ident "addr"
- Asgn
- DotExpr
- Ident "result"
- Ident "headers"
- Ident "headers"
- Asgn
- DotExpr
- Ident "result"
- Ident "body"
- Ident "body"
- Asgn
- DotExpr
- Ident "result"
- Ident "code"
- DotExpr
- Ident "code"
- Ident "int"
- IfStmt
- ElifBranch
- Infix
- Ident "=="
- BracketExpr
- DotExpr
- Ident "result"
- Ident "headers"
- StrLit "Content-Encoding"
- StrLit "gzip"
- StmtList
- Asgn
- DotExpr
- Ident "result"
- Ident "body"
- Call
- Ident "uncompress"
- DotExpr
- Ident "result"
- Ident "body"
- Ident "dfGzip"
- Else
- StmtList
- Asgn
- DotExpr
- Ident "result"
- Ident "error"
- Prefix
- Ident "$"
- Call
- Ident "easy_strerror"
- Ident "ret"
- template curl(body: untyped) =
- let curl {.inject.} = easy_init()
- var
- headerData: ref string = new string
- bodyData: ref string = new string
- headerList: Pslist
- template setup(sbody: untyped) =
- template `>`(option: Option, arg: untyped) =
- discard curl.easy_setopt(option, arg)
- template set_header(key, val: string) =
- headerList = headerList.slist_append(key & ": " & val)
- template set_headers(hs: seq[Header]) =
- for h in hs:
- headerList = headerList.slist_append(h.key & ": " & h.val)
- OPT_WRITEDATA > bodyData
- OPT_WRITEHEADER > headerData
- OPT_WRITEFUNCTION > curl_write_gen
- OPT_HEADERFUNCTION > curl_write_gen
- block:
- sbody
- OPT_HTTPHEADER > headerList
- template run(rbody: untyped) =
- let ret {.inject.} = curl.easy_perform()
- var headers {.inject.}: seq[Header]
- for line in headerData[].split(CRLF):
- let arr = line.split(":", 1)
- if arr.len == 2:
- headers[arr[0].strip()] = arr[1].strip()
- var body {.inject.} = bodyData[]
- template `>`(option: INFO, arg: untyped) =
- discard curl.easy_getinfo(option, arg)
- block:
- rbody
- block:
- body
- curl.easy_cleanup()
- headerList.slist_free_all()
- proc fetch*(req: Request): Response =
- dumpTree:
- curl:
- setup: <-- error here
- req.add_default_headers()
- set_headers req.headers
- OPT_URL > $req.url
- OPT_FOLLOWLOCATION > 1
- OPT_CUSTOMREQUEST > req.verb.toUpperAscii()
- if req.body.len > 0:
- OPT_POSTFIELDS > req.body
- run:
- result.url = req.url
- if ret == E_OK:
- var code: uint32
- INFO_RESPONSE_CODE > code.addr
- result.headers = headers
- result.body = body
- result.code = code.int
- if result.headers["Content-Encoding"] == "gzip":
- result.body = uncompress(result.body, dfGzip)
- else:
- result.error = $easy_strerror(ret)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement