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") |