~ubuntu-branches/ubuntu/oneiric/ocsigen/oneiric

« back to all changes in this revision

Viewing changes to eliom/eliommod_pagegen.ml

  • Committer: Bazaar Package Importer
  • Author(s): Stephane Glondu
  • Date: 2009-07-02 10:02:08 UTC
  • mfrom: (1.1.9 upstream) (4.1.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090702100208-n158b1sqwzn0asil
Tags: 1.2.0-2
Fix build on non-native architectures

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
let handle_site_exn exn (ri, si, _, aci) sitedata =
32
32
  sitedata.Eliom_common.exn_handler
33
 
    (Eliom_common.make_server_params sitedata aci ri [] si None) exn >>=
34
 
  (fun r -> return r)
 
33
    (Eliom_common.make_server_params sitedata aci ri [] si None) exn 
 
34
  >>= fun r -> 
 
35
  return r
35
36
 
36
37
 
37
38
(*****************************************************************************)
141
142
                      catch
142
143
                        (fun () ->
143
144
                          Ocsipersist.replace_if_exists
144
 
                            Eliommod_persess.persistent_cookies_table
 
145
                            (Lazy.force 
 
146
                               Eliommod_persess.persistent_cookies_table)
145
147
                            newc.Eliom_common.pc_value
146
148
                            (name,
147
149
                             newexp,
153
155
                          | e -> fail e)
154
156
                  | _ ->
155
157
                      Ocsipersist.add
156
 
                        Eliommod_persess.persistent_cookies_table
 
158
                        (Lazy.force Eliommod_persess.persistent_cookies_table)
157
159
                        newc.Eliom_common.pc_value
158
160
                        (name,
159
161
                         newexp,
199
201
  else [Eliom_common.Eliom_Service_session_expired closedservsessions])
200
202
 
201
203
 
202
 
 
203
 
 
204
 
let gen sitedata (charset, _, _, _) = function
205
 
| Ocsigen_extensions.Req_found (_, r) -> Lwt.return (Ocsigen_extensions.Ext_found r)
206
 
| Ocsigen_extensions.Req_not_found (previous_extension_err, ri) ->
 
204
open Ocsigen_extensions
 
205
 
 
206
let gen is_eliom_extension sitedata = function
 
207
| Ocsigen_extensions.Req_found _ -> 
 
208
    Lwt.return Ocsigen_extensions.Ext_do_nothing
 
209
| Ocsigen_extensions.Req_not_found (404 as previous_extension_err, ri) ->
207
210
  let now = Unix.time () in
 
211
  Eliom_common.change_request_info ri previous_extension_err
 
212
  >>= fun (ri, si) ->
 
213
  let (all_cookie_info, closedsessions) =
 
214
    Eliommod_cookies.get_cookie_info now
 
215
      sitedata
 
216
      si.Eliom_common.si_service_session_cookies
 
217
      si.Eliom_common.si_data_session_cookies
 
218
      si.Eliom_common.si_persistent_session_cookies
 
219
      si.Eliom_common.si_secure_cookie_info
 
220
  in
 
221
  let exn = compute_exn closedsessions in
208
222
  let rec gen_aux ((ri, si, old_cookies_to_set, all_cookie_info) as info) =
209
 
    let genfun =
210
 
      match si.Eliom_common.si_nonatt_info with
211
 
      | Eliom_common.Na_no ->
212
 
 
213
 
          (* page generation *)
214
 
          Eliommod_services.get_page
215
 
 
216
 
      | _ ->
217
 
 
218
 
          (* anonymous service *)
219
 
          Eliommod_naservices.make_naservice
220
 
    in
221
 
 
222
 
    catch
223
 
      (fun () ->
224
 
        execute
225
 
          now
226
 
          genfun
227
 
          info
228
 
          sitedata >>= fun result_to_send ->
 
223
    match is_eliom_extension with
 
224
      | Some ext -> 
 
225
          Eliommod_extensions.run_eliom_extension ext now info sitedata
 
226
      | None ->
 
227
          let genfun =
 
228
            match si.Eliom_common.si_nonatt_info with
 
229
              | Eliom_common.Na_no ->
 
230
                  (* page generation *)
 
231
                  Eliommod_services.get_page
 
232
              | _ ->
 
233
                  (* anonymous service *)
 
234
                  Eliommod_naservices.make_naservice
 
235
          in
 
236
      catch
 
237
        (fun () ->
 
238
           execute
 
239
             now
 
240
             genfun
 
241
             info
 
242
             sitedata >>= fun result_to_send ->
229
243
 
230
244
          match result_to_send with
231
245
          | Eliom_common.EliomExn (exnlist, cookies_set_by_page) ->
248
262
 
249
263
              (match si.Eliom_common.si_nonatt_info,
250
264
                si.Eliom_common.si_state_info,
251
 
                ri.Ocsigen_extensions.ri_method with
 
265
                ri.request_info.ri_method with
252
266
              | Eliom_common.Na_no,
253
 
                (None, None), Ocsigen_http_frame.Http_header.GET ->
 
267
                (Eliom_common.Att_no, Eliom_common.Att_no), 
 
268
                    Ocsigen_http_frame.Http_header.GET ->
254
269
                  Eliommod_cookies.compute_cookies_to_send
255
270
                    sitedata
256
271
                    all_cookie_info
268
283
 
269
284
                  Eliommod_cookies.compute_new_ri_cookies
270
285
                    now
271
 
                    ri.Ocsigen_extensions.ri_sub_path
272
 
                    (Lazy.force ri.Ocsigen_extensions.ri_cookies)
 
286
                    ri.request_info.ri_sub_path
 
287
                    (Lazy.force ri.request_info.ri_cookies)
273
288
                    all_cookie_info
274
289
                    cookies_set_by_page
275
290
(*VVV old_cookies_to_set already are in ri_cookies, right? *)
284
299
                  (match
285
300
                    si.Eliom_common.si_nonatt_info,
286
301
                    si.Eliom_common.si_state_info,
287
 
                    ri.Ocsigen_extensions.ri_method
 
302
                    ri.request_info.ri_method
288
303
                  with
289
304
                  | Eliom_common.Na_get_ _,
290
 
                    (_, None), Ocsigen_http_frame.Http_header.GET
 
305
                    (_, Eliom_common.Att_no), Ocsigen_http_frame.Http_header.GET
291
306
                  | Eliom_common.Na_get' _,
292
 
                    (_, None), Ocsigen_http_frame.Http_header.GET ->
 
307
                    (_, Eliom_common.Att_no), Ocsigen_http_frame.Http_header.GET
293
308
                      (* no post params, GET na coservice *)
294
309
 
295
 
                      return
296
 
                        (Ocsigen_extensions.Ext_retry_with
297
 
                           ({ri with
298
 
                             Ocsigen_extensions.ri_get_params =
299
 
                             lazy si.Eliom_common.si_other_get_params;
300
 
                             Ocsigen_extensions.ri_cookies= lazy ric;
301
 
                             Ocsigen_extensions.ri_extension_info= exnlist
302
 
(* @ri.ri_extension_info *)
303
 
(*VVV I do not keep the old exceptions any more,
304
 
  otherwise no way to remove them. *)
305
 
                           },
306
 
                            all_new_cookies
307
 
                           )
308
 
                        )
309
 
 
310
310
                  | Eliom_common.Na_no,
311
 
                      (_, None), Ocsigen_http_frame.Http_header.GET ->
 
311
                    (_, Eliom_common.Att_no), Ocsigen_http_frame.Http_header.GET
312
312
                      (* no post params, GET attached coservice *)
313
 
 
 
313
                      ->
314
314
                      return
315
315
                        (* Ext_retry_with, not Eliom_retry_with *)
316
316
                        (Ocsigen_extensions.Ext_retry_with
317
 
                           ({ri with
318
 
                             Ocsigen_extensions.ri_get_params =
319
 
                             lazy si.Eliom_common.si_other_get_params;
320
 
                             Ocsigen_extensions.ri_cookies= lazy ric;
321
 
                             Ocsigen_extensions.ri_extension_info= exnlist
 
317
                           ({ri with request_info = {
 
318
                               ri.request_info with
 
319
                                 ri_get_params =
 
320
                                   lazy si.Eliom_common.si_other_get_params;
 
321
                                 ri_cookies= lazy ric;
 
322
                                 ri_extension_info= exnlist
322
323
(* @ri.ri_extension_info *)
323
324
(*VVV I do not keep the old exceptions any more,
324
325
  otherwise no way to remove them. *)
325
 
                           },
 
326
                             }},
326
327
                            all_new_cookies
327
328
                           ))
328
329
 
 
330
 
329
331
                  | Eliom_common.Na_post_ _, (_, _), _
330
332
                  | Eliom_common.Na_post' _, (_, _), _ ->
331
333
                      (* POST na coservice *)
334
336
                      return
335
337
                        (* Ext_retry_with, not Eliom_retry_with *)
336
338
                        (Ocsigen_extensions.Ext_retry_with
337
 
                           ({ri with
338
 
                             Ocsigen_extensions.ri_get_params =
339
 
                             lazy si.Eliom_common.si_other_get_params;
340
 
(*VVV 31/12/2007 <-
341
 
  do we keep GET na_name ?
342
 
  Here, yes.
 
339
                           ({ri with request_info = {
 
340
                               ri.request_info with
 
341
                                 ri_post_params = lazy (return []);
 
342
                                 ri_get_params =
 
343
                                   lazy si.Eliom_common.si_other_get_params;
 
344
                                 ri_method = Ocsigen_http_frame.Http_header.GET;
 
345
                                 ri_cookies= lazy ric;
 
346
                                 ri_extension_info= exnlist
 
347
                             }},
 
348
                            all_new_cookies
 
349
                           ))
 
350
 
 
351
 
 
352
                  | _ ->
 
353
                      (* retry without POST params *)
 
354
(*VVV 
 
355
Warning: is it possible to have POST method but no POST parameter?
 
356
--> may loop...
343
357
*)
344
 
                             Ocsigen_extensions.ri_post_params = lazy (return []);
345
 
                             Ocsigen_extensions.ri_method = Ocsigen_http_frame.Http_header.GET;
346
 
                             Ocsigen_extensions.ri_cookies= lazy ric;
347
 
                             Ocsigen_extensions.ri_extension_info= exnlist
348
 
(* @ri.ri_extension_info *)
349
 
(*VVV I do not keep the old exceptions any more,
350
 
  otherwise no way to remove them. *)
351
 
                           },
352
 
                            all_new_cookies
353
 
                           ))
354
 
 
355
 
                  | _ ->
356
 
                      (* retry without POST params *)
357
 
 
358
358
                      return
359
359
                        (* Ext_retry_with, not Eliom_retry_with *)
360
360
                        (Ocsigen_extensions.Ext_retry_with
361
 
                           ({ri with
362
 
                             Ocsigen_extensions.ri_post_params = lazy (return []);
363
 
                             Ocsigen_extensions.ri_method = Ocsigen_http_frame.Http_header.GET;
364
 
                             Ocsigen_extensions.ri_cookies= lazy ric;
365
 
                             Ocsigen_extensions.ri_extension_info= exnlist
366
 
(* @ri.ri_extension_info *)
367
 
(*VVV I do not keep the old exceptions any more,
368
 
  otherwise no way to remove them. *)
369
 
                           },
 
361
                           ({ri with request_info = {
 
362
                               ri.request_info with
 
363
                                 ri_post_params = lazy (return []);
 
364
                                 ri_method = Ocsigen_http_frame.Http_header.GET;
 
365
                                 ri_cookies= lazy ric;
 
366
                                 ri_extension_info= exnlist
 
367
                             }},
370
368
                            all_new_cookies
371
369
                           ))
372
370
                  )
406
404
                           Ocsigen_http_frame.res_code= 500;
407
405
                         }))
408
406
        | Eliom_common.Eliom_Wrong_parameter ->
409
 
            Lazy.force ri.Ocsigen_extensions.ri_post_params >>= fun ripp ->
 
407
            Lazy.force ri.request_info.ri_post_params >>= fun ripp ->
410
408
            Ocsigen_senders.Xhtml_content.result_of_content
411
409
                (Error_pages.page_bad_param (List.map fst ripp)) >>= fun r ->
412
410
            return (Ocsigen_extensions.Ext_found
420
418
            return (Ocsigen_extensions.Ext_next previous_extension_err)
421
419
        | Eliom_common.Eliom_retry_with a -> gen_aux a
422
420
        | e -> fail e)
423
 
 
424
 
  in
425
 
  Eliom_common.change_request_info
426
 
    ri charset previous_extension_err >>= fun (ri, si) ->
427
 
  let (all_cookie_info, closedsessions) =
428
 
    Eliommod_cookies.get_cookie_info now
429
 
      sitedata
430
 
      si.Eliom_common.si_service_session_cookies
431
 
      si.Eliom_common.si_data_session_cookies
432
 
      si.Eliom_common.si_persistent_session_cookies
433
 
      si.Eliom_common.si_secure_cookie_info
434
 
  in
435
 
  let exn = compute_exn closedsessions in
436
 
  gen_aux ({ri with Ocsigen_extensions.ri_extension_info=
437
 
            exn@ri.Ocsigen_extensions.ri_extension_info},
438
 
           si,
439
 
           Ocsigen_http_frame.Cookies.empty,
440
 
           all_cookie_info)
441
 
 
 
421
  in
 
422
  gen_aux
 
423
    ({ri with request_info = {
 
424
        ri.request_info with
 
425
          ri_extension_info=
 
426
            exn@ri.request_info.ri_extension_info}},
 
427
     si,
 
428
     Ocsigen_http_frame.Cookies.empty,
 
429
     all_cookie_info)
 
430
  | Ocsigen_extensions.Req_not_found (_, ri) ->
 
431
      Lwt.return Ocsigen_extensions.Ext_do_nothing