From f00a6728ef23061ab69fed90414ee9aa5b21f132 Mon Sep 17 00:00:00 2001 From: bptato Date: Fri, 15 Nov 2024 17:37:12 +0100 Subject: url: fix serializeFormURLEncoded, refactor kill qmark hack, plus refactor the form data parser/serializer --- src/server/buffer.nim | 10 +++++----- src/types/url.nim | 43 +++++++++++++++++-------------------------- 2 files changed, 22 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/server/buffer.nim b/src/server/buffer.nim index a1218a62..1cdab600 100644 --- a/src/server/buffer.nim +++ b/src/server/buffer.nim @@ -1266,7 +1266,7 @@ proc makeFormRequest(buffer: Buffer; parsedAction: URL; httpMethod: HttpMethod; # mutate action URL let kvlist = entryList.toNameValuePairs() #TODO with charset - parsedAction.setSearch(serializeFormURLEncoded(kvlist, qmark = true)) + parsedAction.setSearch('?' & serializeFormURLEncoded(kvlist)) return newRequest(parsedAction, httpMethod) return newRequest(parsedAction) # get action URL of frtMailto: @@ -1274,8 +1274,8 @@ proc makeFormRequest(buffer: Buffer; parsedAction: URL; httpMethod: HttpMethod; # mailWithHeaders let kvlist = entryList.toNameValuePairs() #TODO with charset - parsedAction.setSearch(serializeFormURLEncoded(kvlist, - spaceAsPlus = false, qmark = true)) + parsedAction.setSearch('?' & serializeFormURLEncoded(kvlist, + spaceAsPlus = false)) return newRequest(parsedAction, httpMethod) # mail as body let kvlist = entryList.toNameValuePairs() @@ -1295,8 +1295,8 @@ proc makeFormRequest(buffer: Buffer; parsedAction: URL; httpMethod: HttpMethod; # mutate action URL let kvlist = entryList.toNameValuePairs() #TODO with charset - let query = serializeFormURLEncoded(kvlist, qmark = true) - parsedAction.setSearch(query) + let search = '?' & serializeFormURLEncoded(kvlist) + parsedAction.setSearch(search) return newRequest(parsedAction, httpMethod) # submit as entity body let body = case enctype diff --git a/src/types/url.nim b/src/types/url.nim index f3b52611..83ef020a 100644 --- a/src/types/url.nim +++ b/src/types/url.nim @@ -1034,37 +1034,28 @@ proc setHref(ctx: JSContext; url: URL; s: string) {.jsfset: "href".} = func isIP*(url: URL): bool = return url.hostType in {htIpv4, htIpv6} -#https://url.spec.whatwg.org/#concept-urlencoded-serializer +# https://url.spec.whatwg.org/#urlencoded-parsing proc parseFromURLEncoded(input: string): seq[(string, string)] = + result = @[] for s in input.split('&'): if s == "": continue - var name = "" - var value = "" - for i in 0.. 0: result &= '&' result.percentEncode(name, ApplicationXWWWFormUrlEncodedSet, spaceAsPlus) result &= '=' -- cgit 1.4.1-2-gfad0