Re: Post multipart bug in NetHttpd ?

Pierre-Alexandre Voye <[email protected]> Thu, 29 Dec 2011 14:09:18 +0100
Newsgroups gmane.comp.lang.ocaml.lib.net.devel
Message-ID <CANnJ5Gff1aKR3tztFANk=i+X=+=t8PEw0X6uV-SLHE2Mm8xsCQ@mail.gmail.com>
I have now a backtrace :
Raised by primitive operation at file "netstream.ml", line 418, characters
34-45
Called from file "netchannels.ml", line 857, characters 14-36

netstream.ml:
401   method input buf pos len =
402     if s_closed then raise Netchannels.Closed_channel;
403     if s_underrun then (
404       self # want_minimum();  (* may raise Buffer_underrun *)
405       s_underrun <- false;
406     );
407     (* Assertion: Either window length >= minimum, or eof *)
408     let len' = min len s_winlen in
409     Netbuffer.blit s_netbuf 0 buf pos len';
410     s # skip len';              (* never raises Buffer_underrun *)
411     s_pos <- s_pos + len';
412     ( try
413   self # want_minimum();
414       with
415     Buffer_underrun ->
416       s_underrun <- true
417     );
418     if len'=0 && len>0 then raise End_of_file;
419     len'

2011/12/29 Pierre-Alexandre Voye <[email protected]>

> Still playing with it, and i got a server error now, impossible to get a
> backtrace
>
> I get :
> [Thu Dec 29 12:04:27 2011] [nethttpd] [err] [127.0.0.1:54702] [POST
> /upload] Nethttpd: Missing response, replying 'Server Error'
>
>
> The change in the CGI : i have just change the line which process the post
> result, by printing the content
>
> let defini_CGI_Upload (cgi : Netcgi.cgi_activation) =
>   try
>     let out = cgi # output # output_string in
>   let server_file arg =
>     match arg#store with
>       | `File fn -> fn
>       | `Memory -> failwith "Not stored in a file" in
>     match cgi#request_method with
>       | `POST -> prerr_string (cgi#argument_value "content");
> cgi#finalize(); ()
>
>                 | _ -> cgi#output#output_string "Server accepts POST
> requests only.\n";
>
>                 cgi # set_header ~cache:`No_cache
> ~content_type:"text/html; charset=\"iso-8859-1\"" ();
>     cgi # output # commit_work();raise Erreur_durant_L_upload_Post
>   with
>       error ->     cgi # output # rollback_work();
>
>     cgi # set_header
>       ~status:`Forbidden                  (* Indicate the error *)
>
>       ~cache:`No_cache
>       ~content_type:"text/html; charset=\"utf-8\""
>       ();
>     (* An error has happened. Generate now an error page instead of the
> current page. By rolling back the output buffer, any  uncomitted material
> is deleted.*)
>
>
>         cgi # output # output_string "While processing the request an
> O'Caml exception has been raised:<BR>";
>         cgi # output # output_string ("<TT>" ^ (Printexc.to_string error)^
> (Printexc.get_backtrace ()) ^ "</TT><BR>");
>
>     (* Now commit the error page: *)
>     cgi # output # commit_work() ; raise Erreur_durant_L_upload
> ;;
>
>
>
> 2011/12/29 Pierre-Alexandre Voye <[email protected]>
>
>> Hello,
>> i'm writing code to manage upload from a browser. Even if I use a
>> XmlHttpRequest, i cannot fully control the http request to the server
>>
>> When i try to validate it with curl i have a strange error.
>> Here's the curl command line (which use attached file):
>> curl -F "[email protected];filename=404.html"  http://localhost:8111/upload--trace-ascii -
>>
>> I suppose Curl respect the standard. But it's certainly my code which is
>> not wrote like it should.
>>
>> Here's my CGI (I know I have to use NetMime, but I don't understand
>> enought NetMime to use it) :
>>
>> let defini_CGI_Upload (cgi : Netcgi.cgi_activation) =
>>   try
>>     let out = cgi # output # output_string in
>>   let server_file arg =
>>     match arg#store with
>>       | `File fn -> fn
>>       | `Memory -> failwith "Not stored in a file" in
>>     match cgi#request_method with
>>       | `POST -> traite_upload { nom_fichier = cgi#argument_value
>> "filename" ; contentType = cgi#argument_value "contentType" ; content =
>> cgi#argument_value "content"; filenametmp = server_file (cgi#argument
>> (cgi#argument_value "filename") )  } ; (*cgi#finalize();*)
>>       | _ -> cgi#output#output_string "Server accepts POST requests
>> only.\n";
>>
>>                 cgi # set_header ~cache:`No_cache
>> ~content_type:"text/html; charset=\"iso-8859-1\"" ();
>>     cgi # output # commit_work();raise Erreur_durant_L_upload_Post
>>   with
>>       error ->     cgi # output # rollback_work();
>>
>>     cgi # set_header
>>       ~status:`Forbidden
>>       ~cache:`No_cache
>>       ~content_type:"text/html; charset=\"utf-8\""
>>       ();
>>
>>         cgi # output # output_string "While processing the request an
>> O'Caml exception has been raised:<BR>";
>>         cgi # output # output_string ("<TT>" ^ (Printexc.to_string
>> error)^ (Printexc.get_backtrace ()) ^ "</TT><BR>");
>>
>>     (* Now commit the error page: *)
>>     cgi # output # commit_work() ; raise Erreur_durant_L_upload
>> ;;
>>
>> Here the backtrace I have :
>> Not_found
>> Raised by primitive operation at file "map.ml", line 118, characters
>> 16-25.  Called from file "netmime.ml", line 326, characters 14-31.
>> So it's in update_multiple_field method
>>
>>
>>
>> For information, here's the transcript of curl session :
>>
>> $ curl -F "[email protected];filename=404.html"
>> http://localhost:8111/upload --trace-ascii -
>> == Info: About to connect() to localhost port 8111 (#0)
>> == Info:   Trying ::1... == Info: Connection refused
>> == Info:   Trying 127.0.0.1... == Info: connected
>> => Send header, 296 bytes (0x128)
>> 0000: POST /upload HTTP/1.1
>> 0017: User-Agent: curl/7.23.1 (x86_64-apple-darwin11.2.0) libcurl/7.23
>> 0057: .1 OpenSSL/1.0.0e zlib/1.2.5 libidn/1.22
>> 0081: Host: localhost:8111
>> 0097: Accept: */*
>> 00a4: Content-Length: 1541
>> 00ba: Expect: 100-continue
>> 00d0: Content-Type: multipart/form-data; boundary=--------------------
>> 0110: --------402388b44fe6
>> 0126:
>> <= Recv header, 23 bytes (0x17)
>> 0000: HTTP/1.1 100 Continue
>> => Send data, 137 bytes (0x89)
>> 0000: ------------------------------402388b44fe6
>> 002c: Content-Disposition: form-data; name="file"; filename="404.html"
>> 006e: Content-Type: text/html
>> 0087:
>> => Send data, 1356 bytes (0x54c)
>> 0000: <!doctype html>.<html>.<head>.  <meta charset="utf-8">.  <title>
>> 0040: Page Not Found :(</title>.  <style>..  body { text-align: center
>> 0080: ;}..  h1 { font-size: 50px; text-align: center }..  span[frown]
>> 00c0: { transform: rotate(90deg); display:inline-block; color: #bbb; }
>> 0100: ..  body { font: 20px Constantia, 'Hoefler Text',  "Adobe Caslon
>> 0140:  Pro", Baskerville, Georgia, Times, serif; color: #999; text-sha
>> 0180: dow: 2px 2px 2px rgba(200, 200, 200, 0.5); }..  ::-moz-selection
>> 01c0: { background:#FF5E99; color:#fff; }..  ::selection { background:
>> 0200: #FF5E99; color:#fff; } ..  article {display:block; text-align: l
>> 0240: eft; width: 500px; margin: 0 auto; }..  ..  a { color: rgb(36, 1
>> 0280: 09, 56); text-decoration:none; }..  a:hover { color: rgb(96, 73,
>> 02c0:  141) ; text-shadow: 2px 2px 2px rgba(36, 109, 56, 0.5); }.  </s
>> 0300: tyle>.</head>.<body>.     <article>..  <h1>Not found <span frown
>> 0340: >:(</span></h1>..   <div>..       <p>Sorry, but the page you wer
>> 0380: e trying to view does not exist.</p>..       <p>It looks like th
>> 03c0: is was the result of either:</p>..       <ul>...   <li>a mistype
>> 0400: d address</li>...   <li>an out-of-date link</li>..       </ul>..
>> 0440:    </div>..    ..    <script>..    var GOOG_FIXURL_LANG = (navig
>> 0480: ator.language || '').slice(0,2),...GOOG_FIXURL_SITE = location.h
>> 04c0: ost;..    </script>..    <script src="http://linkhelp.clients.go
>> 0500: ogle.com/tbproxy/lh/wm/fixurl.js"></script>.     </article>.</bo
>> 0540: dy>.</html>.
>> => Send data, 48 bytes (0x30)
>> 0000:
>> 0002: ------------------------------402388b44fe6--
>> <= Recv header, 24 bytes (0x18)
>> 0000: HTTP/1.1 403 Forbidden
>> <= Recv header, 42 bytes (0x2a)
>> 0000: Content-Type: text/html; charset="utf-8"
>> <= Recv header, 25 bytes (0x19)
>> 0000: Cache-control: no-cache
>> <= Recv header, 18 bytes (0x12)
>> 0000: Pragma: no-cache
>> <= Recv header, 42 bytes (0x2a)
>> 0000: Expires: Thu, 29 Dec 2011 09:49:25 +0000
>> <= Recv header, 28 bytes (0x1c)
>> 0000: Transfer-Encoding: chunked
>> <= Recv header, 37 bytes (0x25)
>> 0000: Date: Thu, 29 Dec 2011 09:49:26 GMT
>> <= Recv header, 24 bytes (0x18)
>> 0000: Server: Ocamlnet/3.4.1
>> == Info: HTTP error before end of send, stop sending
>> <= Recv header, 2 bytes (0x2)
>> 0000:
>> <= Recv data, 228 bytes (0xe4)
>> 0000: e0
>> 0004: While processing the request an O'Caml exception has been raised
>> 0044: :<BR><TT>Not_foundRaised by primitive operation at file "map.ml"
>> 0084: , line 118, characters 16-25.Called from file "netmime.ml", line
>> 00c4:  326, characters 14-31.</TT><BR>
>> While processing the request an O'Caml exception has been
>> raised:<BR><TT>Not_foundRaised by primitive operation at file "map.ml",
>> line 118, characters 16-25
>> Called from file "netmime.ml", line 326, characters 14-31
>> </TT><BR><= Recv data, 2 bytes (0x2)
>> 0000:
>> == Info: transfer closed with outstanding read data remaining
>> == Info: Closing connection #0
>> curl: (18) transfer closed with outstanding read data remaining
>>
>>
>> Thank you
>>
>> --
>> ---------------------
>> https://twitter.com/#!/ontologiae/
>> http://linuxfr.org/users/montaigne
>>
>>
>
>
> --
> ---------------------
> https://twitter.com/#!/ontologiae/
> http://linuxfr.org/users/montaigne
>
>


-- 
---------------------
https://twitter.com/#!/ontologiae/
http://linuxfr.org/users/montaigne

------------------------------------------------------------------------------
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox

_______________________________________________
Ocamlnet-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ocamlnet-devel