Difference between revisions of "WebFund 2016W: Assignment 2"

From Soma-notes
Jump to navigation Jump to search
Line 12: Line 12:
# Add a command line argument which is the name of a configuration file.  This file should contain the contents of the options object.  Note that tinywebserver.js should start up correctly without this option file being specified; in this case it should behave as it did originally.
# Add a command line argument which is the name of a configuration file.  This file should contain the contents of the options object.  Note that tinywebserver.js should start up correctly without this option file being specified; in this case it should behave as it did originally.
# In the configuration file add the following properties to the option object that change the behavior of the app as follows (note it should also contain all the options that were already part of the options object):
# In the configuration file add the following properties to the option object that change the behavior of the app as follows (note it should also contain all the options that were already part of the options object):
#* logged-headers: an array of headers (as strings) that should be logged for each incoming request.  If no logged headers are specified, no headers should be logged.
#* logged-headers: an array of headers (as strings) that should be logged for each incoming request.  If no logged headers are specified, no headers should be logged. Header names should be in all lowercase with words separated by dashes.  Thus "UserAgent" becomes "user-agent".  (This change is because this is the format of header names in request.headers.)  The format should be three spaces, the header name, a colon, a space, then the contents of the header.  E.g.,
<pre>
404 POST /useName
  user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36
  referer: http://localhost:8000/formtest.html
</pre>
#* logfile: the filename where to write log messages.  They should be written to standard out (as console.log does) if no logfile is specified.
#* logfile: the filename where to write log messages.  They should be written to standard out (as console.log does) if no logfile is specified.
#* errorpage: html file to be returned when an error page is returned (not 200).  The 777 status code should NOT return an error page, it should return the regular document (777 is an alias for 200).
#* errorpage: html file to be returned when an error page is returned (not 200).  The 777 status code should NOT return an error page, it should return the regular document (777 is an alias for 200).

Revision as of 18:39, 24 January 2016

This assignment is not yet finalized.

In this assignment you will be be extending the functionality of tinywebserver.js from Tutorial 2. There are ?? points in ?? tasks. This assignment is due on January 27, 2016.


Your modified version of tinywebserver.js should have the following functionality:

  1. Add a new 777 status code if there is a request for any document with the word "lucky" in its URL (path or document name).
  2. Add a command line argument which is the name of a configuration file. This file should contain the contents of the options object. Note that tinywebserver.js should start up correctly without this option file being specified; in this case it should behave as it did originally.
  3. In the configuration file add the following properties to the option object that change the behavior of the app as follows (note it should also contain all the options that were already part of the options object):
    • logged-headers: an array of headers (as strings) that should be logged for each incoming request. If no logged headers are specified, no headers should be logged. Header names should be in all lowercase with words separated by dashes. Thus "UserAgent" becomes "user-agent". (This change is because this is the format of header names in request.headers.) The format should be three spaces, the header name, a colon, a space, then the contents of the header. E.g.,
404	POST	/useName
   user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36
   referer: http://localhost:8000/formtest.html
    • logfile: the filename where to write log messages. They should be written to standard out (as console.log does) if no logfile is specified.
    • errorpage: html file to be returned when an error page is returned (not 200). The 777 status code should NOT return an error page, it should return the regular document (777 is an alias for 200).
    • aliases: object where the key is the alias and the value is what should be substituted. The alias should be for the entire doc path (the URL without the hostname).

Hints

  • To log everything to a file you'll want to use a custom Console object with a special write stream. To get append-only behavior (as logs shouldn't normally be erased) do something like this:
    var Console = require('console').Console;

    var logStream = logStream = fs.createWriteStream("log.txt", {'flags': 'a'});	

    if (!logStream) {
       logStream = process.stdout;
    }

    var myConsole = new Console(logStream);
  
    myConsole.log("This will be written to a file, unless there was a problem!");
  • JSON.parse() is very strict with its parsing, much stricter than regular object declarations in JavaScript. In particular properties need to be quoted (only with double quotes). You can use try/catch to allow this to be handled gracefully:
    try {
      options = JSON.parse(fs.readFileSync(optionsFilename, "utf-8"));
    } catch (e) {
      if (optionsFilename) {
	console.error("Error reading/parsing options file " + optionsFilename +
		    ", using defaults.");
      } else {
	console.log("No options file specified, using defaults.");
      }
      options = default_options;
    }
  • Here's as example config file:
{
    "host": "localhost",
    "port": 8000,
    "index": "index.html",
    "docroot": ".",
    "logged-headers": ["user-agent", "referer"],
    "logfile": "tinyweb.log",
    "errorpage": "error.html",
    "aliases": {
        "index.html": "hello.html",
        "/really/cool.html": "notcool.html"
    }
}