Hi Kashyap
In web.l framework, you you define a request handler using (dh).
When a http request is received by the (server) function (in
web.l/http.l), it gets handed to the (http) function (defined in
web.l/http.l).
Now (http) is parsing the complete HTTP request before calling
(req-handler) at the end (defined in web.l/web.l), which in turn tries
to find a suitable request-handler as defined with (dh) in the
application code.
So when you do (readJson) within the request handler, (readJson) is
reading from stdin, which here is the http connection socket, but the
stdin/socket buffer was already fully read by (http), the client is
waiting for an answer and not sending anymore, your (readJson) also
waiting for input on the same connection, forever (logical dead-lock).
Data sent from the client using HTTP POST (so in the body) gets parsed
by the web.l/http.l and put into an association list, where it can be
fetched from using (get-form "argument-name").
If the uploaded data was a file (using multipart/form-data encoding),
then you get from (get-form) the filepath to a temporary file where the
content is stored.
So the solution (untested) should probably be something like:
(dh ("/upload-json-form")
(ifn (= *ReqMethod 'POST) # if it is not POST, we assume GET, so some
html should be delivered to the client
(<form> NIL "/upload-json-form" T
(<field> "file" "uploaded-file") )
(in (get-form "uploaded-file") # switching input channel from
client socket to uploaded file
(out NIL # switching output channel to stdout of the
application - we want to print our debug messages to the server console
(or logfile), not into the HTTP client connection....
(prinl (readJson) ) ) ) )
Kind regards,
beneroth
Am 2019-05-14 19:59, schrieb C K Kashyap:
Hi,
I'm trying to write a simple web tool and would like to parse the HTTP
post body. I tried to alter the example on the website of webl [1] to
read json payload like this -
(de greet (Greeting)
(res-html "The hello world page" NIL NIL
(<h1> NIL (prin Greeting)) ) )
(dh ("/greeters/" @Name)
(out "+out.txt" (prinl (readJson)))
(let Name (ht:Pack @Name)
(case Name
("bob" (greet "Hello world!"))
("pablo" (greet "Hola mundo!"))
("hans" (greet "Hallo Welt!"))
("sergey" (greet "п?~@иве?~B ми?~@!"))
(T (httpStat 404 "Not found")) ) ) )
This results in endless read :(. What's the right way to read the HTTP
body?
Regards,
Kashyap
Links:
------
[1] https://bitbucket.org/iromero91/web.l/wiki/Home
--
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe