all repos — min @ 85a2cc6a348e908f4ec0c850d7659f600334ce20

A small but practical concatenative programming language.

lib/min_http.nim

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
import httpclient, strutils
import 
  ../core/parser, 
  ../core/consts,
  ../core/value, 
  ../core/interpreter, 
  ../core/utils

let minUserAgent = "$1 http-module/$2" % [appname, version]

proc newCli(): HttpClient =
  return newHttpClient(userAgent = minUseragent)

proc newVal(i: In, headers: HttpHeaders): MinValue = 
  result = newVal(newSeq[MinValue](), i.scope)
  for k, v in headers:
    result = i.dset(result, k.newVal, v.newVal)

proc execRequest(i:In, req: MinValue): MinValue = 
  let cli = newCli()
  var body = "".newVal
  var rawHeaders, meth, url: MinValue
  var headers = newHttpHeaders()
  if not req.dhas("method".newVal):
    raiseInvalid("Request method not specified")
  if not req.dhas("url".newVal):
    raiseInvalid("Request URL not specified")
  if req.dhas("headers".newVal):
    rawHeaders = req.dget("headers".newVal)
    if not rawHeaders.isDictionary:
      raiseInvalid("Headers must be specified as a dictionary")
    for v in rawHeaders.qVal:
      headers[v.qVal[0].getString] = v.qVal[1].getString
  if req.dhas("body".newVal):
      body = req.dget("body".newVal)
  meth = req.dget("method".newVal)
  url = req.dget("url".newVal)
  let resp = cli.request(url = url.getString, httpMethod = meth.getString, body = body.getString, headers = headers)
  result = newVal(newSeq[MinValue](), i.scope)
  result = i.dset(result, "version".newVal, resp.version.parseFloat.newVal)
  result = i.dset(result, "status".newVal, resp.status[0..2].parseInt.newVal)
  result = i.dset(result, "headers".newVal, i.newVal(resp.headers))
  result = i.dset(result, "body".newVal, resp.body.newVal)

# Http

proc http_module*(i: In)=
  let def = i.define()

  def.symbol("request") do (i: In):
    let vals = i.expect "dict"
    let req = vals[0]
    i.push i.execRequest(req)
  
  def.symbol("get-content") do (i: In):
    let vals = i.expect "string"
    let url = vals[0]
    let cli = newCli()
    i.push cli.getContent(url.getString).newVal

  def.symbol("download") do (i: In):
    let vals = i.expect("string", "string")
    let file = vals[0]
    let url = vals[1]
    let cli = newCli()
    cli.downloadFile(url.getString, file.getString)
    discard

  def.finalize("http")