Advertisement
Guest User

Untitled

a guest
Jul 10th, 2021
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 5.61 KB | None | 0 0
  1. StmtList
  2.   Call
  3.     Ident "curl"
  4.     StmtList
  5.       Call
  6.         Ident "setup"
  7.         StmtList
  8.           Call
  9.             DotExpr
  10.               Ident "req"
  11.               Ident "add_default_headers"
  12.           Command
  13.             Ident "set_headers"
  14.             DotExpr
  15.               Ident "req"
  16.               Ident "headers"
  17.           Infix
  18.             Ident ">"
  19.             Ident "OPT_URL"
  20.             Prefix
  21.               Ident "$"
  22.               DotExpr
  23.                 Ident "req"
  24.                 Ident "url"
  25.           Infix
  26.             Ident ">"
  27.             Ident "OPT_FOLLOWLOCATION"
  28.             IntLit 1
  29.           Infix
  30.             Ident ">"
  31.             Ident "OPT_CUSTOMREQUEST"
  32.             Call
  33.               DotExpr
  34.                 DotExpr
  35.                   Ident "req"
  36.                   Ident "verb"
  37.                 Ident "toUpperAscii"
  38.           IfStmt
  39.             ElifBranch
  40.               Infix
  41.                 Ident ">"
  42.                 DotExpr
  43.                   DotExpr
  44.                     Ident "req"
  45.                     Ident "body"
  46.                   Ident "len"
  47.                 IntLit 0
  48.               StmtList
  49.                 Infix
  50.                   Ident ">"
  51.                   Ident "OPT_POSTFIELDS"
  52.                   DotExpr
  53.                     Ident "req"
  54.                     Ident "body"
  55.       Call
  56.         Ident "run"
  57.         StmtList
  58.           Asgn
  59.             DotExpr
  60.               Ident "result"
  61.               Ident "url"
  62.             DotExpr
  63.               Ident "req"
  64.               Ident "url"
  65.           IfStmt
  66.             ElifBranch
  67.               Infix
  68.                 Ident "=="
  69.                 Ident "ret"
  70.                 Ident "E_OK"
  71.               StmtList
  72.                 VarSection
  73.                   IdentDefs
  74.                     Ident "code"
  75.                     Ident "uint32"
  76.                     Empty
  77.                 Infix
  78.                   Ident ">"
  79.                   Ident "INFO_RESPONSE_CODE"
  80.                   DotExpr
  81.                     Ident "code"
  82.                     Ident "addr"
  83.                 Asgn
  84.                   DotExpr
  85.                     Ident "result"
  86.                     Ident "headers"
  87.                   Ident "headers"
  88.                 Asgn
  89.                   DotExpr
  90.                     Ident "result"
  91.                     Ident "body"
  92.                   Ident "body"
  93.                 Asgn
  94.                   DotExpr
  95.                     Ident "result"
  96.                     Ident "code"
  97.                   DotExpr
  98.                     Ident "code"
  99.                     Ident "int"
  100.                 IfStmt
  101.                   ElifBranch
  102.                     Infix
  103.                       Ident "=="
  104.                       BracketExpr
  105.                         DotExpr
  106.                           Ident "result"
  107.                           Ident "headers"
  108.                         StrLit "Content-Encoding"
  109.                       StrLit "gzip"
  110.                     StmtList
  111.                       Asgn
  112.                         DotExpr
  113.                           Ident "result"
  114.                           Ident "body"
  115.                         Call
  116.                           Ident "uncompress"
  117.                           DotExpr
  118.                             Ident "result"
  119.                             Ident "body"
  120.                           Ident "dfGzip"
  121.             Else
  122.               StmtList
  123.                 Asgn
  124.                   DotExpr
  125.                     Ident "result"
  126.                     Ident "error"
  127.                   Prefix
  128.                     Ident "$"
  129.                     Call
  130.                       Ident "easy_strerror"
  131.                       Ident "ret"
  132.  
  133.  
  134. template curl(body: untyped) =
  135.   let curl {.inject.} = easy_init()
  136.   var
  137.     headerData: ref string = new string
  138.     bodyData: ref string = new string
  139.     headerList: Pslist
  140.   template setup(sbody: untyped) =
  141.     template `>`(option: Option, arg: untyped) =
  142.       discard curl.easy_setopt(option, arg)
  143.     template set_header(key, val: string) =
  144.       headerList = headerList.slist_append(key & ": " & val)
  145.     template set_headers(hs: seq[Header]) =
  146.       for h in hs:
  147.         headerList = headerList.slist_append(h.key & ": " & h.val)
  148.     OPT_WRITEDATA > bodyData
  149.     OPT_WRITEHEADER > headerData
  150.     OPT_WRITEFUNCTION > curl_write_gen
  151.     OPT_HEADERFUNCTION > curl_write_gen
  152.     block:
  153.       sbody
  154.     OPT_HTTPHEADER > headerList
  155.   template run(rbody: untyped) =
  156.     let ret {.inject.} = curl.easy_perform()
  157.     var headers {.inject.}: seq[Header]
  158.     for line in headerData[].split(CRLF):
  159.         let arr = line.split(":", 1)
  160.         if arr.len == 2:
  161.           headers[arr[0].strip()] = arr[1].strip()
  162.     var body {.inject.} = bodyData[]
  163.     template `>`(option: INFO, arg: untyped) =
  164.       discard curl.easy_getinfo(option, arg)
  165.     block:
  166.       rbody
  167.   block:
  168.     body
  169.   curl.easy_cleanup()
  170.   headerList.slist_free_all()
  171.  
  172.  
  173. proc fetch*(req: Request): Response =
  174.   dumpTree:
  175.     curl:
  176.       setup:  <-- error here
  177.         req.add_default_headers()
  178.         set_headers req.headers
  179.         OPT_URL > $req.url
  180.         OPT_FOLLOWLOCATION > 1
  181.         OPT_CUSTOMREQUEST > req.verb.toUpperAscii()
  182.         if req.body.len > 0:
  183.           OPT_POSTFIELDS > req.body
  184.       run:
  185.         result.url = req.url
  186.         if ret == E_OK:
  187.           var code: uint32
  188.           INFO_RESPONSE_CODE > code.addr
  189.           result.headers = headers
  190.           result.body = body
  191.           result.code = code.int
  192.           if result.headers["Content-Encoding"] == "gzip":
  193.             result.body = uncompress(result.body, dfGzip)
  194.         else:
  195.           result.error = $easy_strerror(ret)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement