Skip to content

Commit 700e714

Browse files
committed
improve server answer speed
1 parent a39b5a3 commit 700e714

File tree

4 files changed

+110
-13
lines changed

4 files changed

+110
-13
lines changed

happyx.nimble

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
description = "Macro-oriented asynchronous web-framework written with ♥"
44
author = "HapticX"
5-
version = "4.6.0"
5+
version = "4.6.1"
66
license = "MIT"
77
srcDir = "src"
88
installExt = @["nim"]

src/happyx/core/constants.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ const
107107
# Framework version
108108
HpxMajor* = 4
109109
HpxMinor* = 6
110-
HpxPatch* = 0
110+
HpxPatch* = 1
111111
HpxVersion* = $HpxMajor & "." & $HpxMinor & "." & $HpxPatch
112112

113113

src/happyx/ssr/cors.nim

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ type
2929
allowMethods*: string
3030

3131

32+
const corsRegistered* = CacheCounter"HappyXCORSRegistered"
33+
34+
3235

3336
when not defined(js) and not (exportJvm or exportPython or defined(napibuild)):
3437
var currentCORS {. compileTime .} = CORSObj()
@@ -81,6 +84,7 @@ when not defined(js) and not (exportJvm or exportPython or defined(napibuild)):
8184
else:
8285
result.add quote do:
8386
`headers`["Access-Control-Allow-Origin"] = `allowOrigins`
87+
inc corsRegistered
8488

8589
macro regCORS*(body: untyped): untyped =
8690
## Register CORS

src/happyx/ssr/server.nim

Lines changed: 104 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -246,13 +246,105 @@ macro `.`*(obj: JsonNode, field: untyped): JsonNode =
246246
newCall("[]", obj, newLit($field.toStrLit))
247247
248248
249+
const defaultHeaders = "Content-Type: text/plain;charset=utf-8"
250+
251+
249252
template answer*(
250253
req: Request,
251254
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([
254276
("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,
256348
contentLength: Option[int] = int.none
257349
) =
258350
## Answers to the request
@@ -272,13 +364,14 @@ template answer*(
272364
## return "Hello, world!"
273365
##
274366
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)
278373
else:
279-
addCORSHeaders(req.hostname, h)
280-
else:
281-
h.addCORSHeaders()
374+
h.addCORSHeaders()
282375
when declared(outHeaders):
283376
for key, val in outHeaders.pairs():
284377
h[key] = val
@@ -291,7 +384,7 @@ template answer*(
291384
for cookie in outCookies:
292385
headersArr &= cookie & "\r\n"
293386
if headersArr.len > 0:
294-
headersArr = headersArr[0..^3]
387+
headersArr.delete(headersArr.len-2..headersArr.len-1)
295388
if contentLength.isSome:
296389
# useful for file answers
297390
when declared(statusCode):
@@ -318,7 +411,7 @@ template answer*(
318411
for cookie in outCookies:
319412
headersArr &= cookie & "\r\n"
320413
if headersArr.len > 0:
321-
headersArr = headersArr[0..^3]
414+
headersArr.delete(headersArr.len-2..headersArr.len-1)
322415
when declared(statusCode):
323416
when statusCode is int:
324417
req.send(statusCode.HttpCode, $message, headersArr)

0 commit comments

Comments
 (0)