@@ -246,13 +246,105 @@ macro `.`*(obj: JsonNode, field: untyped): JsonNode =
246
246
newCall("[]", obj, newLit($field.toStrLit))
247
247
248
248
249
+ const defaultHeaders = "Content-Type: text/plain;charset=utf-8"
250
+
251
+
249
252
template answer*(
250
253
req: Request,
251
254
message: string | int | float | bool | char ,
252
- code: HttpCode = Http200,
253
- headers: HttpHeaders = newHttpHeaders([
255
+ code: HttpCode = Http200
256
+ ) =
257
+ ## Answers to the request
258
+ ##
259
+ ## ⚠ `Low-level API` ⚠
260
+ ##
261
+ ## Arguments:
262
+ ## `req: Request`: An instance of the Request type , representing the request that we are responding to.
263
+ ## `message: string`: The message that we want to include in the response body.
264
+ ## `code: HttpCode = Http200`: The HTTP status code that we want to send in the response.
265
+ ## This argument is optional, with a default value of Http200 (OK).
266
+ ##
267
+ ## Use this example instead
268
+ ##
269
+ ## .. code-block::nim
270
+ ## get "/":
271
+ ## return "Hello, world!"
272
+ ##
273
+ const useHeaders = declared(outHeaders) or declared(outCookies) or corsRegistered.value > 0
274
+ when useHeaders:
275
+ var h = newHttpHeaders([
254
276
("Content-Type", "text/plain; charset=utf-8")
255
- ]),
277
+ ])
278
+ when corsRegistered.value > 0 :
279
+ when exportJvm or exportPython or defined(napibuild):
280
+ when enableHttpBeast or enableHttpx:
281
+ addCORSHeaders(req.ip, h)
282
+ else :
283
+ addCORSHeaders(req.hostname, h)
284
+ else :
285
+ h.addCORSHeaders()
286
+ when declared(outHeaders):
287
+ for key, val in outHeaders.pairs():
288
+ h[key] = val
289
+ # HTTPX
290
+ when enableHttpx:
291
+ when useHeaders:
292
+ var headersArr = " "
293
+ for key, value in h.pairs():
294
+ headersArr &= key & ':' & value & " \r\n "
295
+ when declared(outCookies):
296
+ for cookie in outCookies:
297
+ headersArr &= cookie & " \r\n "
298
+ if headersArr.len > 0 :
299
+ headersArr.delete(headersArr.len- 2 .. headersArr.len- 1 )
300
+ when declared(statusCode):
301
+ when statusCode is int :
302
+ req.send(statusCode.HttpCode, $ message, when useHeaders: headersArr else : defaultHeaders)
303
+ else :
304
+ req.send(code, $ message, when useHeaders: headersArr else : defaultHeaders)
305
+ else :
306
+ req.send(code, $ message, when useHeaders: headersArr else : defaultHeaders)
307
+ # HTTP BEAST
308
+ elif enableHttpBeast:
309
+ when useHeaders:
310
+ var headersArr = " "
311
+ for key, value in h.pairs():
312
+ headersArr &= key & ':' & value & " \r\n "
313
+ when declared(outCookies):
314
+ for cookie in outCookies:
315
+ headersArr &= cookie & " \r\n "
316
+ if headersArr.len > 0 :
317
+ headersArr.delete(headersArr.len- 2 .. headersArr.len- 1 )
318
+ when declared(statusCode):
319
+ when statusCode is int :
320
+ req.send(statusCode.HttpCode, $ message, when useHeaders: headersArr else : defaultHeaders)
321
+ else :
322
+ req.send(code, $ message, when useHeaders: headersArr else : defaultHeaders)
323
+ else :
324
+ req.send(code, $ message, when useHeaders: headersArr else : defaultHeaders)
325
+ # ASYNC HTTP SERVER / MICRO ASYNC HTTP SERVER
326
+ else :
327
+ when useHeaders:
328
+ when declared(outCookies):
329
+ for cookie in outCookies:
330
+ let data = cookie.split(" :" , 1 )
331
+ h.add(" Set-Cookie" , data[1 ].strip())
332
+ else :
333
+ let h = newHttpHeaders([(" Content-Type" , " text/plain; charset=utf-8" )])
334
+ when declared(statusCode):
335
+ when statusCode is int :
336
+ await req.respond(statusCode.HttpCode, $ message, h)
337
+ else :
338
+ await req.respond(code, $ message, h)
339
+ else :
340
+ await req.respond(code, $ message, h)
341
+
342
+
343
+ template answer* (
344
+ req: Request,
345
+ message: string | int | float | bool | char ,
346
+ code: HttpCode = Http200,
347
+ headers: HttpHeaders,
256
348
contentLength: Option[int ] = int .none
257
349
) =
258
350
# # Answers to the request
@@ -272,13 +364,14 @@ template answer*(
272
364
# # return "Hello, world!"
273
365
# #
274
366
var h = headers
275
- when exportJvm or exportPython or defined(napibuild):
276
- when enableHttpBeast or enableHttpx:
277
- addCORSHeaders(req.ip, h)
367
+ when corsRegistered.value > 0 :
368
+ when exportJvm or exportPython or defined(napibuild):
369
+ when enableHttpBeast or enableHttpx:
370
+ addCORSHeaders(req.ip, h)
371
+ else :
372
+ addCORSHeaders(req.hostname, h)
278
373
else :
279
- addCORSHeaders(req.hostname, h)
280
- else :
281
- h.addCORSHeaders()
374
+ h.addCORSHeaders()
282
375
when declared(outHeaders):
283
376
for key, val in outHeaders.pairs():
284
377
h[key] = val
@@ -291,7 +384,7 @@ template answer*(
291
384
for cookie in outCookies:
292
385
headersArr &= cookie & " \r\n "
293
386
if headersArr.len > 0 :
294
- headersArr = headersArr[ 0 ..^ 3 ]
387
+ headersArr.delete( headersArr.len - 2 .. headersArr.len - 1 )
295
388
if contentLength.isSome:
296
389
# useful for file answers
297
390
when declared(statusCode):
@@ -318,7 +411,7 @@ template answer*(
318
411
for cookie in outCookies:
319
412
headersArr &= cookie & " \r\n "
320
413
if headersArr.len > 0 :
321
- headersArr = headersArr[ 0 ..^ 3 ]
414
+ headersArr.delete( headersArr.len - 2 .. headersArr.len - 1 )
322
415
when declared(statusCode):
323
416
when statusCode is int :
324
417
req.send(statusCode.HttpCode, $ message, headersArr)
0 commit comments