From 65966a769fea12308cf5a1bccee53d80483ee444 Mon Sep 17 00:00:00 2001 From: rich Date: Fri, 5 Nov 2004 11:35:53 +0000 Subject: [PATCH] Split the 'page' template into two halves to enable pipelining. The full HTML is sent first, allowing the browser to begin fetching stylesheets and background images while we compose the page body. Updated MANIFEST. Depends on mod_caml >= 1.3.3 (with Request.rflush call). --- MANIFEST | 1 + debian/control | 6 ++--- scripts/page.ml | 59 +++++++++++++++++++++++++++++++++------------- templates/page.html | 15 +----------- templates/page_header.html | 14 +++++++++++ 5 files changed, 62 insertions(+), 33 deletions(-) create mode 100644 templates/page_header.html diff --git a/MANIFEST b/MANIFEST index 32ec9d5..4a2c344 100644 --- a/MANIFEST +++ b/MANIFEST @@ -271,6 +271,7 @@ templates/page.html templates/page_404.html templates/page_email_form.html templates/page_email_send.txt +templates/page_header.html templates/page_rss.xml templates/rebuild_links.html templates/rebuild_links_done.html diff --git a/debian/control b/debian/control index b1d9a6a..45527f9 100644 --- a/debian/control +++ b/debian/control @@ -1,7 +1,7 @@ Source: cocanwiki Priority: optional Maintainer: Richard W.M. Jones -Build-Depends: debhelper (>= 4.0.0), libpcre-ocaml-dev, libpgsql-ocaml-dev, libextlib-ocaml-dev, libgregoriandate-ocaml-dev, ocaml-findlib, ocaml-nox-3.08, libapache-mod-caml (>= 1.3.2), libtemplate-ocaml-dev (>= 1.3.2), ocamldsort (>= 0.14.2) +Build-Depends: debhelper (>= 4.0.0), libpcre-ocaml-dev, libpgsql-ocaml-dev, libextlib-ocaml-dev, libgregoriandate-ocaml-dev, ocaml-findlib, ocaml-nox-3.08, libapache-mod-caml (>= 1.3.3), libtemplate-ocaml-dev (>= 1.3.3), ocamldsort (>= 0.14.2) Standards-Version: 3.6.1 Package: cocanwiki @@ -9,8 +9,8 @@ Section: web Architecture: all Depends: libpgsql-ocaml, libdbi-ocaml (>= 0.9.9), libpcre-ocaml, libgregoriandate-ocaml, - ocaml-base-nox-3.08, libapache-mod-caml (>= 1.3.2), - libtemplate-ocaml-dev (>= 1.3.2), + ocaml-base-nox-3.08, libapache-mod-caml (>= 1.3.3), + libtemplate-ocaml-dev (>= 1.3.3), libocamlnet-ocaml-dev (>= 0.98), imagemagick, curl (>= 7.12.1) Suggests: apache diff --git a/scripts/page.ml b/scripts/page.ml index 535b49e..b82c7cc 100644 --- a/scripts/page.ml +++ b/scripts/page.ml @@ -1,7 +1,7 @@ (* COCANWIKI - a wiki written in Objective CAML. * Written by Richard W.M. Jones . * Copyright (C) 2004 Merjis Ltd. - * $Id: page.ml,v 1.38 2004/11/03 13:36:45 rich Exp $ + * $Id: page.ml,v 1.39 2004/11/05 11:35:53 rich Exp $ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -59,7 +59,20 @@ let run r (q : cgi) (dbh : Dbi.connection) hostid let page = q#param "page" in let page = if page = "" then "index" else page in + (* The main "page" template is split in two to improve the speed of + * delivery of the page. The very first part ("page_header.html") + * contains the page , crucially including all the links to the + * stylesheets. We send this first and flush it out to the client so + * that the client can begin requesting stylesheets, background images + * and so on. After this we compose the main page ("page.html") and + * send it out second. + *) + + let template_page_header = + get_template ~page dbh hostid "page_header.html" in let template_page = get_template ~page dbh hostid "page.html" in + + (* This is the simpler template for 404 pages. *) let template_404 = get_template dbh hostid "page_404.html" in (* Host-specific fields. *) @@ -171,26 +184,49 @@ let run r (q : cgi) (dbh : Dbi.connection) hostid let make_page title description pageid last_modified_date has_page_css version page page' extension = let t = template_page in + let th = template_page_header in t#set "title" title; + th#set "title" title; t#set "last_modified_date" last_modified_date; (match description with - None -> t#conditional "has_description" false + None -> th#conditional "has_description" false | Some description -> - t#conditional "has_description" true; - t#set "description" description); + th#conditional "has_description" true; + th#set "description" description); if page <> page' then (* redirection *) ( t#set "page" page'; + th#set "page" page'; t#set "original_page" page; (* XXX title - get it from database *) t#conditional "redirected" true ) else ( t#set "page" page; + th#set "page" page; t#conditional "redirected" false ); - t#conditional "has_host_css" has_host_css; - t#conditional "has_page_css" has_page_css; + th#conditional "has_host_css" has_host_css; + th#conditional "has_page_css" has_page_css; + + (* Are we showing an old version of the page? If so, warn. *) + (match version with + None -> + t#conditional "is_old_version" false; + th#conditional "is_old_version" false + | Some pageid -> + t#conditional "is_old_version" true; + th#conditional "is_old_version" true; + t#set "old_version" (string_of_int pageid); + th#set "old_version" (string_of_int pageid)); + + (* At this point, we can print out the header and flush it back to + * the user, allowing the browser to start fetching stylesheets + * and background images while we compose the page. + *) + q#header (); + print_string r th#to_string; + Request.rflush r; t#conditional "has_feedback_email" has_feedback_email; t#conditional "mailing_list" mailing_list; @@ -254,14 +290,6 @@ let run r (q : cgi) (dbh : Dbi.connection) hostid t#table "sections" sections; - (* Are we showing an old version of the page? If so, warn. *) - (match version with - None -> - t#conditional "is_old_version" false - | Some pageid -> - t#conditional "is_old_version" true; - t#set "old_version" (string_of_int pageid)); - (* Login status. *) (match user with Anonymous -> @@ -351,12 +379,11 @@ let run r (q : cgi) (dbh : Dbi.connection) hostid let xhtml = highlight_search_terms xhtml search_terms "search_term" in (* Deliver the page. *) - q#header (); ignore (print_string r xhtml) with Not_found -> (* No referer / no search terms / not a search engine referer. *) - q#template t + ignore (print_string r t#to_string) in (* This code generates 404 pages. *) diff --git a/templates/page.html b/templates/page.html index 926736f..b95e809 100644 --- a/templates/page.html +++ b/templates/page.html @@ -1,17 +1,4 @@ - - - -::title_html:: -::if(is_old_version)::::end:: -::if(has_description)::::end:: - - - -::if(has_host_css)::::end:: -::if(has_page_css)::::end:: - - - +

::title_html::

diff --git a/templates/page_header.html b/templates/page_header.html new file mode 100644 index 0000000..cb3a9bf --- /dev/null +++ b/templates/page_header.html @@ -0,0 +1,14 @@ + + + +::title_html:: +::if(is_old_version)::::end:: +::if(has_description)::::end:: + + + +::if(has_host_css)::::end:: +::if(has_page_css)::::end:: + + + \ No newline at end of file -- 1.8.3.1