From: Roel Janssen <roel@gnu.org>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: guile-user@gnu.org
Subject: Re: Questions about the (web client) module.
Date: Fri, 21 Jul 2017 00:36:13 +0200 [thread overview]
Message-ID: <87h8y691nm.fsf@gnu.org> (raw)
In-Reply-To: <878tjjru96.fsf@gnu.org>
Hi Ludo’,
Thanks for your response.
Ludovic Courtès writes:
> Hi Roel,
>
> Roel Janssen <roel@gnu.org> skribis:
>
>> When I use http-post, and I want to change the HTTP header called
>> "Content-Type", I seem to need to spell it as "content-type" in the
>> #:headers part of the 'http-post' section. Other headers like "Accept"
>> do not seem to follow the same lowercase style route.
>>
>> More confusingly, using something like:
>> #:headers '((Content-Type . "text/csv"))
>>
>> leads to outputting the "Content-Type" header twice.
>> Why is "content-type" special?
>
> ‘sanitize-request’ in (web client) adds a ‘Content-Type’ header if there
> is none.
But 'Content-Type' and 'content-type' is not the same.. Adding a
'Content-Type' header results in the request having two 'Content-Type'
headers. So it doesn't add 'Content-Type' when it isn't there, it
converts 'content-type' to 'Content-Type', so it adds 'Content-Type'
when 'content-type' isn't there. This seems wrong to me.
>
> As for lower-case, perhaps the ‘request’ procedure in (web client)
> should automatically convert to lower-case, or perhaps we should simply
> clarify the documentation here.
Or perhaps do not treat some HTTP headers different than others, and
just keep it 'Content-Type' (as used in HTTP) instead of 'content-type'.
>
>> Then my next question is about "multipart/form-data" content types.
>> My code looks like this:
>>
>> #:headers `((content-type . ,(string-append
>> "multipart/form-data; boundary=" boundary))
>> (Accept . "*/*"))
>>
>> But that does not work:
>> scheme@(guile-user)>
>> web/request.scm:184:10: In procedure build-request:
>> web/request.scm:184:10: Bad request: Bad value for header content-type: "multipart/form-data; boundary=..."
>>
>> This is, however, a valid Content-Type.
>
> What’s the value of ‘boundary’? At first sight it looks good to me:
The value I use is "guile-virtuoso-driver". All of the below
functions work as expected with this value.
Could it be that something else is wrong?
Here's the entire code I use:
--8<---------------cut here---------------start------------->8---
(define* (sparql-query-post query
#:key
(host "localhost")
(port 8890)
(graph "")
(type "json"))
(let ((base-uri (string-append "http://" host ":" (number->string port) ))
(boundary "guile-virtuoso-driver"))
(let ((body (string-append
(format #f
"--~a~%Content-Disposition: form-data; name=~s~%~%text/csv~%"
boundary "format")
(format #f
"--~a~%Content-Disposition: form-data; name=~s~%~%~a~%--~a~%"
boundary "query" query boundary))))
(http-post
(string-append base-uri "/sparql")
#:body body
#:headers `((content-length . ,(string-length body))
(content-type . "multipart/form-data; boundary=guile-virtuoso-driver")
(Accept . "*/*"))))))
(define %query-get-all-triplets
"SELECT * FROM <http://localhost:8890/packages>
WHERE
{
?s ?p ?o
}")
(sparql-query-post %query-get-all-triplets)
--8<---------------cut here---------------end--------------->8---
Which results in:
--8<---------------cut here---------------start------------->8---
web/request.scm:184:10: In procedure build-request:
web/request.scm:184:10: Bad request: Bad value for header content-type: "multipart/form-data; boundary=guile-virtuoso-driver"
--8<---------------cut here---------------end--------------->8---
Thanks!
Kind regards,
Roel Janssen
next prev parent reply other threads:[~2017-07-20 22:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-20 10:53 Questions about the (web client) module Roel Janssen
2017-07-20 15:41 ` Ludovic Courtès
2017-07-20 22:36 ` Roel Janssen [this message]
2017-07-21 4:49 ` Mark H Weaver
2017-07-21 5:05 ` Mark H Weaver
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h8y691nm.fsf@gnu.org \
--to=roel@gnu.org \
--cc=guile-user@gnu.org \
--cc=ludo@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).