Status of multipart
Thursday, 19 June 2014 · 5 messages · last reply 8 Jul 2014
ML
Marco Lettere19 Jun 2014 21:38 #
Hello all,
I would like to know what the status of multipart HTTP request currently is.
I read from the docs that it's experimental but to me it feels like there's currently a regression (is there any working example?). I have some requests that were working correctly up to 7.6.1 AFAIR. From 7.8 on (including latest) I always get this error message when posting multipart requests:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1"/>
<title>Error 400 Stopped at .../restxq.xqm, 106/10:
[experr:HC0004] Invalid request element: No body specified for
http:part.</title>
</head>
<body>
<h2>HTTP ERROR 400</h2>
<p>Problem accessing /multipart. Reason:
<pre> Stopped at
/home/lettere/Desktop/basex80/webapp/restxq.xqm, 106/10:
[experr:HC0004] Invalid request element: No body specified for
http:part.</pre>
</p>
<hr />
<i>
<small>Powered by Jetty://</small>
</i>
<br/>
[...]
<br/>
</body>
</html>This is the entry point:
declare %restxq:path("multipart/")
%restxq:POST("{$message}")
%restxq:consumes("multipart/form-data")
%output:method('xml')
function page:hello2($message) {
<response>
<title>Hello!</title>
content <info>It seems you posted a message: { $message }</info>
</response>
};and finally this is the HTTP request:
POST /multipart HTTP/1.1
Host: localhost:9000
Connection: keep-alive
Content-Length: 162
Cache-Control: no-cache
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Content-Type: multipart/form-data; boundary='bounds'
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,it;q=0.6
--bounds
Content-Disposition: content
Content-Type: application/xml
<a/>--bounds
Content-Disposition: metadata
Content-Type: application/xml
<b/>--bounds
Thanks a lot,
Marco.
CG
Christian Grün24 Jun 2014 13:58 #
Sounds like a bug! I'll check this out.
Beforehand: Do you think that the "experimental solution" for multipart that we were proposing already covers all your needs?
Christian
Quoted text · Marco Lettere · 81 lines
On Thu, Jun 19, 2014 at 9:38 PM, Marco Lettere <marco.lettere at dedalus.eu> wrote: > Hello all, > I would like to know what the status of multipart HTTP request currently is. > I read from the docs that it's experimental but to me it feels like there's > currently a regression (is there any working example?). > I have some requests that were working correctly up to 7.6.1 AFAIR. > From 7.8 on (including latest) I always get this error message when posting > multipart requests: > > <html> > <head> > <meta http-equiv="Content-Type" content="text/html; > charset=ISO-8859-1"/> > <title>Error 400 Stopped at .../restxq.xqm, 106/10: > [experr:HC0004] Invalid request element: No body specified for > http:part.</title> > </head> > <body> > <h2>HTTP ERROR 400</h2> > <p>Problem accessing /multipart. Reason: > > <pre> Stopped at > /home/lettere/Desktop/basex80/webapp/restxq.xqm, 106/10: > [experr:HC0004] Invalid request element: No body specified for > http:part.</pre> > </p> > <hr /> > <i> > <small>Powered by Jetty://</small> > </i> > <br/> > [...] > <br/> > </body> > </html> > > This is the entry point: > > declare %restxq:path("multipart/") > %restxq:POST("{$message}") > %restxq:consumes("multipart/form-data") > %output:method('xml') > function page:hello2($message) { > <response> > <title>Hello!</title> > content <info>It seems you posted a message: { $message }</info> > </response> > }; > > and finally this is the HTTP request: > > POST /multipart HTTP/1.1 > Host: localhost:9000 > Connection: keep-alive > Content-Length: 162 > Cache-Control: no-cache > Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm > User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like > Gecko) Chrome/35.0.1916.153 Safari/537.36 > Content-Type: multipart/form-data; boundary='bounds' > Accept: */* > Accept-Encoding: gzip,deflate,sdch > Accept-Language: en-US,en;q=0.8,it;q=0.6 > > --bounds > Content-Disposition: content > Content-Type: application/xml > > <a/> > > --bounds > Content-Disposition: metadata > Content-Type: application/xml > > <b/> > > --bounds > > > Thanks a lot, > Marco.
CG
Hi Marco,
I didn't have much time to dive into the issue, but if I get the specifications right, you cannot use simple quotes for specifying boundary strings:
http://www.w3.org/Protocols/rfc1341/4_Content-Type.html
http://www.w3.org/Protocols/rfc822/Overview.html
Hope this helps,
Christian
Quoted text · Marco Lettere · 81 lines
On Thu, Jun 19, 2014 at 9:38 PM, Marco Lettere <marco.lettere at dedalus.eu> wrote: > Hello all, > I would like to know what the status of multipart HTTP request currently is. > I read from the docs that it's experimental but to me it feels like there's > currently a regression (is there any working example?). > I have some requests that were working correctly up to 7.6.1 AFAIR. > From 7.8 on (including latest) I always get this error message when posting > multipart requests: > > <html> > <head> > <meta http-equiv="Content-Type" content="text/html; > charset=ISO-8859-1"/> > <title>Error 400 Stopped at .../restxq.xqm, 106/10: > [experr:HC0004] Invalid request element: No body specified for > http:part.</title> > </head> > <body> > <h2>HTTP ERROR 400</h2> > <p>Problem accessing /multipart. Reason: > > <pre> Stopped at > /home/lettere/Desktop/basex80/webapp/restxq.xqm, 106/10: > [experr:HC0004] Invalid request element: No body specified for > http:part.</pre> > </p> > <hr /> > <i> > <small>Powered by Jetty://</small> > </i> > <br/> > [...] > <br/> > </body> > </html> > > This is the entry point: > > declare %restxq:path("multipart/") > %restxq:POST("{$message}") > %restxq:consumes("multipart/form-data") > %output:method('xml') > function page:hello2($message) { > <response> > <title>Hello!</title> > content <info>It seems you posted a message: { $message }</info> > </response> > }; > > and finally this is the HTTP request: > > POST /multipart HTTP/1.1 > Host: localhost:9000 > Connection: keep-alive > Content-Length: 162 > Cache-Control: no-cache > Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm > User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like > Gecko) Chrome/35.0.1916.153 Safari/537.36 > Content-Type: multipart/form-data; boundary='bounds' > Accept: */* > Accept-Encoding: gzip,deflate,sdch > Accept-Language: en-US,en;q=0.8,it;q=0.6 > > --bounds > Content-Disposition: content > Content-Type: application/xml > > <a/> > > --bounds > Content-Disposition: metadata > Content-Type: application/xml > > <b/> > > --bounds > > > Thanks a lot, > Marco.
ML
With a bit of delay (sorry) and just to close this point.
I discovered that the implementation is strictly adhering to the HTTP specification that REQUIRES the new lines to be \r\n whereas in my request the newlines were \n only. This made it parse all way down to the end of the message without finding a multipart content where it was actually expecting one.
It could be just a one-liner in the code to handle \n only but I suppose it's a bad practice to be fmore flexible than the specifications allows.
Thanks for the support!
M.
Quoted text · Christian Grün · 91 lines
On 06/24/2014 01:58 PM, Christian Grün wrote: > Sounds like a bug! I'll check this out. > > Beforehand: Do you think that the "experimental solution" for > multipart that we were proposing already covers all your needs? > > Christian > > > > On Thu, Jun 19, 2014 at 9:38 PM, Marco Lettere <marco.lettere at dedalus.eu> wrote: >> Hello all, >> I would like to know what the status of multipart HTTP request currently is. >> I read from the docs that it's experimental but to me it feels like there's >> currently a regression (is there any working example?). >> I have some requests that were working correctly up to 7.6.1 AFAIR. >> From 7.8 on (including latest) I always get this error message when posting >> multipart requests: >> >> <html> >> <head> >> <meta http-equiv="Content-Type" content="text/html; >> charset=ISO-8859-1"/> >> <title>Error 400 Stopped at .../restxq.xqm, 106/10: >> [experr:HC0004] Invalid request element: No body specified for >> http:part.</title> >> </head> >> <body> >> <h2>HTTP ERROR 400</h2> >> <p>Problem accessing /multipart. Reason: >> >> <pre> Stopped at >> /home/lettere/Desktop/basex80/webapp/restxq.xqm, 106/10: >> [experr:HC0004] Invalid request element: No body specified for >> http:part.</pre> >> </p> >> <hr /> >> <i> >> <small>Powered by Jetty://</small> >> </i> >> <br/> >> [...] >> <br/> >> </body> >> </html> >> >> This is the entry point: >> >> declare %restxq:path("multipart/") >> %restxq:POST("{$message}") >> %restxq:consumes("multipart/form-data") >> %output:method('xml') >> function page:hello2($message) { >> <response> >> <title>Hello!</title> >> content <info>It seems you posted a message: { $message }</info> >> </response> >> }; >> >> and finally this is the HTTP request: >> >> POST /multipart HTTP/1.1 >> Host: localhost:9000 >> Connection: keep-alive >> Content-Length: 162 >> Cache-Control: no-cache >> Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm >> User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like >> Gecko) Chrome/35.0.1916.153 Safari/537.36 >> Content-Type: multipart/form-data; boundary='bounds' >> Accept: */* >> Accept-Encoding: gzip,deflate,sdch >> Accept-Language: en-US,en;q=0.8,it;q=0.6 >> >> --bounds >> Content-Disposition: content >> Content-Type: application/xml >> >> <a/> >> >> --bounds >> Content-Disposition: metadata >> Content-Type: application/xml >> >> <b/> >> >> --bounds >> >> >> Thanks a lot, >> Marco.
CG
Christian Grün8 Jul 2014 13:18 #
Glad to have this solved. Thanks for the feedback!
Christian
Quoted text · Marco Lettere · 113 lines
On Tue, Jul 8, 2014 at 1:14 PM, Marco Lettere <marco.lettere at dedalus.eu> wrote: > With a bit of delay (sorry) and just to close this point. > I discovered that the implementation is strictly adhering to the HTTP > specification that REQUIRES the new lines to be \r\n whereas in my request > the newlines were \n only. This made it parse all way down to the end of the > message without finding a multipart content where it was actually expecting > one. > It could be just a one-liner in the code to handle \n only but I suppose > it's a bad practice to be fmore flexible than the specifications allows. > Thanks for the support! > > M. > > On 06/24/2014 01:58 PM, Christian Grün wrote: >> >> Sounds like a bug! I'll check this out. >> >> Beforehand: Do you think that the "experimental solution" for >> multipart that we were proposing already covers all your needs? >> >> Christian >> >> >> >> On Thu, Jun 19, 2014 at 9:38 PM, Marco Lettere <marco.lettere at dedalus.eu> >> wrote: >>> >>> Hello all, >>> I would like to know what the status of multipart HTTP request currently >>> is. >>> I read from the docs that it's experimental but to me it feels like >>> there's >>> currently a regression (is there any working example?). >>> I have some requests that were working correctly up to 7.6.1 AFAIR. >>> From 7.8 on (including latest) I always get this error message when >>> posting >>> multipart requests: >>> >>> <html> >>> <head> >>> <meta http-equiv="Content-Type" content="text/html; >>> charset=ISO-8859-1"/> >>> <title>Error 400 Stopped at .../restxq.xqm, 106/10: >>> [experr:HC0004] Invalid request element: No body specified for >>> http:part.</title> >>> </head> >>> <body> >>> <h2>HTTP ERROR 400</h2> >>> <p>Problem accessing /multipart. Reason: >>> >>> <pre> Stopped at >>> /home/lettere/Desktop/basex80/webapp/restxq.xqm, 106/10: >>> [experr:HC0004] Invalid request element: No body specified for >>> http:part.</pre> >>> </p> >>> <hr /> >>> <i> >>> <small>Powered by Jetty://</small> >>> </i> >>> <br/> >>> [...] >>> <br/> >>> </body> >>> </html> >>> >>> This is the entry point: >>> >>> declare %restxq:path("multipart/") >>> %restxq:POST("{$message}") >>> %restxq:consumes("multipart/form-data") >>> %output:method('xml') >>> function page:hello2($message) { >>> <response> >>> <title>Hello!</title> >>> content <info>It seems you posted a message: { $message }</info> >>> </response> >>> }; >>> >>> and finally this is the HTTP request: >>> >>> POST /multipart HTTP/1.1 >>> Host: localhost:9000 >>> Connection: keep-alive >>> Content-Length: 162 >>> Cache-Control: no-cache >>> Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm >>> User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, >>> like >>> Gecko) Chrome/35.0.1916.153 Safari/537.36 >>> Content-Type: multipart/form-data; boundary='bounds' >>> Accept: */* >>> Accept-Encoding: gzip,deflate,sdch >>> Accept-Language: en-US,en;q=0.8,it;q=0.6 >>> >>> --bounds >>> Content-Disposition: content >>> Content-Type: application/xml >>> >>> <a/> >>> >>> --bounds >>> Content-Disposition: metadata >>> Content-Type: application/xml >>> >>> <b/> >>> >>> --bounds >>> >>> >>> Thanks a lot, >>> Marco. > >
Written for BaseX 7.8, 7.9. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery