diff options
-rw-r--r-- | src/server/response.nim | 49 | ||||
-rw-r--r-- | src/types/blob.nim | 7 |
2 files changed, 14 insertions, 42 deletions
diff --git a/src/server/response.nim b/src/server/response.nim index 37ff2434..1f68932a 100644 --- a/src/server/response.nim +++ b/src/server/response.nim @@ -124,49 +124,8 @@ proc resume*(response: Response) = response.resumeFun(response.outputId) response.resumeFun = nil -type TextOpaque = ref object of RootObj - buf: string - bodyRead: Promise[JSResult[string]] - const BufferSize = 4096 -proc onReadText(response: Response) = - let opaque = TextOpaque(response.opaque) - while true: - let olen = opaque.buf.len - try: - opaque.buf.setLen(olen + BufferSize) - let n = response.body.recvData(addr opaque.buf[olen], BufferSize) - opaque.buf.setLen(olen + n) - if n == 0: - break - except ErrorAgain: - opaque.buf.setLen(olen) - break - -proc onFinishText(response: Response; success: bool) = - let opaque = TextOpaque(response.opaque) - let bodyRead = opaque.bodyRead - if success: - let charset = response.getCharset(CHARSET_UTF_8) - bodyRead.resolve(JSResult[string].ok(opaque.buf.decodeAll(charset))) - else: - bodyRead.resolve(JSResult[string].err(newFetchTypeError())) - -proc text*(response: Response): Promise[JSResult[string]] {.jsfunc.} = - if response.body == nil: - return newResolvedPromise(JSResult[string].ok("")) - if response.bodyUsed: - let err = newTypeError("Body has already been consumed") - return newResolvedPromise(JSResult[string].err(err)) - let opaque = TextOpaque(bodyRead: Promise[JSResult[string]]()) - response.opaque = opaque - response.onRead = onReadText - response.onFinish = onFinishText - response.bodyUsed = true - response.resume() - return opaque.bodyRead - type BlobOpaque = ref object of RootObj p: pointer len: int @@ -194,7 +153,7 @@ proc onFinishBlob(response: Response; success: bool) = let opaque = BlobOpaque(response.opaque) let bodyRead = opaque.bodyRead if success: - let p = realloc(opaque.p, opaque.len) + let p = opaque.p opaque.p = nil let blob = if p == nil: newBlob(nil, 0, opaque.contentType, nil) @@ -225,6 +184,12 @@ proc blob*(response: Response): Promise[JSResult[Blob]] {.jsfunc.} = response.resume() return opaque.bodyRead +proc text*(response: Response): Promise[JSResult[string]] {.jsfunc.} = + return response.blob().then(proc(res: JSResult[Blob]): JSResult[string] = + let blob = ?res + return ok(blob.toOpenArray().toValidUTF8()) + ) + proc json(ctx: JSContext; this: Response): Promise[JSValue] {.jsfunc.} = return this.text().then(proc(s: JSResult[string]): JSValue = if s.isNone: diff --git a/src/types/blob.nim b/src/types/blob.nim index f21d0954..689883a8 100644 --- a/src/types/blob.nim +++ b/src/types/blob.nim @@ -77,6 +77,13 @@ proc deallocBlob*(opaque, p: pointer) = if p != nil: dealloc(p) +template toOpenArray*(blob: Blob): openArray[char] = + let p = cast[ptr UncheckedArray[char]](blob.buffer) + if p != nil: + p.toOpenArray(0, blob.size - 1) + else: + [] + proc finalize(blob: Blob) {.jsfin.} = if blob.fd.isSome: discard close(blob.fd.get) |