minimal_web_site_vc.anubis 8.9 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 system/logger.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/controllers_web_site.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_web_session.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.

public define WEB_Action_Name show_login  = controller_action("root", "show_login").
public define WEB_Action_Name after_login = controller_action("root", "after_login").


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", [], after_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 WEB_Controller_Result   
  show_login
  (
    WEB_Session _session
  )=
  http_answer(
  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 WEB_Controller_Result   
  after_login
  (
    WEB_Session _session
  )=
  with lwa  = *_session.web_request.lwa,
  http_answer(
    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 the page
        div([center(text("This is the 'Example 1' web site.")), br,
         text("Login from :")])
      )
  ))
.

define List(WEB_Action)
  root_controller_actions
  =
  [
    web_action(show_login,  http_https, (WEB_Session _session) |-> true,  show_login),
    web_action(after_login, http_https, (WEB_Session _session) |-> true,  after_login),
  ].
  
    
define WEB_Controller
  make_root_controller
  =
  web_controller("root", var(root_controller_actions))
.
  
  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 session
    (HTTP_Info    info,
    Var(List(Web_arg)) lwa,
    Bool          is_https) |-> web_session(get_new_session_id, "en", empty_fields_list, web_request(info, var([web_arg("aws_c","root"), web_arg("aws_a", "show_login")]), is_https), web_request(info, lwa, is_https), web_request(info, lwa, is_https)),      //
    
    // 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.)
    (WEB_Session    expired,
    HTTP_Info       info,
    Var(List(Web_arg))   lwa,
    Bool            is_https) |-> expired,     // keep the same session
    
    var([make_root_controller]),  //controllers
    var([]),                      //desktop renderer
    var([]),                      //list of plugins
    
    // the function for producing additional HTTP headers depending of the session
    (Maybe(WEB_Session) session) |-> [],
    
    //function for adding constant additional headers
    [],
    
    // 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
    ],

    (LogLevel level, String txt) |-> println(txt),  //logger. Here is minimal logger which make only print
    
    // 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)80,
        https_port = (Word32)443, 
   // 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).")
  }
.