comparison src/requests.tp @ 25:bb80f86c5048

Added code for sending and decoding the responses of evalRequests
author Mike Pavone <pavone@retrodev.com>
date Sat, 10 Aug 2013 16:31:48 -0700
parents e1109e33b796
children 18a043613dae
comparison
equal deleted inserted replaced
24:e1109e33b796 25:bb80f86c5048
22 } 22 }
23 23
24 24
25 25
26 26
27 evalRequest <- :id args { 27 evalId <- :id args {
28 #{ 28 #{
29 string <- { 29 string <- {
30 idStr <- (quote: "id") . ":" . (quote: id) 30 idStr <- (quote: "id") . ":" . (quote: id)
31 argsStr <- (quote: "arguments") . ":" . (quote: (strJoin: "," args)) 31 argsStr <- (quote: "arguments") . ":" . (quote: (strJoin: "," args))
32 "{" . idStr . "," . argsStr . "}" 32 "{" . idStr . "," . argsStr . "}"
33 }
34 }
35 }
36
37 evalProgram <- :program args {
38 args <- args map: :el {
39 "\"0x" . (hex: el) . "\""
40 }
41 #{
42 string <- {
43 progStr <- (quote: "program") . ":" . (quote: program)
44 argsStr <- (quote: "arguments") . ":[" . (strJoin: "," args) . "]"
45 "{" . progStr . "," . argsStr . "}"
46 }
47 sendWithKey <- :key {
48 print: "Sending: " . string . "\n"
49 cli <- http client: "icfpc2013.cloudapp.net"
50 resp <- cli post: string toPath: "/eval?auth=" . key withType: "application/json"
51 evalResponse: resp
33 } 52 }
34 } 53 }
35 } 54 }
36 55
37 guessRequest <- :id :prog { 56 guessRequest <- :id :prog {
42 "{" . idStr . "," . progStr . "}" 61 "{" . idStr . "," . progStr . "}"
43 } 62 }
44 } 63 }
45 } 64 }
46 65
47 66 evalResponse <- :httpResp {
48 67 _code <- httpResp statusCode
49 68 bod <- httpResp body
50 69 print: "Response code: " . (string: _code) . "\n"
51 expect:in:else <- :target src doElse { 70 print: bod . "\n"
52 src find: target else: { 71 decoded <- json decode: bod
53 print: "parse error: expected " . target . "!\n" 72 _status <- "error"
54 doElse: 73 if: _code = 200 {
74 _status <- decoded get: "status" withDefault: "error"
75 } else: {
76 print: "bad status"
55 } 77 }
56 } 78 if: _status = "ok" {
57 79 _outputs <- (decoded get: "outputs" withDefault: #[]) map: :num {
58 getStrForKey:from:else <- :key :src :doElse { 80 (num from: 2) parseHex64
59 firstKeyQuote <- expect: "\"" in: src else: doElse 81 }
60 secondQuote <- firstKeyQuote + 1 + (key length)
61
62 #{
63 value <- ""
64 rest <- src from: (value length)
65 }
66 }
67
68 getOutputs:else <- :str :fail {
69
70 }
71
72 getEval:else <- :str :fail {
73 statusRest <- getStrForKey: "status" from: str else: fail
74 if: (statusRest value) = "ok" { // string equality? revisit.
75 outputsRest <- getOutputs: (statusRest rest) else: fail
76 #{ 82 #{
77 value <- #{ 83 status <- { "ok" }
78 status <- statusRest value 84 outputs <- { _outputs }
79 outputs <- outputsRest value 85 string <- {
86 str <- "OK:"
87 foreach: _outputs :idx val {
88 str <- str . "\n" . (string: idx) . ": 0x" . (hex: val)
89 }
90 str
80 } 91 }
81 rest <- outputsRest rest 92 print <- {
93 print: string . "\n"
94 }
82 } 95 }
83 } else: { 96 } else: {
84 message <- "" 97 _message <- decoded get: "message" withDefault: ""
85 print: "Status was error, message: " . message
86 messageRest <- getStrForKey: "message" from: (statusRest rest) else: fail
87 #{ 98 #{
88 value <- #{ 99 status <- { "error" }
89 status <- statusRest value 100 message <- { _message }
90 message <- messageRest value 101 string <- {
102 "Error: " . _message
91 } 103 }
92 rest <- messageRest rest 104 print <- {
105 print: string . "\n"
106 }
93 } 107 }
94 } 108 }
95 } 109 }
96 110
97 111 main <- :args {
98 112 print: ((evalId: "someId" #[1u64 2u64 3u64]) string) . "\n"
99 main <- {
100 print: ((evalRequest: "someId" #[1 2i64 3i64]) string) . "\n"
101 print: ((guessRequest: "someId" "someProg") string) . "\n" 113 print: ((guessRequest: "someId" "someProg") string) . "\n"
102 114
103 exampleEvalResponse <- "{\"status\":\"ok\",\"outputs\":[\"0x0000000000000002\",\"0x01DFFFFFFFFFFFFE\"]}" 115 if: (args length) > 1 {
104 resp <- getEval: exampleEvalResponse else: { 116 key <- args get: 1
105 println: "failed to parse response." 117 print: ((evalProgram: "(lambda (input) (shl1 input))" #[1u64 0xEFFFFFFFFFFFFFu64]) sendWithKey: key)
106 } 118 }
107 println: ((resp value) status)
108 } 119 }
109
110 } 120 }