@@ -234,11 +234,47 @@ and find_post_params_multipart_form_data body_gen ctparams filenames ci =
234234 Ocsigen_stream. consume body_gen >> = fun () ->
235235 Lwt. return (! params, ! files)
236236
237+ let wrap_stream f x frame_content =
238+ Ocsigen_stream. make ~finalize: (fun outcome ->
239+ match frame_content with
240+ | Some stream ->
241+ Ocsigen_stream. finalize stream outcome
242+ | None ->
243+ Lwt. return ()
244+ )
245+ (fun () ->
246+ f x >> = fun () ->
247+ match frame_content with
248+ | Some stream ->
249+ Ocsigen_stream. next (Ocsigen_stream. get stream)
250+ | None ->
251+ Ocsigen_stream. empty None
252+ )
237253
254+ let handle_100_continue slot frame =
255+ { frame with
256+ frame_content = Some (wrap_stream send_100_continue slot
257+ frame.frame_content)
258+ }
259+
260+ let handle_expect slot frame =
261+ let expect_list = Ocsigen_headers. get_expect frame in
262+ let proto = Http_header. get_proto frame.frame_header in
263+ List. fold_left (fun frame tok ->
264+ match String. lowercase tok with
265+ | "100-continue" ->
266+ if proto = Http_header. HTTP11 then
267+ handle_100_continue slot frame
268+ else
269+ frame
270+ | _ ->
271+ raise (Ocsigen_http_error (Ocsigen_cookies. empty_cookieset, 417 ))
272+ ) frame expect_list
238273
239274(* reading the request *)
240275let get_request_infos
241- meth clientproto url http_frame filenames sockaddr port receiver =
276+ meth clientproto url http_frame filenames sockaddr port receiver
277+ sender_slot =
242278
243279 Lwt. catch
244280 (fun () ->
@@ -395,7 +431,7 @@ let get_request_infos
395431 ri_accept_charset = accept_charset;
396432 ri_accept_encoding = accept_encoding;
397433 ri_accept_language = accept_language;
398- ri_http_frame = http_frame;
434+ ri_http_frame = handle_expect sender_slot http_frame;
399435 ri_request_cache = Polytables. create () ;
400436 ri_client = Ocsigen_extensions. client_of_connection receiver;
401437 ri_range = lazy (Ocsigen_range. get_range http_frame);
@@ -657,7 +693,7 @@ let service receiver sender_slot request meth url port sockaddr =
657693 (fun () ->
658694 get_request_infos
659695 meth clientproto url request filenames sockaddr
660- port receiver)
696+ port receiver sender_slot )
661697 (fun ri ->
662698 (* *** Now we generate the page and send it *)
663699 (* Log *)
0 commit comments