substrate-lang 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/compiler/binary.cdd2ffb408dd@0+0.wasm +0 -0
- package/build/compiler/checker.2b0ea87ed311@0+0.wasm +0 -0
- package/build/compiler/compile.da85f9bc4478@0+0.wasm +0 -0
- package/build/compiler/{core.11abd90bead5@0+0.wasm → core.0410ffbdc488@0+0.wasm} +0 -0
- package/build/compiler/expander.80707e1666d6@0+0.wasm +0 -0
- package/build/compiler/{fs.3f7cf768e7ed@0+0.wasm → fs.5017b627cbd2@0+0.wasm} +0 -0
- package/build/compiler/{leb128.0d2a247f239f@0+0.wasm → leb128.ba77430f659f@0+0.wasm} +0 -0
- package/build/compiler/{link.3c4158bb6ba3@0+0.wasm → link.be6e641afa93@0+0.wasm} +0 -0
- package/build/compiler/{macros.6f0e1a78d640@0+0.wasm → macros.b695763c0ca3@0+0.wasm} +0 -0
- package/build/compiler/main.cbbdf42e34c2@0+0.wasm +0 -0
- package/build/compiler/{ops.a5b9269c5240@0+0.wasm → ops.324f0a665fab@0+0.wasm} +0 -0
- package/build/compiler/{path.ec5532669c81@0+0.wasm → path.1b5fd988b6f3@0+0.wasm} +0 -0
- package/build/compiler/program +21 -20
- package/build/compiler/prune.29dde307bdee@0+0.wasm +0 -0
- package/build/compiler/{reader.f4378a1f91d1@0+0.wasm → reader.d256e69e09e2@0+0.wasm} +0 -0
- package/build/compiler/roots.e366210c01d6@0+0.wasm +0 -0
- package/build/compiler/{running.7f03ff780e03@0+0.wasm → running.b99787c2d180@0+0.wasm} +0 -0
- package/build/compiler/serialize.a12536bbbe9a@0+0.wasm +0 -0
- package/build/compiler/sha256.f6c742932dde@0+0.wasm +0 -0
- package/build/compiler/substrate.728c690187f2@0+0.wasm +0 -0
- package/build/compiler/syntax.fadc832db29f@0+0.wasm +0 -0
- package/build/compiler/{writer.b698107b491f@0+0.wasm → writer.550227768eb9@0+0.wasm} +0 -0
- package/build/sub/{base64.fc39f9b2a664@0+0.wasm → base64.454b045156d2@0+0.wasm} +0 -0
- package/build/sub/build.115aeefc15e8@0+0.wasm +0 -0
- package/build/sub/{chromium.0cdcaad35704@0+0.wasm → chromium.fc0bfea0fbe6@0+0.wasm} +0 -0
- package/build/sub/{common.9ea008df47e6@0+0.wasm → common.997c21b0b8cf@0+0.wasm} +0 -0
- package/build/sub/deflate.3138a38325a1@0+0.wasm +0 -0
- package/build/sub/{doc.e0af22e9d586@0+0.wasm → doc.e3f9a998cd91@0+0.wasm} +0 -0
- package/build/sub/{doc.49b234ac4521@0+0.wasm → doc.f18ad14060e9@0+0.wasm} +0 -0
- package/build/sub/env.861d55fff974@0+0.wasm +0 -0
- package/build/sub/events.2c981f6f1ec7@0+0.wasm +0 -0
- package/build/sub/{fetch.59ad8bf17eeb@0+0.wasm → fetch.b0ce8f8b3da8@0+0.wasm} +0 -0
- package/build/sub/fetch.d62aa5fc9623@0+0.wasm +0 -0
- package/build/sub/{files.25d3fe28ff57@0+0.wasm → files.1706cc0941c0@0+0.wasm} +0 -0
- package/build/sub/{fs.3f7cf768e7ed@0+0.wasm → fs.5017b627cbd2@0+0.wasm} +0 -0
- package/build/sub/{git.c47e41fed371@0+0.wasm → git.1c5791236e35@0+0.wasm} +0 -0
- package/build/sub/{grants.e7dc20c93375@0+0.wasm → grants.cd99dff2854e@0+0.wasm} +0 -0
- package/build/sub/{gzip.0bacbb40f6e2@0+0.wasm → gzip.9ebea150f218@0+0.wasm} +0 -0
- package/build/sub/hash.ba8330dad9ff@0+0.wasm +0 -0
- package/build/sub/{html.1ab670c5f861@0+0.wasm → html.0b0362932a75@0+0.wasm} +0 -0
- package/build/sub/{html.a860b2ff2c4e@0+0.wasm → html.3b3c8d7d9971@0+0.wasm} +0 -0
- package/build/sub/{inflate.16c735654147@0+0.wasm → inflate.3cfa17586072@0+0.wasm} +0 -0
- package/build/sub/{json.74966c67a96d@0+0.wasm → json.af2e0ae20084@0+0.wasm} +0 -0
- package/build/sub/manifest.6e014ac19e5d@0+0.wasm +0 -0
- package/build/sub/map.e582eae03ec2@0+0.wasm +0 -0
- package/build/sub/{pack.a62f186e997c@0+0.wasm → pack.4295e4f5bdbd@0+0.wasm} +0 -0
- package/build/sub/{path.ec5532669c81@0+0.wasm → path.1b5fd988b6f3@0+0.wasm} +0 -0
- package/build/sub/path.de22f6659534@0+0.wasm +0 -0
- package/build/sub/process.ca10ac0b8a62@0+0.wasm +0 -0
- package/build/sub/program +48 -48
- package/build/sub/read.279fafcda508@0+0.wasm +0 -0
- package/build/sub/{reader.f4378a1f91d1@0+0.wasm → reader.d256e69e09e2@0+0.wasm} +0 -0
- package/build/sub/{root.5a3e4a594d25@0+0.wasm → root.02141d04d568@0+0.wasm} +0 -0
- package/build/sub/roots.e366210c01d6@0+0.wasm +0 -0
- package/build/sub/{sha256.92185201fb4b@0+0.wasm → sha256.f6c742932dde@0+0.wasm} +0 -0
- package/build/sub/{sha512.bf0d4c469a96@0+0.wasm → sha512.9fee24e95460@0+0.wasm} +0 -0
- package/build/sub/site.76aa8286c257@0+0.wasm +0 -0
- package/build/sub/{site.81b7f3938874@0+0.wasm → site.e6e415bc3170@0+0.wasm} +0 -0
- package/build/sub/{store.128b4d772823@0+0.wasm → store.c48db3345968@0+0.wasm} +0 -0
- package/build/sub/{stream.d95d09173ea2@0+0.wasm → stream.27fd2fe858e1@0+0.wasm} +0 -0
- package/build/sub/{sub.84126bd636af@0+0.wasm → sub.c0fb7310de12@0+0.wasm} +0 -0
- package/build/sub/{substrate.b31300129ffb@0+0.wasm → substrate.728c690187f2@0+0.wasm} +0 -0
- package/build/sub/{syntax.500cf1bcecd4@0+0.wasm → syntax.fadc832db29f@0+0.wasm} +0 -0
- package/build/sub/tar.692c0e8827cd@0+0.wasm +0 -0
- package/build/sub/{test.eed7cfa3264c@0+0.wasm → test.1fd2ff8123bf@0+0.wasm} +0 -0
- package/build/sub/{text.ca2b0668e319@0+0.wasm → text.8ff142d72fd7@0+0.wasm} +0 -0
- package/build/sub/{timer.21d74714d40b@0+0.wasm → timer.d3454726b3bf@0+0.wasm} +0 -0
- package/build/sub/{upgrade.61c36d2a50cf@0+0.wasm → upgrade.2a9219e6a45d@0+0.wasm} +0 -0
- package/build/sub/{utf8.b61525c6fb12@0+0.wasm → utf8.e82afeb9e953@0+0.wasm} +0 -0
- package/build/sub/worker.ea1e11f8f5e2@0+0.wasm +0 -0
- package/build/sub/writer.550227768eb9@0+0.wasm +0 -0
- package/package.json +1 -1
- package/std/archive/tar.sub +14 -21
- package/std/compress/deflate.sub +10 -12
- package/std/crypto/sha256.sub +3 -109
- package/std/encoding/json.sub +44 -65
- package/std/encoding/wire.sub +6 -8
- package/std/http/checks.sub +3 -3
- package/std/http/conditional.sub +2 -4
- package/std/http/cookie.sub +5 -7
- package/std/http/form.sub +7 -10
- package/std/http/http.sub +17 -24
- package/std/http/multipart.sub +5 -5
- package/std/http/route.sub +9 -9
- package/std/http/server.sub +7 -12
- package/std/http/session.sub +1 -4
- package/std/http/sse-client.sub +9 -14
- package/std/http/url.sub +10 -10
- package/std/http/websocket.sub +2 -5
- package/std/meta/type-info.sub +10 -10
- package/std/package/hash.sub +1 -1
- package/std/package/manifest.sub +14 -15
- package/std/package/map.sub +4 -8
- package/std/package/path.sub +1 -4
- package/std/package/read.sub +3 -8
- package/std/package/site.sub +5 -5
- package/std/test/compare.sub +9 -10
- package/std/test/page.sub +1 -1
- package/std/test/run.sub +1 -1
- package/std/test/session.sub +0 -1
- package/std/test/test.sub +24 -17
- package/substrate/VERSION +1 -1
- package/substrate/compiler/binary.sub +5 -14
- package/substrate/compiler/checker.sub +204 -19
- package/substrate/compiler/compile.sub +8 -8
- package/substrate/compiler/expander.sub +208 -84
- package/substrate/compiler/link.sub +2 -2
- package/substrate/compiler/main.sub +15 -2
- package/substrate/compiler/ops.sub +1 -1
- package/substrate/compiler/prune.sub +12 -17
- package/substrate/compiler/roots.sub +93 -26
- package/substrate/compiler/serialize.sub +1 -1
- package/substrate/compiler/sha256.sub +110 -0
- package/substrate/compiler/substrate.sub +14 -14
- package/substrate/compiler/syntax.sub +8 -21
- package/substrate/host/fs.sub +8 -11
- package/substrate/host/grants.sub +25 -26
- package/substrate/host/node/process.sub +5 -6
- package/substrate/host/node/worker-thread.mjs +1 -1
- package/substrate/host/node/worker.mjs +1 -0
- package/substrate/host/subhost-core.mjs +10 -3
- package/substrate/host/subhost.mjs +13 -1
- package/substrate/host/web/subhost-web.mjs +13 -2
- package/substrate/host/web/worker-script.mjs +1 -0
- package/substrate/host/web/worker.mjs +1 -0
- package/substrate/host/worker.mjs +3 -1
- package/build/compiler/binary.5d81a93450b2@0+0.wasm +0 -0
- package/build/compiler/checker.343075746d8c@0+0.wasm +0 -0
- package/build/compiler/compile.2db0f824839f@0+0.wasm +0 -0
- package/build/compiler/expander.c0f36d0bd5fc@0+0.wasm +0 -0
- package/build/compiler/main.cf521803fc5e@0+0.wasm +0 -0
- package/build/compiler/prune.f800615ca8cc@0+0.wasm +0 -0
- package/build/compiler/roots.02808ca2c6a7@0+0.wasm +0 -0
- package/build/compiler/serialize.f4354af92feb@0+0.wasm +0 -0
- package/build/compiler/substrate.b31300129ffb@0+0.wasm +0 -0
- package/build/compiler/syntax.500cf1bcecd4@0+0.wasm +0 -0
- package/build/sub/build.3a016536f5a5@0+0.wasm +0 -0
- package/build/sub/deflate.67457f2269ae@0+0.wasm +0 -0
- package/build/sub/env.d4a2d3ca5408@0+0.wasm +0 -0
- package/build/sub/events.ee8945a7ea00@0+0.wasm +0 -0
- package/build/sub/fetch.22f5c88f8a7b@0+0.wasm +0 -0
- package/build/sub/hash.75dc86b3dd19@0+0.wasm +0 -0
- package/build/sub/manifest.0c0fe02b1e58@0+0.wasm +0 -0
- package/build/sub/map.b767b94ffe7f@0+0.wasm +0 -0
- package/build/sub/path.b98f74b36b19@0+0.wasm +0 -0
- package/build/sub/process.94378bb2ecf2@0+0.wasm +0 -0
- package/build/sub/read.4b71de2f3337@0+0.wasm +0 -0
- package/build/sub/roots.02808ca2c6a7@0+0.wasm +0 -0
- package/build/sub/site.b678ce0b53b9@0+0.wasm +0 -0
- package/build/sub/tar.9c01735ea170@0+0.wasm +0 -0
- package/build/sub/worker.5ced1d8ab0d4@0+0.wasm +0 -0
- package/build/sub/writer.b698107b491f@0+0.wasm +0 -0
package/std/encoding/json.sub
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
json-parse json-write! json-get json-at json-count json-as-i64 json-as-f64 json-as-string json-as-bool
|
|
9
9
|
json-push! json-add! json-insert! json-replace! json-replace-at! json-remove! json-remove-at! json-copy
|
|
10
10
|
json-equal? json-reader json-reader-start! json-reader-free! json-next! json-skip!
|
|
11
|
-
json-token-error json-token-end json-token-start-array json-token-end-array json-token-start-object
|
|
11
|
+
json-token json-token-error json-token-end json-token-start-array json-token-end-array json-token-start-object
|
|
12
12
|
json-token-end-object json-token-key json-token-string json-token-number json-token-true json-token-false
|
|
13
13
|
json-token-null)
|
|
14
14
|
|
|
@@ -26,36 +26,20 @@
|
|
|
26
26
|
|
|
27
27
|
;; ---- the token reader ----
|
|
28
28
|
|
|
29
|
-
(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
(const json-token-start-object u32 4)
|
|
34
|
-
(const json-token-end-object u32 5)
|
|
35
|
-
(const json-token-key u32 6)
|
|
36
|
-
(const json-token-string u32 7)
|
|
37
|
-
(const json-token-number u32 8)
|
|
38
|
-
(const json-token-true u32 9)
|
|
39
|
-
(const json-token-false u32 10)
|
|
40
|
-
(const json-token-null u32 11)
|
|
29
|
+
(enum json-token
|
|
30
|
+
json-token-error json-token-end json-token-start-array json-token-end-array json-token-start-object
|
|
31
|
+
json-token-end-object json-token-key json-token-string json-token-number json-token-true json-token-false
|
|
32
|
+
json-token-null)
|
|
41
33
|
|
|
42
34
|
;; What may come next, after Go's tokenState.
|
|
43
|
-
(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
(const array-value u32 3)
|
|
47
|
-
(const array-comma u32 4)
|
|
48
|
-
(const object-start u32 5)
|
|
49
|
-
(const object-key u32 6)
|
|
50
|
-
(const object-colon u32 7)
|
|
51
|
-
(const object-value u32 8)
|
|
52
|
-
(const object-comma u32 9)
|
|
53
|
-
(const failed u32 10)
|
|
35
|
+
(enum token-state
|
|
36
|
+
top-value top-end array-start array-value array-comma object-start object-key object-colon object-value object-comma
|
|
37
|
+
failed)
|
|
54
38
|
|
|
55
39
|
(const depth-limit u32 1000)
|
|
56
40
|
|
|
57
|
-
(struct json-reader [text string] [at u32] [state
|
|
58
|
-
[scratch buffer] [error json-error])
|
|
41
|
+
(struct json-reader [text string] [at u32] [state token-state] [depth u32] [kinds (array u8 1000)] [token string]
|
|
42
|
+
[number f64] [scratch buffer] [error json-error])
|
|
59
43
|
|
|
60
44
|
(define (json-reader-start! [r (ptr json-reader)] [text string])
|
|
61
45
|
(set! (-> r text) text)
|
|
@@ -72,7 +56,7 @@
|
|
|
72
56
|
|
|
73
57
|
(define (json-reader-free! [r (ptr json-reader)]) (buffer-free! (& (-> r scratch))))
|
|
74
58
|
|
|
75
|
-
(define (json-next! [r (ptr json-reader)]) ->
|
|
59
|
+
(define (json-next! [r (ptr json-reader)]) -> json-token
|
|
76
60
|
(let ([s (-> r state)] [c (space! r)])
|
|
77
61
|
(cond [(or (== s array-value) (== s object-value))
|
|
78
62
|
(cond [(== c #\,)
|
|
@@ -121,7 +105,7 @@
|
|
|
121
105
|
(set! (-> r at) i)
|
|
122
106
|
256))
|
|
123
107
|
|
|
124
|
-
(define (value! [r (ptr json-reader)] [c u32]) ->
|
|
108
|
+
(define (value! [r (ptr json-reader)] [c u32]) -> json-token
|
|
125
109
|
(cond [(== c #\")
|
|
126
110
|
(+= (-> r at) 1)
|
|
127
111
|
(if (string! r) (after-value! r json-token-string) json-token-error)]
|
|
@@ -134,7 +118,7 @@
|
|
|
134
118
|
[(== c 256) (if (== (-> r depth) 0) (fail! r "the text has no value") (ended! r))]
|
|
135
119
|
[else (fail! r "expected a value")]))
|
|
136
120
|
|
|
137
|
-
(define (word! [r (ptr json-reader)] [w string] [t
|
|
121
|
+
(define (word! [r (ptr json-reader)] [w string] [t json-token]) -> json-token
|
|
138
122
|
(let ([end (+ (-> r at) (-> w length))])
|
|
139
123
|
(if (and (<= end (-> r text length)) (== (memcmp (+ (-> r text bytes) (-> r at)) (-> w bytes) (-> w length)) 0))
|
|
140
124
|
(begin
|
|
@@ -142,13 +126,13 @@
|
|
|
142
126
|
(after-value! r t))
|
|
143
127
|
(fail! r "expected a value"))))
|
|
144
128
|
|
|
145
|
-
(define (after-value! [r (ptr json-reader)] [t
|
|
129
|
+
(define (after-value! [r (ptr json-reader)] [t json-token]) -> json-token
|
|
146
130
|
(set! (-> r state) (cond [(== (-> r depth) 0) top-end]
|
|
147
131
|
[(== (@ (-> r kinds) (- (-> r depth) 1)) 1) array-value]
|
|
148
132
|
[else object-value]))
|
|
149
133
|
t)
|
|
150
134
|
|
|
151
|
-
(define (open! [r (ptr json-reader)] [kind u32] [t
|
|
135
|
+
(define (open! [r (ptr json-reader)] [kind u32] [t json-token]) -> json-token
|
|
152
136
|
(when (== (-> r depth) depth-limit) (return (fail! r "nested too deeply")))
|
|
153
137
|
(set! (@ (-> r kinds) (-> r depth)) kind)
|
|
154
138
|
(+= (-> r depth) 1)
|
|
@@ -156,14 +140,14 @@
|
|
|
156
140
|
(set! (-> r state) (if (== kind 1) array-start object-start))
|
|
157
141
|
t)
|
|
158
142
|
|
|
159
|
-
(define (close! [r (ptr json-reader)]) ->
|
|
143
|
+
(define (close! [r (ptr json-reader)]) -> json-token
|
|
160
144
|
(-= (-> r depth) 1)
|
|
161
145
|
(after-value! r (if (== (@ (-> r kinds) (-> r depth)) 1) json-token-end-array json-token-end-object)))
|
|
162
146
|
|
|
163
|
-
(define (ended! [r (ptr json-reader)]) ->
|
|
147
|
+
(define (ended! [r (ptr json-reader)]) -> json-token
|
|
164
148
|
(fail! r (if (== (@ (-> r kinds) (- (-> r depth) 1)) 1) "the text ends inside an array" "the text ends inside an object")))
|
|
165
149
|
|
|
166
|
-
(define (fail! [r (ptr json-reader)] [message string]) ->
|
|
150
|
+
(define (fail! [r (ptr json-reader)] [message string]) -> json-token
|
|
167
151
|
(let ([p (-> r text bytes)] [line u32 1] [from u32 0])
|
|
168
152
|
(for ([i u32 0]) (< i (-> r at)) (+= i 1)
|
|
169
153
|
(when (== (@ p i) 10)
|
|
@@ -320,14 +304,11 @@
|
|
|
320
304
|
|
|
321
305
|
;; ---- parsing ----
|
|
322
306
|
|
|
323
|
-
(define (arena-text [a (ptr arena)] [s string]) -> string
|
|
324
|
-
(let* ([n (-> s length)] [q (cast (ptr u8) (arena-alloc a n))])
|
|
325
|
-
(memcpy q (-> s bytes) n)
|
|
326
|
-
(cast string (slice q n))))
|
|
307
|
+
(define (arena-text [a (ptr arena)] [s string]) -> string (copy a s))
|
|
327
308
|
|
|
328
309
|
(define (json-parse [a (ptr arena)] [text string] [err (ptr json-error)]) -> (ptr json-value)
|
|
329
310
|
(let ([r json-reader] [values (make-buffer)] [members (make-buffer)] [starts (array u32 1000)]
|
|
330
|
-
[root (ptr json-value) 0] [t
|
|
311
|
+
[root (ptr json-value) 0] [t json-token] [v json-value (json-null)] [k u32 0] [m json-member] [placed #f])
|
|
331
312
|
(json-reader-start! (& r) text)
|
|
332
313
|
(while #t
|
|
333
314
|
(set! t (json-next! (& r)))
|
|
@@ -369,7 +350,7 @@
|
|
|
369
350
|
(break)])
|
|
370
351
|
(when placed
|
|
371
352
|
(cond [(== (-> r depth) 0)
|
|
372
|
-
(set! root (
|
|
353
|
+
(set! root (new a json-value))
|
|
373
354
|
(set! (@ root) v)]
|
|
374
355
|
[(== (@ (-> r kinds) (- (-> r depth) 1)) 1)
|
|
375
356
|
(buffer-add! (& values) (slice (cast (ptr u8) (& v)) (sizeof json-value)))]
|
|
@@ -383,9 +364,7 @@
|
|
|
383
364
|
|
|
384
365
|
;; The k items of size bytes from index from of bytes, copied into a, or 0 for none.
|
|
385
366
|
(define (block [a (ptr arena)] [bytes (ptr u8)] [from u32] [k u32] [size u32]) -> (ptr void)
|
|
386
|
-
(if (== k 0)
|
|
387
|
-
0
|
|
388
|
-
(memcpy (arena-alloc a (* k size)) (+ bytes (* from size)) (* k size))))
|
|
367
|
+
(if (== k 0) 0 (-> (copy a (slice (+ bytes (* from size)) (* k size))) items)))
|
|
389
368
|
|
|
390
369
|
;; ---- writing ----
|
|
391
370
|
|
|
@@ -597,7 +576,7 @@
|
|
|
597
576
|
(when (> i count) (return #f))
|
|
598
577
|
(when (== count room)
|
|
599
578
|
(set! room (if (== room 0) 4 (* 2 room)))
|
|
600
|
-
(let ([q (
|
|
579
|
+
(let ([q (-> (new a json-value room) items)])
|
|
601
580
|
(when (> count 0) (memcpy q p (* count (sizeof json-value))))
|
|
602
581
|
(set! p q)))
|
|
603
582
|
(memcpy (+ p i 1) (+ p i) (* (- count i) (sizeof json-value)))
|
|
@@ -613,7 +592,7 @@
|
|
|
613
592
|
(let ([p (-> members items)] [count (-> members length)])
|
|
614
593
|
(when (== count room)
|
|
615
594
|
(set! room (if (== room 0) 4 (* 2 room)))
|
|
616
|
-
(let ([q (
|
|
595
|
+
(let ([q (-> (new a json-member room) items)])
|
|
617
596
|
(when (> count 0) (memcpy q p (* count (sizeof json-member))))
|
|
618
597
|
(set! p q)))
|
|
619
598
|
(let ([m (+ p count)])
|
|
@@ -660,7 +639,7 @@
|
|
|
660
639
|
[_ #f]))
|
|
661
640
|
|
|
662
641
|
(define (json-copy [a (ptr arena)] [v (ptr json-value)]) -> (ptr json-value)
|
|
663
|
-
(let ([out (
|
|
642
|
+
(let ([out (new a json-value)])
|
|
664
643
|
(copy-into! a out v)
|
|
665
644
|
out))
|
|
666
645
|
|
|
@@ -668,17 +647,17 @@
|
|
|
668
647
|
(if (== v 0) (set! (@ out) (json-null)) (set! (@ out) (@ v)))
|
|
669
648
|
(match out
|
|
670
649
|
[(json-array items room)
|
|
671
|
-
(let* ([count (-> items length)] [p (
|
|
672
|
-
(for ([i u32 0]) (< i count) (+= i 1) (copy-into! a (
|
|
673
|
-
(set! items
|
|
650
|
+
(let* ([count (-> items length)] [p (new a json-value count)])
|
|
651
|
+
(for ([i u32 0]) (< i count) (+= i 1) (copy-into! a (& (@ p i)) (& (@ items i))))
|
|
652
|
+
(set! items p)
|
|
674
653
|
(set! room count))]
|
|
675
654
|
[(json-object members room)
|
|
676
|
-
(let* ([count (-> members length)] [p (
|
|
655
|
+
(let* ([count (-> members length)] [p (new a json-member count)])
|
|
677
656
|
(for ([i u32 0]) (< i count) (+= i 1)
|
|
678
|
-
(let ([m (& (@ members i))] [q (
|
|
657
|
+
(let ([m (& (@ members i))] [q (& (@ p i))])
|
|
679
658
|
(set! (-> q key) (arena-text a (-> m key)))
|
|
680
659
|
(copy-into! a (& (-> q value)) (& (-> m value)))))
|
|
681
|
-
(set! members
|
|
660
|
+
(set! members p)
|
|
682
661
|
(set! room count))]
|
|
683
662
|
[_ (own! a out)]))
|
|
684
663
|
|
|
@@ -709,17 +688,17 @@
|
|
|
709
688
|
|
|
710
689
|
;; ---- reading into types ----
|
|
711
690
|
|
|
712
|
-
(define (expect! [r (ptr json-reader)] [t
|
|
691
|
+
(define (expect! [r (ptr json-reader)] [t json-token] [want json-token] [message string]) -> bool
|
|
713
692
|
(cond [(== t want) #t]
|
|
714
693
|
[(== t json-token-error) #f]
|
|
715
694
|
[else (reject! r message)]))
|
|
716
695
|
|
|
717
|
-
(define (take-unsigned! [r (ptr json-reader)] [t
|
|
696
|
+
(define (take-unsigned! [r (ptr json-reader)] [t json-token] [most u64] [to (ptr u64)]) -> bool
|
|
718
697
|
(and (expect! r t json-token-number "expected a number")
|
|
719
698
|
(or (and (digits? (-> r token) 10) (digits-integer (-> r token) 10 #f to) (<= (@ to) most))
|
|
720
699
|
(reject! r "expected an integer within the field's type"))))
|
|
721
700
|
|
|
722
|
-
(define (take-signed! [r (ptr json-reader)] [t
|
|
701
|
+
(define (take-signed! [r (ptr json-reader)] [t json-token] [least i64] [most i64] [to (ptr i64)]) -> bool
|
|
723
702
|
(unless (expect! r t json-token-number "expected a number") (return #f))
|
|
724
703
|
(let* ([negative (== (@ (-> r token) 0) #\-)] [digits (slice (-> r token) (if negative 1 0))] [k u64 0])
|
|
725
704
|
(or (and (digits? digits 10) (digits-integer digits 10 negative (& k))
|
|
@@ -727,16 +706,16 @@
|
|
|
727
706
|
(begin (set! (@ to) (cast i64 k)) #t))
|
|
728
707
|
(reject! r "expected an integer within the field's type"))))
|
|
729
708
|
|
|
730
|
-
(define (take-float! [r (ptr json-reader)] [t
|
|
709
|
+
(define (take-float! [r (ptr json-reader)] [t json-token] [to (ptr f64)]) -> bool
|
|
731
710
|
(and (expect! r t json-token-number "expected a number")
|
|
732
711
|
(begin (set! (@ to) (-> r number)) #t)))
|
|
733
712
|
|
|
734
|
-
(define (take-bool! [r (ptr json-reader)] [t
|
|
713
|
+
(define (take-bool! [r (ptr json-reader)] [t json-token] [to (ptr bool)]) -> bool
|
|
735
714
|
(cond [(== t json-token-true) (set! (@ to) #t) #t]
|
|
736
715
|
[(== t json-token-false) (set! (@ to) #f) #t]
|
|
737
716
|
[else (expect! r t json-token-true "expected true or false")]))
|
|
738
717
|
|
|
739
|
-
(define (take-text! [r (ptr json-reader)] [a (ptr arena)] [t
|
|
718
|
+
(define (take-text! [r (ptr json-reader)] [a (ptr arena)] [t json-token] [to (ptr string)]) -> bool
|
|
740
719
|
(and (expect! r t json-token-string "expected a string")
|
|
741
720
|
(begin (set! (@ to) (arena-text a (-> r token))) #t)))
|
|
742
721
|
|
|
@@ -786,7 +765,7 @@
|
|
|
786
765
|
(define (struct-code [t datum] [fields datum]) -> datum
|
|
787
766
|
`(,#`(define (#,(derive-name t '"json-write!") [b (ptr buffer)] [v (ptr #,t)])
|
|
788
767
|
#,@(object-write fields (for/list ([f fields]) #`(-> v #,(car f)))))
|
|
789
|
-
,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token
|
|
768
|
+
,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token json-token] [v (ptr #,t)]) -> bool
|
|
790
769
|
#,(object-read #`token fields (for/list ([f fields]) #`(-> v #,(car f))))
|
|
791
770
|
#t)
|
|
792
771
|
,(entry t)))
|
|
@@ -812,7 +791,7 @@
|
|
|
812
791
|
objects))))))
|
|
813
792
|
`(,#`(define (#,(derive-name t '"json-write!") [b (ptr buffer)] [v (ptr #,t)])
|
|
814
793
|
(match v #,@(reverse writes)))
|
|
815
|
-
,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token
|
|
794
|
+
,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token json-token] [v (ptr #,t)]) -> bool
|
|
816
795
|
(cond [(== token json-token-string)
|
|
817
796
|
(cond #,@(reverse names)
|
|
818
797
|
[else (return (reject! r "unknown case"))])]
|
|
@@ -861,7 +840,7 @@
|
|
|
861
840
|
(return (reject! r #,(literal (format "missing field ~a" `(,(syntax-e (car f))))))))
|
|
862
841
|
checks))))
|
|
863
842
|
(+= i 1))
|
|
864
|
-
#`(let ([#,seen (array bool #,n)] [#,k
|
|
843
|
+
#`(let ([#,seen (array bool #,n)] [#,k json-token])
|
|
865
844
|
(memset #,seen 0 #,n)
|
|
866
845
|
#,@(reverse defaults)
|
|
867
846
|
(unless (expect! r #,token json-token-start-object "expected an object") (return #f))
|
|
@@ -918,20 +897,20 @@
|
|
|
918
897
|
(let ([q (derive-fresh 'q)] [e (type-syntax (cadr type))])
|
|
919
898
|
#`(if (== #,u json-token-null)
|
|
920
899
|
(set! #,p 0)
|
|
921
|
-
(let ([#,q (
|
|
900
|
+
(let ([#,q (new a #,e)])
|
|
922
901
|
#,(read-code (cadr type) #`(@ #,q) where u)
|
|
923
902
|
(set! #,p #,q))))]
|
|
924
903
|
[(== (car type) 'slice)
|
|
925
904
|
(let ([items (derive-fresh 'items)] [count (derive-fresh 'count)] [room (derive-fresh 'room)] [w (derive-fresh 'w)]
|
|
926
905
|
[more (derive-fresh 'more)] [e (type-syntax (cadr type))])
|
|
927
|
-
#`(let ([#,items (ptr #,e) 0] [#,count u32 0] [#,room u32 0] [#,w
|
|
906
|
+
#`(let ([#,items (ptr #,e) 0] [#,count u32 0] [#,room u32 0] [#,w json-token])
|
|
928
907
|
(unless (expect! r #,u json-token-start-array "expected an array") (return #f))
|
|
929
908
|
(while #t
|
|
930
909
|
(set! #,w (json-next! r))
|
|
931
910
|
(when (== #,w json-token-end-array) (break))
|
|
932
911
|
(when (== #,count #,room)
|
|
933
912
|
(set! #,room (if (== #,room 0) 4 (* 2 #,room)))
|
|
934
|
-
(let ([#,more (
|
|
913
|
+
(let ([#,more (-> (new a #,e #,room) items)])
|
|
935
914
|
(when (> #,count 0) (memcpy #,more #,items (* #,count (sizeof #,e))))
|
|
936
915
|
(set! #,items #,more)))
|
|
937
916
|
#,(read-code (cadr type) #`(@ #,items #,count) where w)
|
|
@@ -940,7 +919,7 @@
|
|
|
940
919
|
[(== (car type) 'array)
|
|
941
920
|
(let ([i (derive-fresh 'i)] [w (derive-fresh 'w)] [n (literal (caddr type))]
|
|
942
921
|
[message (literal (format "expected an array of ~a items" `(,(caddr type))))])
|
|
943
|
-
#`(let ([#,w
|
|
922
|
+
#`(let ([#,w json-token])
|
|
944
923
|
(unless (expect! r #,u json-token-start-array "expected an array") (return #f))
|
|
945
924
|
(for ([#,i u32 0]) (< #,i #,n) (+= #,i 1)
|
|
946
925
|
(set! #,w (json-next! r))
|
package/std/encoding/wire.sub
CHANGED
|
@@ -96,11 +96,9 @@
|
|
|
96
96
|
(unless (take-count! r (& n)) (return #f))
|
|
97
97
|
(let ([s (slice (-> r bytes) (-> r at) (+ (-> r at) n))])
|
|
98
98
|
(unless (utf-8? s) (return (refuse! r start "a string is not UTF-8")))
|
|
99
|
-
(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
(+= (-> r at) n)
|
|
103
|
-
#t))))
|
|
99
|
+
(set! (@ to) (cast string (copy a s)))
|
|
100
|
+
(+= (-> r at) n)
|
|
101
|
+
#t)))
|
|
104
102
|
|
|
105
103
|
;; ---- the wire form ----
|
|
106
104
|
|
|
@@ -210,7 +208,7 @@
|
|
|
210
208
|
#`(let ([#,present #f])
|
|
211
209
|
(unless (take-flag! r (& #,present) "an option's tag is neither 0 nor 1") (return #f))
|
|
212
210
|
(if #,present
|
|
213
|
-
(let ([#,q (
|
|
211
|
+
(let ([#,q (new a #,u)])
|
|
214
212
|
#,(read-code (cadr type) #`(@ #,q) where)
|
|
215
213
|
(set! #,p #,q))
|
|
216
214
|
(set! #,p 0))))]
|
|
@@ -218,9 +216,9 @@
|
|
|
218
216
|
(let ([n (derive-fresh 'n)] [items (derive-fresh 'items)] [i (derive-fresh 'i)] [u (type-syntax (cadr type))])
|
|
219
217
|
#`(let ([#,n u32 0])
|
|
220
218
|
(unless (take-count! r (& #,n)) (return #f))
|
|
221
|
-
(let ([#,items (
|
|
219
|
+
(let ([#,items (new a #,u #,n)])
|
|
222
220
|
(for ([#,i u32 0]) (< #,i #,n) (+= #,i 1) #,(read-code (cadr type) #`(@ #,items #,i) where))
|
|
223
|
-
(set! #,p
|
|
221
|
+
(set! #,p #,items))))]
|
|
224
222
|
[(== (car type) 'array)
|
|
225
223
|
(let ([i (derive-fresh 'i)])
|
|
226
224
|
#`(for ([#,i u32 0]) (< #,i #,(literal (caddr type))) (+= #,i 1)
|
package/std/http/checks.sub
CHANGED
|
@@ -200,12 +200,12 @@
|
|
|
200
200
|
|
|
201
201
|
;; The table starts with 64 buckets and doubles, up to most, when three quarters full.
|
|
202
202
|
(define (grow! [l (ptr http-limit)] [size u32])
|
|
203
|
-
(let ([old (-> l buckets)] [n (-> l size)] [
|
|
203
|
+
(let ([old (-> l buckets)] [n (-> l size)] [more (-> (new 0 bucket size) items)])
|
|
204
204
|
(for ([i u32 0]) (< i n) (+= i 1)
|
|
205
205
|
(let ([b (& (@ old i))])
|
|
206
|
-
(when (-> b used) (memcpy (slot
|
|
206
|
+
(when (-> b used) (memcpy (slot more size (slice (cast (ptr u8) (-> b key)) (-> b length))) b (sizeof bucket)))))
|
|
207
207
|
(free old)
|
|
208
|
-
(set! (-> l buckets)
|
|
208
|
+
(set! (-> l buckets) more)
|
|
209
209
|
(set! (-> l size) size)))
|
|
210
210
|
|
|
211
211
|
(define (bucket-of [l (ptr http-limit)] [key (slice u8)]) -> (ptr bucket)
|
package/std/http/conditional.sub
CHANGED
|
@@ -53,13 +53,11 @@
|
|
|
53
53
|
(define (second-of [ms f64]) -> f64 (* (floor (/ ms 1000.0)) 1000.0))
|
|
54
54
|
|
|
55
55
|
(define (http-conditional! [r (ptr http-request)] [etag string] [modified f64]) -> bool
|
|
56
|
-
(let* ([a (& (-> r arena))] [
|
|
57
|
-
[read? (or (== (-> r method) "GET") (== (-> r method) "HEAD"))]
|
|
56
|
+
(let* ([a (& (-> r arena))] [read? (or (== (-> r method) "GET") (== (-> r method) "HEAD"))]
|
|
58
57
|
[if-match (http-request-header r "if-match")] [if-none-match (http-request-header r "if-none-match")]
|
|
59
58
|
[unmodified (date-of r "if-unmodified-since")] [since (date-of r "if-modified-since")]
|
|
60
59
|
[changed (second-of modified)] [status i32 0])
|
|
61
|
-
(
|
|
62
|
-
(set! (-> r etag) (cast string (slice copy (-> etag length))))
|
|
60
|
+
(set! (-> r etag) (copy a etag))
|
|
63
61
|
(set! (-> r modified) modified)
|
|
64
62
|
(cond [(> (-> if-match length) 0) (unless (matches? if-match etag #t) (set! status 412))]
|
|
65
63
|
[(and (>= unmodified 0.0) (> modified 0.0) (> changed unmodified)) (set! status 412)])
|
package/std/http/cookie.sub
CHANGED
|
@@ -3,16 +3,14 @@
|
|
|
3
3
|
(require-unqualified "http.sub")
|
|
4
4
|
(require-unqualified "server.sub")
|
|
5
5
|
|
|
6
|
-
(provide http-cookie http-request-cookie http-set-cookie! http-same-site-
|
|
7
|
-
http-same-site-none)
|
|
6
|
+
(provide http-cookie http-request-cookie http-set-cookie! http-same-site http-same-site-default http-same-site-lax
|
|
7
|
+
http-same-site-strict http-same-site-none)
|
|
8
8
|
|
|
9
|
-
(
|
|
10
|
-
(const http-same-site-strict i32 2)
|
|
11
|
-
(const http-same-site-none i32 3)
|
|
9
|
+
(enum http-same-site http-same-site-default http-same-site-lax http-same-site-strict http-same-site-none)
|
|
12
10
|
|
|
13
|
-
;; max-age is in seconds: 0 leaves it out, and below 0 ends the cookie now. same-site
|
|
11
|
+
;; max-age is in seconds: 0 leaves it out, and below 0 ends the cookie now. http-same-site-default leaves SameSite out.
|
|
14
12
|
(struct http-cookie [name string] [value string] [path string] [domain string] [max-age i64] [secure bool]
|
|
15
|
-
[http-only bool] [same-site
|
|
13
|
+
[http-only bool] [same-site http-same-site])
|
|
16
14
|
|
|
17
15
|
(define separators string "()<>@,;:\\\"/[]?={}")
|
|
18
16
|
|
package/std/http/form.sub
CHANGED
|
@@ -111,11 +111,11 @@
|
|
|
111
111
|
(check! (cadr type) name)
|
|
112
112
|
(let ([e (type-syntax (cadr type))])
|
|
113
113
|
(if (upload? (cadr type))
|
|
114
|
-
#`(let ([#,q (
|
|
114
|
+
#`(let ([#,q (new a http-upload)])
|
|
115
115
|
(set! #,p (if (file parts #,key 0 #,q) #,q 0)))
|
|
116
116
|
#`(let ([#,s string])
|
|
117
117
|
(if (text pairs parts #,key 0 (& #,s))
|
|
118
|
-
(let ([#,q (
|
|
118
|
+
(let ([#,q (new a #,e)])
|
|
119
119
|
#,(value-code (cadr type) s #`(@ #,q) key)
|
|
120
120
|
(set! #,p #,q))
|
|
121
121
|
(set! #,p 0)))))]
|
|
@@ -123,17 +123,14 @@
|
|
|
123
123
|
(check! (cadr type) name)
|
|
124
124
|
(let ([e (type-syntax (cadr type))])
|
|
125
125
|
(if (upload? (cadr type))
|
|
126
|
-
#`(let* ([#,n (files parts #,key)]
|
|
127
|
-
|
|
128
|
-
(
|
|
129
|
-
|
|
130
|
-
#`(let* ([#,n (texts pairs parts #,key)]
|
|
131
|
-
[#,items (cast (ptr #,e) (arena-alloc a (* #,n (sizeof #,e))))]
|
|
132
|
-
[#,s string])
|
|
126
|
+
#`(let* ([#,n (files parts #,key)] [#,items (new a http-upload #,n)])
|
|
127
|
+
(for ([#,k u32 0]) (< #,k #,n) (+= #,k 1) (file parts #,key #,k (& (@ #,items #,k))))
|
|
128
|
+
(set! #,p #,items))
|
|
129
|
+
#`(let* ([#,n (texts pairs parts #,key)] [#,items (new a #,e #,n)] [#,s string])
|
|
133
130
|
(for ([#,k u32 0]) (< #,k #,n) (+= #,k 1)
|
|
134
131
|
(text pairs parts #,key #,k (& #,s))
|
|
135
132
|
#,(value-code (cadr type) s #`(@ #,items #,k) key))
|
|
136
|
-
(set! #,p
|
|
133
|
+
(set! #,p #,items))))]
|
|
137
134
|
[(== type 'bool)
|
|
138
135
|
#`(let ([#,s string])
|
|
139
136
|
(if (text pairs parts #,key 0 (& #,s))
|
package/std/http/http.sub
CHANGED
|
@@ -18,18 +18,11 @@
|
|
|
18
18
|
(struct http-head [line buffer] [names (ptr string)] [values (ptr string)] [room u32] [count u32]
|
|
19
19
|
[method string] [target string] [version string] [status i32] [reason string])
|
|
20
20
|
|
|
21
|
-
(
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
(
|
|
26
|
-
(const state-trailers i32 5)
|
|
27
|
-
(const state-until-close i32 6)
|
|
28
|
-
(const state-stopped i32 7)
|
|
29
|
-
(const state-refused i32 8)
|
|
30
|
-
(const state-no-body i32 9)
|
|
31
|
-
|
|
32
|
-
(struct http-parser [head http-head] [line buffer] [state i32] [remaining i64] [excess i64] [user (ptr void)]
|
|
21
|
+
(enum parser-state
|
|
22
|
+
state-head state-length state-chunk-size state-chunk-data state-chunk-end state-trailers state-until-close
|
|
23
|
+
state-stopped state-refused state-no-body)
|
|
24
|
+
|
|
25
|
+
(struct http-parser [head http-head] [line buffer] [state parser-state] [remaining i64] [excess i64] [user (ptr void)]
|
|
33
26
|
[on-head (fn ((ptr http-parser)))] [on-body (fn ((ptr http-parser) (slice u8)))] [on-end (fn ((ptr http-parser)))])
|
|
34
27
|
|
|
35
28
|
;; ---- text ----
|
|
@@ -102,14 +95,14 @@
|
|
|
102
95
|
(when (and (< i n) (== (@ value i) #\=))
|
|
103
96
|
(+= i 1)
|
|
104
97
|
(if (and (< i n) (== (@ value i) #\"))
|
|
105
|
-
(let ([p (
|
|
98
|
+
(let ([p (new a u8 (- n i))] [k u32 0])
|
|
106
99
|
(+= i 1)
|
|
107
100
|
(while (and (< i n) (!= (@ value i) #\"))
|
|
108
101
|
(when (and (== (@ value i) #\\) (< (+ i 1) n)) (+= i 1))
|
|
109
102
|
(set! (@ p k) (@ value i))
|
|
110
103
|
(+= k 1)
|
|
111
104
|
(+= i 1))
|
|
112
|
-
(set! found (cast string (slice p k))))
|
|
105
|
+
(set! found (cast string (slice p 0 k))))
|
|
113
106
|
(begin
|
|
114
107
|
(set! start i)
|
|
115
108
|
(while (and (< i n) (!= (@ value i) #\;)) (+= i 1))
|
|
@@ -201,22 +194,22 @@
|
|
|
201
194
|
|
|
202
195
|
;; to becomes a copy of from with its own text and room for just its headers, which http-head-free! frees.
|
|
203
196
|
(define (http-head-copy! [to (ptr http-head)] [from (ptr http-head)])
|
|
204
|
-
(let ([old (-> from line bytes)] [
|
|
197
|
+
(let ([old (-> from line bytes)] [text (ptr u8) 0] [n (-> from count)])
|
|
205
198
|
(set! (-> to line) (make-buffer))
|
|
206
199
|
(buffer-add! (& (-> to line)) (buffer-bytes (& (-> from line))))
|
|
207
|
-
(set!
|
|
208
|
-
(set! (-> to names) (
|
|
209
|
-
(set! (-> to values) (
|
|
200
|
+
(set! text (-> to line bytes))
|
|
201
|
+
(set! (-> to names) (-> (new 0 string n) items))
|
|
202
|
+
(set! (-> to values) (-> (new 0 string n) items))
|
|
210
203
|
(set! (-> to room) n)
|
|
211
204
|
(for ([i u32 0]) (< i (-> from count)) (+= i 1)
|
|
212
|
-
(set! (@ (-> to names) i) (moved (@ (-> from names) i) old
|
|
213
|
-
(set! (@ (-> to values) i) (moved (@ (-> from values) i) old
|
|
205
|
+
(set! (@ (-> to names) i) (moved (@ (-> from names) i) old text))
|
|
206
|
+
(set! (@ (-> to values) i) (moved (@ (-> from values) i) old text)))
|
|
214
207
|
(set! (-> to count) (-> from count))
|
|
215
|
-
(set! (-> to method) (moved (-> from method) old
|
|
216
|
-
(set! (-> to target) (moved (-> from target) old
|
|
217
|
-
(set! (-> to version) (moved (-> from version) old
|
|
208
|
+
(set! (-> to method) (moved (-> from method) old text))
|
|
209
|
+
(set! (-> to target) (moved (-> from target) old text))
|
|
210
|
+
(set! (-> to version) (moved (-> from version) old text))
|
|
218
211
|
(set! (-> to status) (-> from status))
|
|
219
|
-
(set! (-> to reason) (moved (-> from reason) old
|
|
212
|
+
(set! (-> to reason) (moved (-> from reason) old text))))
|
|
220
213
|
|
|
221
214
|
(define (moved [s string] [old (ptr u8)] [new (ptr u8)]) -> string
|
|
222
215
|
(if (== (-> s length) 0) "" (cast string (slice (+ new (- (cast u32 (-> s bytes)) (cast u32 old))) (-> s length)))))
|
package/std/http/multipart.sub
CHANGED
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
-1))
|
|
28
28
|
|
|
29
29
|
(define (joined [a (ptr arena)] [front string] [back string]) -> string
|
|
30
|
-
(let ([p (
|
|
31
|
-
(memcpy p (-> front bytes) (-> front length))
|
|
32
|
-
(memcpy (+ p (-> front length)) (-> back bytes) (-> back length))
|
|
33
|
-
(cast string
|
|
30
|
+
(let ([p (new a u8 (+ (-> front length) (-> back length)))])
|
|
31
|
+
(memcpy (-> p items) (-> front bytes) (-> front length))
|
|
32
|
+
(memcpy (+ (-> p items) (-> front length)) (-> back bytes) (-> back length))
|
|
33
|
+
(cast string p)))
|
|
34
34
|
|
|
35
35
|
(define (base-name [s string]) -> string
|
|
36
36
|
(let ([i (-> s length)])
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
(when (> (-> part name length) 0)
|
|
98
98
|
(when (== count room)
|
|
99
99
|
(set! room (if (== room 0) 4 (* 2 room)))
|
|
100
|
-
(let ([more (
|
|
100
|
+
(let ([more (-> (new a multipart-part room) items)])
|
|
101
101
|
(when (> count 0) (memcpy more items (* count (sizeof multipart-part))))
|
|
102
102
|
(set! items more)))
|
|
103
103
|
(set! (@ items count) part)
|
package/std/http/route.sub
CHANGED
|
@@ -18,20 +18,20 @@
|
|
|
18
18
|
(define (route-rest [a (ptr arena)] [segments (slice string)] [i u32]) -> string
|
|
19
19
|
(let ([n u32 0] [at u32 0])
|
|
20
20
|
(for ([k u32 i]) (< k (-> segments length)) (+= k 1) (+= n (+ (-> (@ segments k) length) 1)))
|
|
21
|
-
(let ([p (
|
|
21
|
+
(let ([p (new a u8 n)])
|
|
22
22
|
(for ([k u32 i]) (< k (-> segments length)) (+= k 1)
|
|
23
23
|
(when (> k i)
|
|
24
24
|
(set! (@ p at) #\/)
|
|
25
25
|
(+= at 1))
|
|
26
|
-
(memcpy (+ p at) (-> (@ segments k) bytes) (-> (@ segments k) length))
|
|
26
|
+
(memcpy (+ (-> p items) at) (-> (@ segments k) bytes) (-> (@ segments k) length))
|
|
27
27
|
(+= at (-> (@ segments k) length)))
|
|
28
|
-
(cast string (slice p at)))))
|
|
28
|
+
(cast string (slice p 0 at)))))
|
|
29
29
|
|
|
30
30
|
(define (route-slashed [a (ptr arena)] [segments (slice string)]) -> (slice string)
|
|
31
|
-
(let* ([n (-> segments length)] [items (
|
|
31
|
+
(let* ([n (-> segments length)] [items (new a string (+ n 1))])
|
|
32
32
|
(for ([i u32 0]) (< i n) (+= i 1) (set! (@ items i) (@ segments i)))
|
|
33
33
|
(set! (@ items n) "")
|
|
34
|
-
|
|
34
|
+
items))
|
|
35
35
|
|
|
36
36
|
(define (route-moved! [r (ptr http-request)] [path string])
|
|
37
37
|
(let ([b (make-buffer)] [target (-> r target)])
|
|
@@ -440,7 +440,7 @@
|
|
|
440
440
|
#,@(if (== body 0)
|
|
441
441
|
`(,#`(unless (route-typed? r #,(literal (boolean (!= json 0)))) (return)))
|
|
442
442
|
nil)
|
|
443
|
-
(let ([#,args (
|
|
443
|
+
(let ([#,args (new (& (-> r arena)) #,given)])
|
|
444
444
|
#,@(for/list ([x values]) #`(set! (-> #,args #,x) #,x))
|
|
445
445
|
(set! (-> r route) (cast (ptr void) #,args))
|
|
446
446
|
(http-read-body! r #,(if (== limit 0) (number 0) limit) #,read)))
|
|
@@ -448,7 +448,7 @@
|
|
|
448
448
|
[start #`(define (#,(start-of r) [r (ptr http-request)] #,@(formals ps))
|
|
449
449
|
#,(if (== query 0)
|
|
450
450
|
ending
|
|
451
|
-
#`(let ([#,q (
|
|
451
|
+
#`(let ([#,q (new (& (-> r arena)) #,query)]
|
|
452
452
|
[#,e form-error])
|
|
453
453
|
(unless (#,(derived query '"form-read" 'form where) (& (-> r arena))
|
|
454
454
|
(url-form-parse (& (-> r arena)) (url-query (-> r target))) no-parts #,q
|
|
@@ -462,14 +462,14 @@
|
|
|
462
462
|
(let* ([#,args (cast (ptr #,given) (-> r route))] #,@(for/list ([x values]) #`[#,x (-> #,args #,x)]))
|
|
463
463
|
#,(cond [(!= body 0) (handler-call handler values `(,#'bytes))]
|
|
464
464
|
[(!= json 0)
|
|
465
|
-
#`(let ([#,value (
|
|
465
|
+
#`(let ([#,value (new (& (-> r arena)) #,json)]
|
|
466
466
|
[#,e json-error])
|
|
467
467
|
(unless (#,(derived json '"json-read" 'json where) (& (-> r arena)) (cast string bytes)
|
|
468
468
|
#,value (& #,e))
|
|
469
469
|
(return (route-json-refused! r (& #,e))))
|
|
470
470
|
#,(handler-call handler values `(,value)))]
|
|
471
471
|
[else
|
|
472
|
-
#`(let ([#,value (
|
|
472
|
+
#`(let ([#,value (new (& (-> r arena)) #,form)]
|
|
473
473
|
[#,e form-error] [pairs (slice url-pair)] [parts (slice multipart-part)])
|
|
474
474
|
(unless (route-form-fields r bytes (& pairs) (& parts)) (return))
|
|
475
475
|
(unless (#,(derived form '"form-read" 'form where) (& (-> r arena)) pairs parts #,value
|