[Solved] Re: Post multipart bug in NetHttpd ?

Pierre-Alexandre Voye <[email protected]> Thu, 29 Dec 2011 14:51:44 +0100
Newsgroups gmane.comp.lang.ocaml.lib.net.devel
Message-ID <CANnJ5GemwfYwTFnLB-orp7Hyco1rZbNFZuc5CShUMWKr-zpxFg@mail.gmail.com>
Sometimes i wonder if i am not a bit stupid...
It was simply i forgot  cgi # output # commit_work();

Hope that help someone one day...

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

> 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
>
>


-- 
---------------------
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