minimal_web_site_vc.anubis 8.35 KB

   
 *Project*                             The Anubis Project
   
 *Title*                               A minimal web site. 
   
 *Copyright*                          Copyright © David RENÉ. 

 *Released*

 *Author*    David RENÉ
   
 *Overview*
   
   This file is just an example which may help to start making a web site with 
   Anubis Calexium Library
   It was based on the example for making a minimal web site made by Alain Prouté and located
   in examples/network folder in standard library example
   
   This example is absolutely minimalist and manage only page.
   

read tools/basis.anubis                     // required for 'make_directory' and .
read system/convert.anubis
read calexium_lib/web/CXM_common.anubis                  // required for type 'Web_arg'
read calexium_lib/web/CXM_multihost_http_server.anubis   // required for type 'HTTP_Info'
read calexium_lib/web/CXM_controller.anubis
read calexium_lib/web/CXM_making_a_web_site.anubis            
read web/mime.anubis                        // required for list of known MIME types
read calexium_lib/web/CXM_web_arg_utils.anubis   
read calexium_lib/web/CXM_form.anubis
read calexium_lib/web/jQuery/CXM_jquery_button.anubis
   
   *** Server directory. 
   
   A directory for putting files for all web sites. There will be one subdirectory per web
   site.
   
define String web_sites_directory = my_anubis_directory+"/web_sites".
   
   
define HTML_Partial_Content 
  create_login_form
  =

    partial_content(
      [css(css_file("css/login.css"))],
    div([id("login")],
      sequence([
        //BODY
        div([id("login_body")],
          cxm_form( "login_form", [], "do_login", [], [],
          [
            input         (label(("LOGIN_NAME"),  no_help), wan("login_name"),   init(""), narrow, non_mandatory),
            password_input(label(("PASSWORD"),    no_help), wan("password"),     init(""), narrow, non_mandatory),
            partial(img_submit_button(("CONNECTION"), "login_form" ))
          ])
        ),
      ])
    )).

define HTTP_Answer   
  go_login
  (
    One state
  )=
  html_page
  (
    "Example Site 1",         // title of web site
    [],                       // list of 'META' tags (empty for this site)
    body                      // body of page
    ( 
      // list of body options
      [
        background_color(rgb(255,200,200))
        // add more body options here
      ],
      
      // content of page
      partial(create_login_form)
    )
  )
.
   
define HTTP_Answer   
  compute_page_1
  (
    One state
  )=
  html_page
  (
    "Example Site 1",         // title of web site
    [],                       // list of 'META' tags (empty for this site)
    body                      // body of page
    ( 
      // list of body options
      [
        background_color(rgb(255,200,200))
        // add more body options here
      ],
      
      // content of page
      center(text([size(14)],"This is the 'Example 1' web site."))
    )
  )
.

define (One, HTTP_Answer)
  root_controller
  (
    HTTP_Info                    http_info,
    List(Web_arg)                lwa,
    Bool                         is_https,
    One                          toto
  )=
  
  with action = get_String(lwa, "action", "go_login"),
  if action = "go_login" then
    (unique, go_login(unique))
  else
    (unique, compute_page_1(unique)).
  
    
define WEB_Controller(One)
  make_root_controller
  =
  web_controller("root", root_controller)
.
  
  Making the  description of web  site 1. In  this description, several elements  are the
  bare  minimum.   There  is no  action  at  all,  no  data  base, almost  nothing.   See
  'web/making_a_web_site.anubis'     for    the     declaration    of     the    function
  'make_web_site_description'.

define Web_Site
  example_site_1
  =
  // make the directory for web site 1
  // (subdirectories of it will be created automatically by the HTTP server)
  forget((String)make_directory(web_sites_directory+"/example_site_1")); 
   
  // make a list of all possible 'host names' for web site 1:
  with addresses = (List(String))
                    [
                      "example-site-1",     
                      "127.0.0.1",
                      "192.168.0.1"
                      // add more adresses here
                    ],
   
   // now make the description of the web site
  make_web_site_controller_description(
  
    //this is the unique ID of the web site. This ID will be use for prepend the cookies
    //names belonging to that web site
    "example",
    
    // the list of addresses defined above
    addresses, 
    
    // directory for the files of web site 1
    web_sites_directory+"/example_site_1",
    
    // directory for the states of that web_site
    web_sites_directory+"/example_site_1/states",
    
    // initializing function
    (One u) |-> u,                    // nothing to initialize for web site 1
    
    // the function producing the initial state
    (HTTP_Info    info,
    List(Web_arg) lwa,
    Bool          is_https) |-> unique,      // there is ony one possible state for web site 1
    
    // the function for handling expired tickets
    // (tickets are kept  on the server's disk and represent states.  They are used for
    //  passing     session     informations    from     pages     to    pages.     See
    //  'web/CXM_making_a_web_site.anubis' for detailed explanations.)
    (One            expired,
    Maybe(String)   mb_action_name,
    HTTP_Info       info,
    List(Web_arg)   lwa,
    Bool            is_https) |-> unique,     // keep the same state
    
    // the function for handling lost tickets
    (Maybe(String)  mb_action_name,
    HTTP_Info       info,
    List(Web_arg)   lwa,
    Bool            is_https) |-> unique,     // restart with default state
    
    var([make_root_controller]),
    
    // the function for producing additional HTTP headers
    (One u) |-> [], 
    
    // timeout for tickets (in seconds)
    3600,                                      // does'nt matter since only one state
    
    // list of redirections (one for each address)
    // (see 'web/CXM_common.anubis' for the type 'Redirection')
    redirection_list(map((String address) |-> redirect("/",address,"/index.awp"), addresses)), 
    
    // character encoding for web site 1
    "UTF-8", 
    
    // list of URI extensions producing a console/journal message
    [
     ".awp",    // pages computed by this program
     ".jpg",    // images, etc...
     ".gif",
     ".png"
     // add more extensions here (they must be known; see 'web/mime.anubis')
    ],
    
    // list of HTTP headers which are traced in the console/journal messages
    [
     "host", 
     "user-agent"
     // add more HTTP headers here
    ],
    
    // secret string (used by 'private download')
    "HUD76GRD56FD7GFDS4RT",            // for a real site, please choose another one
                                      // it must remain secret
    
    // list of known MIME types (taken from 'web/mime.anubis')
    known_mime_types, 
    
    // action to be performed before a file is sent
    // (for example, this may be used for counting downloads)
    (String         action_name, 
    List(Web_arg)  lwa) |-> unique        // no action at all
  )
.
   
   
   
   
   *** Example site 2. 
   
   Imagine another web site here...
   
   
   
   
   
   *** Starting all our web sites together.
   
global define One
   minimal_web_site_vc
     (
       List(String) args
     ) =
   // make the directory for all web sites (if needed)
   forget((String) make_directory(web_sites_directory)); 
   
   with http_port  = (Word32)8000,
        https_port = (Word32)4430, 
   // create a variable for handling the shutdown of our web sites
   with shutdown_required = var(false),
   with is_shutdown = (One u) |-> *shutdown_required, 
   
   // start all web sites
  if start_web_sites(
    0,                          // listen on all IP addresses
    http_port,                  // port for HTTP
    https_port,                 // port for HTTPS
    "www.georges.example.com",  // common name of SSL certificate
    [
      example_site_1
      // add other web sites here
    ],
    is_shutdown) is 
  {
    cannot_bind_to_port(n)     then println("Cannot bind to port: "+n),
    cannot_bind_to_port(n,m)   then println("Cannot bind to ports: "+n+", "+m),
    ok(s1,s2)                  then println("Servers started on ports "+http_port+" (HTTP) and "+https_port+" (HTTPS).")
  }
.