Changes since Roxen 1.1 alpha
-----------------------------------------------

o Maori language module added.


Changes since Roxen 1.0 
-----------------------------------------------

o <aconf> now tolerates href= and generally works better.

o Roxen now gives an error message if the rights on the log an conf
  files are set wrongly, that is, if it is unable to save the
  configuration.

o 'Maximum evalutation time' seems to work now, finally.  Signals are
   tricky when you have to support four different behaviours.

o Roxen no longer tries to set the 'UserID' cookie when methods other
  than POST or GET are used.

o Module security patterns now allow comma-separeted lists.

o The accessed database no longer use 3 FDs. It is more like 0.6 on a
  server with a moderate load. The FDs are closed when not used for
  ten seconds.

o The password database should now be reloaded automatically if the
  source file is changed.

o There is no longer a conflict in the if-tag, two different checks
  wanted to use file=.. <if user=... file=...> now works

o <if> now support the aguments time and until. 
  Thanks to Jason Rumney <jasonr@pec.co.nz> 
  
  Example usage:

   <if time=1800 until=0600>
    Show this text between 6pm and 6am (ie overnight)
   </if>
   <if time=1800 until=0600 inclusive>
    As above, but also show it when the time is exactly 6pm or 6am.
   </if>
   <if time=0700 before>
    Show this text from midnight to 7am.
   </if>
   <if time=1200 after>
    Show this text from midday to midnight.
   </if>

o The external shuffle program fixed again, this time by me.

o The statistics (sent data with friends) has been totaly rewritten,
  using a somewhat more generic bignum class, and hopefully not as
  broken as the old one.

o The interface names in the configuration interface should now
  _always_ be resolved if it is at all possible to resolv them. It is
  now also possible to enter any value, at all times, in a textfield.

o <apre> and <aconf> now keep query-variables.

o The logging format is now more customizable.

o The logging disabler module now works as expected.

o We now use a ticket database to maintain a list of known problems an
  bugs. This has made the bug finding and fixing process _much_ more
  efficient

o SSL should work better now.
  A short, step by step, guide for setting up a SSL-server:
 
  o Get SSLeay, install it in /usr/local/ssl/ (this is the default)
  o cd to roxen/extern/, and type 'make ssl' (this and the next step
    can be skipped if SSLeay was installed when you built roxen)
  o Copy the resulting 'ssl' binary to your 'roxen/server/bin/'
    directory.
   
  o Get (or make) a certificate. A test-certificate can be found at
    http://per.hedbor.org/certificate.
 
  o Configure a new port on the server you want to enable SSL on:
 
    1. Add a new port, and set the protocol to 'ssl'
    2. Enter a line in the 'arguments' textfield for this port:
       cert-file /full/path/to/the/certificate
    3. Press save.
    4. Access your SSL-server.

o The proxy log no longer has two entries for each hit, and the date
  has been added to it.

o New module: Graphics text. Se
  http://skuld.infovav.se:9999/test2.html for some more info (this
  page will probably move in the near future)

o The home logger module has been rewritten, and now hopefully works
  better. 

o The 'add a module' page has been rewritten.

o The modules have been moved into subdirectories in the 'modules'
  directory.  Roxen now support any level of directories in the module
  directory, making it possible, if not useful, to set the module
  search path to '/', and thus getting _all_ modules in the whole
  system.  This took me four hours when I tested if it worked, so I do
  not recommend it.

o CVS version added to all files, as a variable.  In the modules, this
  is used in the configuration interface to show the version.  This
  will hopefully make bug-reports more useful to us, since we will
  know which version of the module was used.  The configuration
  interface now also show the filename of the sourcefile the module
  was loaded from.

o The garbage collector has been redesigned yet again, this time it
  hopefully works. The only file-name-method left is 'hash', but it
  has been enhanced to hash into multiple levels of directories, at
  the most 500 dirs per level. There is no more 'find' processes, and
  the cache recheck is done much more seldom. The server no longer
  blocks when the cache is checked. This was a bug in disk_cache.lpc
  (now disk_cache.pike)

o Roxen can now count in japanese, using Kanji. It is also supposed to
  have support for dates and such.  Since we are not exactly masters
  of japanese, someone who knows the language better might want to
  check this module (<accessed lang=kanji>, as an example)

o <date> and <modified> now correctly counts in Swedish.

o Expiry time of RXML is <i>no longer set at all</i>. In the future,
  it will be set automatically to a sensible value, depending on the
  contents of the pages.  Before it was set to one second in the past,
  making it painfully slow to browse a roxen server over a modem with
  netscape, since netscape seems to reload the images as well as the
  actual page.

o Bug in roxenlib.pike fixed, there was a typo in a sscanf, rendering
  the if-modified-since code quite useless (it only workded if the year
  was 2000, the inverse of the famous "year-2000-problem" :-))
  Wilhelm Koehler <wk@cs.tu-berlin.de>
  
o Portuguese added to the languages. Contributed by cjsawaia@8415.com.br

o A bug in the user filesystem made it impossible to have multiple
  ones mounted on the same spot and still use the .htaccess module
  in them.  Now htaccess work as expected, on the virtual filesystem,
  not the physical one.  The union of the directories are protected by
  the same .htaccess file.

o Roxen now write documentation files and open ports as the superuser,
  if it is started with superuser privilegies. This is a quite useful
  feature, since the configuration files can be protected from the
  user that runs the WWW-server, thus making malicious CGI scripts
  much less dangerous.

o A lot of typos and gramatical errors fixed in the built-in
  documentation.  It will hopefully be readable now.

o Trust levels now works as documented.

o Moved all foo.lpc files to foo.pike (phew..)

o New global variable: Log directory prefix. The directory to prepend
  to various log file paths (right now used for the access log, ftp
  proxy log, http proxy log and by the main RXML parser). The default
  value is ../logs/.

o Start script and install script now accepts the '--log-dir=<dir>'
  option. If you use the start script with it, the debug and
  script output logs use that directory as the default log
  directory. If you use the install script with it, the variable
  [ Global Variables : Log directory prefix ] is set to that value,
  and the initial start script is started with the correct directory.

  This is useful if the roxen source is mounted on a read only
  media, like for example a CDROM. Of course it's also useful if you
  want all your log files in any directory but ../logs/ as well.

o The install script is now a bit more user friendly. When you start
  it (with or without options), you are asked for full hostname,
  configuration interface port, the configurations directory and the
  log directory.

o Made a module that allows virtual hosting using the "Host"
  header. It's implemented using internal redirects. Eventually there
  will be a module that redirects the request to another virtual
  server (probably without need for any configured ports), instead of
  another path in the same virtual server.
  
o Directory index file overrides can now be turned off (bugfix in
  directories.lpc). Thanks to Wilhelm Koehler <wk@cs.tu-berlin.de>.
  
o Roxen now actually turns off logging, when "Logging: Enabled" is set
  to "No". Before it just removed some variables in the config
  interface. =)

o The FTP gateway now handles (at least some) requests to a directory
  that really is a link to another directory. Previously it gave a
  listing with the directory you just opened, as an incorrect link. It
  also handles the response code 212 from the 'stat' command (normally
  it's 211). It also handles user and password specifications in the
  URL.
  
o Applied the patch to ssl.c by Shez (shez@nsl.co.uk). 

o You can now get directory listings in [f]cgi-bin.
  
Changes since Roxen pre 5
-------------------------

o A serious bug found in the error reporting routine.
  If something failed while a configuration was loaded, the
  configuration interface would be loaded, and the error added to the
  log there.  Quite sensible.

  The problem was that the configuration interface, when loaded, as a
  side-effect would change the (horrible) global variable
  current_configuration to a more or less random value. Future modules
  would not be added to the correct configuration, and the listen
  ports for that configuration would be opened twice, causing the
  whole startup-procedure to fail.

o SSL should be fixed now.

o I obviously did not remember all bugfixes.

o The external shuffle program fixed by Michael Widenius, see the
  comment in the code for more info.


Changes since Roxen pre 2
-------------------------

o I accidentally wiped all my roxen-files with the garbagecollector.
  Now it won't wipe files as easily :-)
  I hope I remembered all important changes I had made.

o The lpc-tag module actually works now.

o filenames in the fast-cgi module sometimes got quite long, around
  40Kb or so. This was not intentional, and made some fast-CGI scripts
  bug horribly.

o It was not possible to get indexfiles from protected filesystems
  before. That was lost somewhere between Spinner b11 and Roxen b2.

o The lpc-tag module works now.

  Example usage:

  <define name=count>
    <lpc lang=$lang to=$to>
      int i;
      output("<h1>Counting to "+args->to+" in the language '"+args->lang+"'</h1>\n");
      output("<pre>");
      while(i<(int)args->to)
        output("%d is %s\n", ++i, roxen->language(args->lang,"number")(i));
      output("</pre>");
      return flush();
    </lpc> 
  </define>

  <insert name=count $lang=swedish $to=40>
  <insert name=count $lang=finnish $to=40>
  <insert name=count $lang=catala $to=400>


  This tag can be quite powerful, but also dangerous.
  Consider this example:

  <lpc>
  roxen->shutdown();
  </lpc>

  For this reason, there might be restrictions in the future, the
  'roxen' pointer might be unavailable, as an example. The same goes
  for all other functions/objectpointers etc. that could return data
  from the 'roxen' server, as well as all functions that could be used
  to modify files. 

o The language formerly known as µLPC is now named 'pike'. There has
  been a change or two in the source of Roxen to reflect this.

o A new version of µLPC is used. The garbagecollector (on the language
  level) is now running, this solved the memory leak in the proxy
  module.


o The garbage collector program now actually works, and does not use
  all your memory to do it. Normal usage is around .5 Mb of memory.
  The proxy module now modifies the statistics in the server to
  reflect the amount of data it has sent and received.

Changes since Roxen pre 1
-------------------------

o Some bugfixes, but mostly cosmetic changes.

Changes since Spinner ß15pre
----------------------------

o A _LOT_ of cosmetic changes.
  More will be done (the configuration interface colors are _not_ done 
  yet, the 'roxen' logotype is a quick hack, etc.)

o Spinner is now known as Roxen instead. Most files/functions
  etc. renamed from 'spinner' to 'roxen... :-)

o Feature freeze in preparation for Spinner 1.0.

o The 'userdb' module will check the password file again is a username was 
  not found, instead of relying on its in-memory cache.

o The ftp gateway now sets a more reasonable default password, since
  spinner@infovav.se was not all that good an idea.

o The cgi module now handles path-info correctly for all scripts.
  A function was misnamed.

o The htaccess module now set the 'auth' variable in the request_id
  correctly, and it has been changed into a MODULE_FIRST type of
  module, to make it impossible to even detect the _presence_ of a
  protected file, no more 'No such file' errors from protected areas
  of the server.

o The servers in the configuration interface is now sorted in
  alphabetical order.

o The proxygarb program has been rewritten (more or less from scratch)
  by Pontus Hagland.

o An image drawing library has been added to the distribution. Docs
  can be found in ulpc/src/modules/image/doc.{html,txt}. This is quite
  useful to, as an example, draw buttons and perheps a gif-counter or
  two. The library was coded by Pontus Hagland <pontus@infovav.se>

  There is a module inluded that use the interface to draw tab-lists

  This module adds a tag <tablist ...>, for easy access. This module
  was mostly coded by Fredrik Noring <noring@infovav.se>.

  The syntax for 'tablist' is quite easy, try this:
  
  <tablist names="Statistics,Test,Info,Foo" selected=1    
     1="test1.html"   2="http://www.infovav.se/"
     3="test3.html"   4="test4.html">

o Fast-CGI support added, currently not inline in spinner but as an
  external program. This will change before the final 1.1 release, but
  not before 1.0.

o The images in the configuration interface has been changed. They are
  now generated by the automatic 'tablist' module written by Fredrik
  Noring. 

o Some compatibility for pre-b10 save files removed, and the
  compatibility with the pre-release has been removed because the
  encoding format used has been changed to save space.
  I suggest reinstalling from scratch if you run a spinner older than
  b10, or the b15 pre-release.

o Added support for a new types of modules: MODULE_FILTER.
  The MODULE_FILTER modules get the function filter(mapping map, object id)
  called with the finished result-mapping. The function can modify the
  mapping, or return a new one.

  This is used, and was needed for, the new .htaccess module (the
  .htaccess support has been moved to a module for more flexibility
  and configurability)

o The port variable configuration is now somewhat more
  intuitive :-)

o The variables and support functions from the configuration class is
  moved to a separate file (lpc/configuration.lpc) for clarity and
  readability.


Changes since beta 14
---------------------

o The _lock(), _unlock() etc. functions (preferably used through
  lock.lpc) in ulpc/spider/lock.c now use mutex locks instead of
  semaphores. This speeds them up more than 90 times, and bypasses the
  Solaris default limit of some 32 or so semaphores.

  It is also possible to kill a process waiting for a mutex lock.
  This is _not_ possible with semaphores, which can be _really_
  annoying, to make the understatement of the day.

o I made quite a lot of bugfixes. Thank you all for reporting the
  bugs, without you, Spinner would never be what it is today.

o Added support for two new types of variables. TYPE_MODULE and
  TYPE_MODULES. This is not currently used in released modules.

o Added patch to cgi.c from Brian Dowling <brian@simplicity.net>, He
  found an 'off-by-one' error in it. That was an too obvious error,
  really, but I almost never run CGI programs. I will try to use them
  more often to find the problems on my own.

o All compilation errors on Linux fixed (I hope).

o The save button in the configuration interface now save _all_
  variables, and not only those in the current node and its subnodes.

o The configuration password and username is now saved immediately
  when you press Ok in the initial form. It was not saved until you
  pressed save before.

o Bug in cgi.c fixed (the signalhandler for SIGCHLD was, quite
  naturally, called before all data was received from the cgi 
  script)

o Spelling errors fixed in the documentation.

o A persistant class added to the distribution. Some day I will get
  around to documenting it too.

o Added cookies support to cgi.lpc and the SSI-support.

o The configuration password and username is now saved immediately
  when you press Ok in the initial form

o The cgi module has been fixed.

o Bug in cgi.c fixed (the signalhandler for SIGCHLD was, quite
  naturally, often called before all data was received from the cgi
  script)

o Some spelling errors fixed in the documentation.

o A persistant class added to the distribution. Some day I will get
  around to documenting it too.


Changes since beta 13 release 2:
--------------------------------

o mkdir -p is no longer used. Instead, I wrote a small shell script
  that should do the same thing.

o A new target when compiling: 'localinstall', install in
  ../server/bin, just as it used to.

o A bug fixed in the filesystem module that disabled directorylistings
  at all times, and in the directory module, it is now possible to have
  index.html files in exec-only directories (or directories with a
  .nodir-access file in them.)

Changes since beta 13 release 1:
--------------------------------

o It is now possible to use function pointers for the
  'variable_is_visible' field to defvar() in modules. This is used to
  make som variables toggle their visibility state. As an example: The
  cache configuration variables are only visible if the caching is
  actually on.

o Compilation errors in ssl.c, cgi.c, spider.c and lock.c hopefully fixed.

o Bug in spider.lpc fixed (for some reason I forgot adding the define
  HTACCESS_SUPPORT, and Spinner did not work if it was undefined)

o Bugs in the Makefile.in file in extern/ and in the "root" fixed.

o Removed quite a lot of unneccessary debug messages from the code.

Changes since beta 12:
----------------------

by Per:

o When you type Make install, Spinner will really _be_ installed.
  Default is in /usr/local/roxen, it can be set by typing 
  configure --prefix=/where/should/it/be. roxen will be added to the
  path, thus, configure --prefix=/usr/www will install roxen in 
  /usr/www/roxen.

o It should now be possible to compile everyting in subdirs.
  Like this:

  mkdir solaris
  cd solaris
  $HOME/Spinner1.0b13/configure --prefix=/usr/www
  make install

  This will compile spinner in a subdir called solaris.


o I did a profile of a running Spinner server, and this is what I came
   up with:

  %CPU        Self    Calls     Function
-------------------------------------------------------------------------
 24.26       67.42     6310     _ioctl                <--- From f_send_fd
 12.34       33.79     3291     _open
  8.42       23.04     6415     _close
  5.54       15.17   133663     eval_instruction      <--- µLPC overhead
  5.19       14.21     3327     _stat
  3.04        8.32     3167     _write
  2.01        5.49              _getmsg
  1.58        4.32     3345     _read
  1.51        4.14     3646     _poll
  1.48        4.06  1521417     assign_svalue_no_free <--- µLPC overhead
-------------------------------------------------------------------------

   It is not all that easy to get rid of the _open and _close calls,
   but it is possible to do the _ioctl calls from a separate thread.

   I will try this.


o Added SSL support. This currently uses an external process that do
  the mapping from SSL to bare sockets. This might be an security
  problem, because users on your local host can connect to the server
  (not via HTTP, though), and pretend that they use SSL. They do have to
  find the right socket first, and learn my internal protocol, but that
  is not really all _that_ hard.

o Rewrote quite a lot of the internals. They are hopefully somewhat
  more readable now. But no, the function pointer module lookup cache
  mappings and arrays are not gone yet. :-)

o Added locking to the accessed database. This works for local
  access. If you use NFS between different computers you could miss a
  few accesses to the most busy pages.

o A new C-object, a HTTP request parser. Somewhat faster (but not
  much, to my dissapointment, after spending some 5 hours writing and
  finetuning it (0.2% faster overall requestspeed, 2% faster request
  parsing))

o A new module: userlogger.lpc. This module log in the home-dirs of
  the user in question, or anywhere, really. It will use the same
  log-format as the main logger does.

o A new class of modules is added, MODULE_LOGGER. The client logger
  and the user-dir logger now use this class.

o Added support for /foo/bar.cgi/gazonk to the CGI module.

o Rewrote the shuffle process to use a list of free threads instead of
  creating a new thread for each call.

  Advantages: 
  o Slightly faster

  Disadvantages:
  o Somewhat more memory will be used.  Not all that much, unless you
    have a very busy server. But then you probably need that extra
    memory in the shuffler to get some performance.

o A new µLPC is used. This one has a garbage collector to kill cyclic
  structures, and a peep hole optimizer (in adition to the other ones).

o Fixed a bug in the html parsing.

  this did not work:

  <if a>
    <if
     b>
    </if>
  </if>

  but this did:

  <if a>
    <if b>
    </if>
  </if>
   
  This had nothing to do with the if tag, it was a bug in the parser.
  All tags in tags with the same name had to have a space character
  (Hex 20) after the name of the tag. Tab, newline or linefeed was not
  allowed.

o Added (experimental) support for multi-process operation.
  Spinner will fork a few copies of itself after it has been configured,
  and each copy will listen to the same sockets for requests.

  Advantages:
  o If one server blocks (NFS, µLPC script etc.),
    the other ones will still work
  o Spinner will utilize multi-CPU computers much better, and there was
    a 2% performance gain on a single CPU SUN Solaris 2.5 system with 32Mb
    of memory.

  Disadvantages:
  o Spinner will use more memory and system resources.
  o Since there are now multiple servers running at the same time,
    beware of locking problems, and remember that data in µLPC scripts and
    modules are server local. Use disk files to save your data. Memory
    cache is not a good idea.  This is the major problem.
  o The accesses/byterate numbers in the configuration interface
    will not be 100% accurate. The more processes you use, the less
    accurate the numbers will be, since they are generated by
    multiplying the number of accesses to the "main" server with the
    number of servers.

by David:

o Some fixes in the gopher gateway URL parsing.

o New command in .htaccess: ErrorFile. This is the real path to a file
  to send if access is denied. It is sent through the parser.

o when changing uid/gid, initgroups() is used to set the users correct groups.

o A small bug in redirect.lpc fixed - when you removed patterns, they
  weren't eremoved unless you reloaded the module or restarted the server.

o ismap.lpc: Bugs in the ppm map method fixed. It now works. 

o htaccess parsing: Support for Satisfy
  (http://hoohoo.ncsa.uiuc.edu/docs/setup/access/satisfy.html)
  added. Support for different access for different protocols added
  (ie <Limit Post> for example). 

o Interesting bug fix in htaccess: If you allowed access to people
  from the domain bar.com, people from the domain foobar.com would be
  allowed as well.

o cgi.lpc: Fixed PATH_TRANSLATED and PATH_INFO so that no extra '/' is
  added. Added two more headers; DOCUMENT_ROOT
  (spinner->real_file("/")) and SCRIPT_FILENAME (real file of SCRIPT_NAME).
  
o Spinner now parses HTTP file upload (via forms) correctly.

o Two more languages; spanish and catalan. Translated by Jordi Murgo

by Per:

o The layout of the configuration interface is somewhat changed.

o Spinner now also support the FTP (david) and Gopher protocol (for fetching
  files _from_ Spinner, that is). Support for 'put' is in development (david).

o Unique ID kept by the server if the client supports cookies.
  Useful for tracking users in your logs.
  Add $unique_id to your logging format to insert it.

o A new class of 'state' variables: <if config=...> 
  and <aconf +foo -bar></aconf>

  This is more or less exactly like prestate, but it is only possible
  to have one config per server.

  This information is stored in client side cookies if they are available.

o Cookies are now available from spinner:
  <if cookie="NAME[ is VALUE]"> True if NAME is set or, if the second
  syntax is used (<if cookie="NAME is VALUE">), true if NAME is set and
  match VALUE. VALUE is a comma separated list of shell-pattern like
  mathes (* and ?)

  From µLPC, this information is available in id->cookies and id->config.

o The "NAME is VALUE" syntax is also available for 'defined' and 'variable'.

o 'No directory lists' variable added again to the filesystem module.
  This will also block modules that depend on the directory listings
  to find files. An example is the language module.

by David:

o Proxy-Authentification header supported by all proxies.

o Some patches applied to make the ftp-proxy work better.

o ismap.lpc: If you add a 'void URL' in your map-file,
  incorrect map accesses (for example if using lynx) will be
  redirected to this URL instead of the void.

o New module: 'index files only'
  Never generates any directory listings, only checks for index files.


Changes since beta 11:
----------------------

by Per:

o bug fixed in mainconfig.lpc (removal of virtual server).

o small bug in userdb fixed.

o Core dump bug fixed in spider.c.

o Small parser bug if a tag had the argument "" (empty string).

by David:

o Polygon routine in ismap.lpc rewritten by hpj@one.se

o Start shouldn't change uid on configuration and log directories to 0
  if the user isn't set in Global variables.

o bin/install.lpc failed to find domain from resolv.conf. Fixed.


Changes since beta 11pre11:
---------------------------

o It is now possible to have negative support values.
  Like this:
  mozilla.*mac.*	-java


o Most, if not all, files spinner read can now have escaped newlines, 
  using '\'.  This will, as an example, work:

  --- etc/supports ---
  .*mozilla.*			lots, of, features,\
				split, over, multiple\
                                lines


o The HTML parser is now somewhat more generous where quotes are concerned.
  You can use booth "string" and 'string', and user defined begin and end
  quotes as well (like {string}. This allows nested quotes, like this:
  {foo {bar} gazonk}
  
  There is also a new tag to set the user defined quotes:
      (this can be done multiple times) 

  <quote start='{' end='}'> -- Set the start quote to { and the end quote to }.
  <quote start=a end=b>     -- For some interresting results... :-)

  per default the user quotes are \000. They are still active, though.
  So if you use the NULL character in your tags, make sure you
  redefine the quotes..

o If you leave out AuthUserFile in a .htaccess file, the virtual server's 
  user database will be used instead.

o bin/domainname and bin/hostname <i>eliminated</i>.

o The configuration script and the start script has been rewritten.
  All spinner programs now accept '--help'. Try running the 'install' and the
  'start' scripts with this argument, to see which arguments they accept.
  Extra arguments to install is sent to the start script (you can for example 
  write './install --pid-file=/tmp/pid').

o The 'add a new virtual server' screen has some new nifty features. 
  Check it out.

o A new method added to the userdb module - use 'getpwent' to retrieve
  password information. This should be possible on most systems, but
  it is somewhat slower than the other methods. Support for shadow password
  information added as well (if your system supports it, and spinner
  is run as root, that is).

o The <insert file=...> tag now inherits authentification information
  from the original request.

o Hopefully no more 'leakage' into the logfiles from the configuration
  interface hits.

o You can now do <modified file=foo> for modification date of 'foo'

o You can now use $FOO in imagemap to insert the value of the forms
  variable FOO.

o I have started adding links in the helptexts in the configuration
  interface to online HTML help files. The base URL of the help files is
  configurable.

o If caching is not enabled, no proxygarber will be run.

o There is no longer any problem with '/' as the caching dir. A
  directory named 'spinner_cache' will be created in the cache
  directory.

o SSI compability should now be somewhat more complete.

o Keep-alive bug narrowed down to a Netscape bug. Small files won't
  work with keep-alive and Netscape. Because of this, keep-alive is per
  default disabled.

o Bug in proxygarb.c compability functions fixed (Thanks to Pascal
  Pederiva, pascal@zuo.dec.com)

o The configuration file format is changed and is now _incompatible_
  with the old format. A program is shipped with spinner that can parse
  the new format, and change variables. This program will always be able
  to parse the configuration files.

o Automatic upgrading of configuration files added.
  Preserving and possibly automatically extending the config files
  with new features of modules and global variables.

o The handling of 'Ports' changed so that it is now possible to have
  different protocols/IP-numbers on a per port basis.

o The state variables removed since nobody ever used them.
  (i.e. 'http://www.whatever.com/foo.bar.html(a=b,c=d)')

o Handling of index files moved from the different file systems to the
  directory module.

  There are several reasons:
  o It is more logical

  o It makes it possible to mount differnt directories on the same mountpoint
    and still have index files...

  o It greatly simplified the filesystem module, and did not really complicate
    the directory module.

o The access counter can now be reset.
  <accessed reset> will reset the counter. The other arguments to
  accessed work as usual, that means that it is possible to reset the
  counter for any file.

o You may add comments to all modules in the configuration interface,
  and you can also name each module.

o Now the <if variable=X> can take a quite odd syntax for X, namely
  NAME is MATCH_LIST

  NAME is the name of the (form) variable, and MATCH_LIST is a comma separated
  list of patterns to match. (as an example: "foo*,bar*,gazonk*")

  This is quite useful for forms, try this one:

  <form>
  Search for:
  <if variable="search is *">
   <input type=string size=50,1 name=search value="<insert variable=search>">
  <otherwise>
   <input type=string size=50,1 name=search value="">
  </if>

  <br>

  Search in:

  <define name=opt>
   <if variable="area is match">
    <option selected>
   <otherwise>
    <option>
   </if>
   match
  </define>
  <select name=area>
   <insert name=opt match="Lysator Main Server">
   <insert name=opt match="Local pages">
   <insert name=opt match="Project Runeberg">
   <insert name=opt match="Religion Archives">
   <insert name=opt match="Usenet Cookbook">
   <insert name=opt match="Amiga Archives">
   <insert name=opt match="Anime Pocketguide">
   <insert name=opt match="Gardening Archives">
   <insert name=opt match="Hackers Dictionary">
   <insert name=opt match="Homepages">
  </select>
</form>

o Lots of changes in the htmlparser to enable debug information.
  This means that the parser now and then insert some diagnostic debug
  information, like <!-- Include of foo failed, no such file! -->.
  
o Fixed the access counter again.

o Bugs fixed in .htaccess. Now IP and host patterns works as expected. 

o <!--#exec cmd=""> now has some interesting environment variables set.

o The Redirect module is completely rewritten.
  See the documentation for more information.
  
o Fixed if-modified-since feature (please try it out).

o An option to send the decoded password to cgi-scripts added in the
  cgi-module. The variable is called REMOTE_PASSWORD.

o New flag in user file system. Run scripts as the file owner. If set, all
  µLPC/cgi scripts will be run as the owner of the script file.

o Logging of $user no longer logs the password.

o Some changes in htaccess.lpc to use id->realauth, instead of id->auth.

o Fixed a bug that made the userdb bug when reading long password files.

o Fixed some minor "bugs" in the documentation about 'no logging for'. It said
  list of ip numbers when it should be list of ip_patterns_.

o Fixed the access counter.

o Fixed mainconfig.lpc so that variables with spaces in them was handled
  correctly again.

o Global access / request information available under 'Spinner server status'. 

o Added some more extensionmappings (com, dll, drv ->
  application/octet-stream, and nspc -> application/x-ns-proxy-autoconfig).

o Fixed the lpcscript module so that the setx functions are removed
  more nicely. I didn't think last time! ;-)

o Fixed <!--#include file="non/absolute.path" -->
  
o Pontus fixed so that the ftp gateway handles the dirlistings at
  ftp.uwp.edu (real strange ones, check them out (login and type 'dir')!),
  and there are some other bugfixs as well.

o The imagemap module now translates carriage return to newline. This
  way 'Macified' imagemaps will work w/o conversion.

Changes since beta 11pre10:
---------------------------

o Now the four set*{gu}id functions and exec() are replaced with
  'banished_function'.  This makes it impossible for an µLPC script to
  change back the uid to root.

o Popen, exece and exec changes the uid/gid to the effective uid of
  the server. Thus it's impossible to start a program that can change
  itself back to root. 

o Added checks for sete{gu}id and setres{ug}id (HP-UX).

Changes since beta 11pre9:
--------------------------

o Spinner now uses seteuid()/setugid when instead of setgid()/setuid(). This 
  makes it possible for cgi scripts to run as another user than the server
  process.

o Added the variable 'Run scripts as' to the cgi.lpc module. It defaults to
  nobody.

o An new option in the filesystems, whether hidden files should be
  shown/sent or not. Default is not.

o htaccess.lpc now also supports the use of standard /etc/passwd files.

o Logging format in HTTP proxy changed to
  {URL} {size in bytes or '-'} {Client or New} {Client host[,client,...]}

o It's now possible to turn of ip to host resolving, by uncommenting
  the define in spinner/server/include/config.h.

o Proxy cache information (data in cache, num files in cache, files to be 
  removed) are now correct, regardless of which caching method you use.

o All cached files are saved in the directory {Base Cache Dir}/spinner_cache.
  This way, it's ok to set the cache directory to '/'. If you have been using 
  caching before, don't forget to delete or move the files to the correct 
  directory.

o If a script was called with only a '/' as 'PATH_INFO', PATH_INFO
  wasn't set. Fixed.

o Fixed an 'indexing out of bound' bug in htaccess.lpc

o A couple of fixes to the ftp gateway. I tried using both passive and
  active ftp, getting files, getting dirs without trailing '/'. It
  worked. 
  
o HTACCESS bug: valid-user didn't work (always returned permission denied).

o Bug fixed in modules/ismap.lpc that made Spinner loop forever when
  parsing an NCSA polygon which line didn't end with a space.

o htaccess parsing no longer case dependant.
 
o The hash caching method wouldn't cache files ending with '/'. Fixed.


Changes since beta 11pre8:
--------------------------

o Spinner wouldn't start if the pidfile couldn't be opened. Fixed.

o .htaccess files cannot be fetched if htaccess parsing is enabled,
  nor are they listed in dir listings.

o Two more attributes added to <modified>: realfile and file. See the
  documentation for more information.

o Fixed a couple of bugs in server/languages/english.lpc.

o The config interface now checks if the client knows tables or not,
  before sending one. Before you couldn't for example add/remove modules 
  with the buggy X-Windows Mosaic.

o Added the _real_ version number at the end of each page in the
  configuration page (note that this isn't necessarely the same as the one
  inserted by <version>).

o Bug in filesystem when using the stat() before (default)
  option. When a file wasn't found, the filesystem incorrectly returned 
  'Permission denied'.

o Fixed a bug in relay.lpc that made it unusable.

o Fixed a bug in htaccess which made user verification bug if you didn't 
  have a user data base enabled. 

Changes since beta 11pre7:
--------------------------

o Added an option to filesystem.lpc wether to stat() a file or not
  before opening it. In beta < 10 it was always stat()'ed first and in
  b10-11 it was opened first. The change in behavior might have caused
  some strange problems with disappearing user directories etc.
  
o fix a bug in the .htaccess handling. Before you could get a
  dirlisting of protected directories.

o cgi QUERY_xxx parsing fixed. 

o Bug that made it impossible to compile cgi.c on AIX fixed.

o Bug in lpc/htaccess.lpc fixed - if a line started with space/tab
  that line wouldn't be parsed correctly.

o Bug fixed in lpc/mainconfig.lpc: configurations with space in their
  name wasn't correctly deleted from disk before.
  

Changes since beta 11pre6:
--------------------------

o A couple of small fixes in the various c-files to make them compile
  on all different architechtures.
  

Changes since beta 11pre5:
--------------------------

o The default 'no such file' message changed.

o The existing Spinner documentation is included in the distribution.

o Zombie bug (defunct processes) fixed.

o small memoryleak fixed in µLPC.

o small bug in cgi.c fixed.


Changes since beta 11pre4:
--------------------------

o Some serious bugs in µLPC fixed.

o Two more extension maps added.

o a bunch of small fixed in the .lpc files

o The solaris datashuffler shipped in the distribution now works.

Changes since beta 11pre3:
--------------------------

o New version of µLPC included.

o The solaris data shuffler is now included.
  To use it, cd to 'extern' and type 'make shuffle-install'.

o The http proxy can now filter output through external programs.
  An example filter is included. It remove the ads from infoseek and lycos.
  Don't tell the advertisers.. :-)

  To test it, copy the example filter regular expressions from the
  documentation in the configuration interface.

o New module security:

  When a location module find a file, that file will get a 'Trust level'
  that equals the variable 'Security: Trust level' in the module.  This
  file will then only be sent to modules with a lower or equal 'Trust
  level'. 

  As an example: If the trust level of a User filesystem is
  one, and the CGI module have trust level 2, the file will never get
  passed to the CGI module. 

  A trust level of '0' is the same thing as free access.

o <smallcaps> now takes another argument: space.
  Works like this:
  <smallcaps space>This is a Header</smallcaps> -->
  <big>T</big> H I S  I S   A <big>H</big> E A D E R

o The http proxy now checks for 'if-modified-since' headers.

o DOCUMENT_URI now passed as an environment variable in the <!--#exec tag.

o The server logfiles are now closed/opened every minute.
  This makes it possible to 
  1> rename the old file
  2> wait one minute
  3> process the data in the old file, while spinner log to the new file..

o Added a few newlines to the HTML code generated by the configuration 
  interface. Lynx seems to crash and burn if the lines are to long...

o The directory module should work better now (fold/unfold was broken before)
  
o Appending a "/" to a URL returned the unparsed SPML on some
  systems. This is now fixed.

o CGI scripts failed when accessed from hosts w/o a DNS-name. Fixed.

o bin/domainname reedited. It is now hopefully readable.

o Fix i lpc/config/savers.lpc, now you should be able to save
  server global variables, even if you don't focus on the
  virtual server node in the configuration interface.. 

o New module by Mattias Wingstedt (wing@infovav.se): Indirect HREF.
  See http://spinner.infovav.se/archive.lpc?r=530

o Fix in http.lpc, now the "URL" "%20%%" is decoded to " %%" this
  caused an internal server error before. So if you have seen any errors
  in http_decode_string (index out of range), this was probably it.

  This only happened if illegal URL-s was passed to Spinner.

o A couple of fixes to the htaccess parsing. Should work now.

o New way to pass arguments to the start script from the install
  script. Hopefully it works this time.

o Extentions is now known as extensions in _all_ files (I hope.. :-)

o Some files have moved around.

o Now the start script does not use the '-R' flag while changing
  permissions and ownership of files. 

o The redirect module can now also redirect files based on patterns
  and on individual file basis.

o Moved the handling of the http protocol to protocols/http.lpc. This
  is a preparation for multiple-protocols-in-one-server. 
  (anonymous ftp comes to mind..)

o Per wrote a new module - client_logger.lpc, logs clients names in a file,
  nothing more, nothing less.


Changes since beta 11pre2:
--------------------------

o A couple of fixes to the htaccess parsing. Should work now.

o Spinner now compiled and run on IRIX5 and NeXT. 

o Improved bin/domainname and bin/hostname scripts. Should work better
  now. If it still doesn't work, please notify us.

o Many bugs fixed in µLPC.

Changes since beta 11pre1:
--------------------------

o A lot. But I forgot to log it..


Changes since beta 10:
----------------------

o NCSA / Apache Server Side Includes support added to the htmlparse module.

o A couple of bugs fixed in the ismap.lpc (imagemaps) module.

o More clients added to the 'supports' database.
  Now includes (short list): 

  Arena 
  Cern linemode
  Hotjava
  Lynx
  Micro$oft Explorer
  Mosaic
  NCSA Mosaic 0-2.4, 2.5, 2.6, and 2.9 and up
  NCSA Mosaic Final Beta
  Netscape 1.0, 1.1, 2.0, 2.1 and up
  Udiwww
  VOL (Video On Line/TIBER)
  W3 linemode
  

o <realfile> - insert the name of the file in the real filesystem.
    Not really useful.

o <vfs> - Insert the root of the current virtual filesystem. This is
          the location (or mountpoint) of the filesystem.

   Since it is currently _not_ possible to do things like this:

   <insert file=<vfs>/error>, this is not really all that useful.


o <accessed per=second|minute|hur|day|week|month|year>
  Perhaps useful for something like this:

   You are the <accessed lang=se type=ordered> guest since
   <accesses lang=se since>, so there are <accessed lang=se prec=2 
   type=string per=hour> hits per hour on this page.


o The <return> tag can now take another argument: text. (suggested by
  someone at spinoff.pages.de)

  The normal return code is
  HTTP/1.0 200 Ok

  <return code=200 text="Not ok at all, really">
  will result in
  HTTP/1.0 200 Not ok at all, really

  If you find any use for this, mail me :)


o Some command line options now supported:
  -d <configuration_dir> --config-dir=<configuration_dir>
    Set the configuration directory. This is where all configuration
    files will be kept. The directory does not have to exist.

  -p <filename>  --pid-file=<filename>
    Save the PID of the spinner server (and the start script, if used)


o Some more environment variables handled:

  SPINNER_CONFIGDIR  same as --config-dir (or -d) command line option
  SPINNER_PID_FILE   same as --pid-file (or -p) command line option

o New german.lpc
   From: Tvns Böker <bueker@bidnix.bid.fh-hannover.de>
   Subject: New 'german.lpc' ...
 
   Hi,
   I got a new 'german.lpc' for the distribution. It replaces
   the 'ter' in ordered() with a '.' and puts the date issued
   by e. g. <modified since lang=de> to e. g. 'am 22. Septemper'
   which is more frequently used than 'Septemper 22ter' in
   Germany.

o Disk cache now handles the 'Expire' header.

o The <meta HTTP-EQUIV=... > tag is now parsed.

o New feature in <file>: <file raw> -- Insert the (somewhat) unparsed filename.
  If the file requested is /(pre)/foo.html(bar=gazonk)?a=b%20c:
  <file>     /foo.html, 
  <file raw> /(pre)/foo.html(bar=gazonk)?a=b c

o Bugs in all languages fixed, and more... Thank you, Patrick Kremer

o New tag: <language [full]> -- Inserts the accept-languages passed by
  the client.

o New feature in if:  <if language> -- If any languages are passed
  <if language=en*> if the language is english.
  <if language=en?uk> if the language is brittish english.
  
  Languages (hopefully) as defined by RFC 1766, but it is up to the client.

o cgi scripts now work somewhat better.
  Byte 137 of the output was lost (most of the time) before.. :)

o Quite a lot of misfeatures corrected (not really bugs..)
  o Error message No such file did not get client info (for <if>)
  o Everyting in the HTML parser should now be case independant
  o Unknown methods now return 501 Unimplemented instead of 'Ok'
  o status: headers from CGI-scripts are parsed
 .. and more

o Irritating bug in cgi module fixed.
  query_name() bugged out.

o Each request is now handled internally as an object.
  This makes it easier to implement new features and protocols.

o The proxy module is more or less totally rewritten.

o The file cache is moved from the proxy module to the main spinner
  object, thus making it possible for other modules to access the cache
  as well.

  The variables used to configure the size and location of the cache
  has been move the the global variables section.

o In image map files, you can now use $varname.
  Varname will be replaced with the value of the form
  variable varname.

  Thus, you can do like this:

  <a href="/main.map(up=up_page.html,down=down_page.html)"><img ...></a>
  or
  <a href="/main.map?up=up_page.html&down=down_page.html"><img ...></a>

  with this mapfile:
  
  point (10,10) $up
  point (20,40) $down

  A variable in a map file must only contain the caracters
  a to z, A to Z and _

 
o WARNING WARNING WARNING:
 
  The module interface has one quite large change, the stucture passed to
  modules (request_id) has had the entry 'got' removed from it.
 
  Thus, if you wrote 'request_id->got->variables[name]' in b10, it will be
  request_id->variables[name] in b11.
 
  It is possible to add the 'got' entry as a pointer to the request_id
  object, but that will give the object an reference extra, originating
  from the object itself, thus, if the object is forgotten, the memory it    
  use will not be free()d.
 
  This, I think, made it neccessary to remove the compability with b1-10
  modules.
 
  There will be no more changes of this kind later on, but I think that this
  change was necessary. 
 
  I am really sorry for those of you who have already written modules, but    
  the change is not a big one (just remove all ["got"] or ->got in your
  modules, that should hopefully fix it).
 
 
 


Changes since beta 9:
---------------------

o HTTP/0.9 should now work correctly again.

o Basic parsing of .htaccess added to the filesystem modules.

o Documents with zero content type was sent as:

  "HTTP/1.0 200 Ok
   All: Headers
   Except: Content-length"

  That is, no content length header and no ending \r\n\r\n.

  This has not been spotted before now because Netscape gladly parse
  that.

o USE_RUSAGE now undefined by default, because rusage() fails on some
  systems. If you want this info, define USE_RUSAGE in include/config.h

o Three languages added: Dutch, german and french

o gopher: and mailto: works in imagemaps

o Type point bugged in imagemaps. Fixed together with a couple of other bugs.


Changes since beta 8:
--------------------

o Language support will now no longer bug out completely if there are
  no languages available. Insted, you will get an error message..

o Optimized boot procedure

o Now the server will do rusage() on each call to get average/min/max
  times for parsing and file-finding. This makes the server about 6%
  slower, so if you run a very busy site (500 000+ hits/day), consider
  undefining USE_RUSAGE in include/config.h.

o The proxy no longer cache method=POST or documents with query variables.

o Bug fixed in secure_fs, a username could never give an 'Ok' security
  status, only the oposite..

o New features for module developers reinvented (they were present up
  to beta 3, but dissapeared when the configuration interface was rewritten
  to use the new <dl> mac style look instead of the old tables.):

  o When on the 'add a module' screen, pressing reload will rescan all
    module directories.
  
  o When focusing on a module, there will be a 'Reload' button in the
    bottom of the screen. This one will refresh the module from disk,
    after _saving_all_unsaved_changes_. 

o New option to insert: <insert variable=foo>. Insert the value of the form
  variable foo.

  Might be useful, and it was only three lines of code..


o New flag for <insert file=...>: nocache. 
  Means the the file always will be reloaded. Useful when you include
  cgi and/or µLPC script results.

o ismap.lpc: Spinner now has full built-in support for both NCSA and
  CERN imagemaps (and the Spinner format as well, ofcourse). This
  means that you can use your old imagemaps. All you have to change is
  the path to the file. Notice that you can mix the syntax of the
  three formats if you want to. The module is also using the global
  cache system now.

o cgi.lpc: Zero length PATH_INFO and PATH_TRANSLATED was sent to
  CGI-scripts. Now they are unset.

o µLPC scripts which failed to compile/run returned incorrect
  information. Fixed.

o Serious BUG in exece(): If Spinner failed to execute a script, the 
  forked copy would be left, still answering queries.

o Bug in mainconfig.lpc: If the module did not have a start() function, 
  an error was reported.

o Prestate should now work through a CERN proxy. This should make it
  possible to configure Spinner through one.

o Languages are now handled more cleanly. See the files is languages/
  for examples.

o New tag inside <if ...> and <elif ...>: <otherwise>. 

  Usage:

  <if prestate=foo>
  Hi!
  <otherwise>
  <if prestate=bar>
    Fnord!
  </if>
  </if>

   The parsing of <otherwise> is not all that smart, so you _cannot_ do this:

   <if prestate=a>
     a is set
     <if prestate=b>
       and b to.
       <otherwise>
       but not b.
     </if>
   </if>


o There is now an <elif> (or <elseif>) tag in the html parse module. 
  The syntax is as for if.

  Usage:
   
  <if prestate=en>
    English text...
  </if>
  <elif prestate=za>
   ....
  </elif>

  It is still not really possible to do

  <if a></if>
  <elseif b></elseif>
  <elseif c></elseif>
  <else></else>

  This is also because of the parser.

  You have to be more ingenious to acomplish that sort of expressions,
  and the complexity grows with the square of the number of tests to do.

o New logging field: $user -- The decoded user name (for secure file
  systems) or '-'.

o New global variable: Configuration interface URL.
  Set this if you want the redirects given by the configuration
  interface to go to a host name instead of an IP-number.

  Quite useful when using a Proxy.

o New global variable: Honor If-Modified-Since headers
  Use it to toggle the parsing of the If-modified header, 
  which is causing problems for some users. The default is 'off'. You
  want this to be 'on' if you are using a modem while developing
  pages on a remote spinner server.

o New variable in servers: No Logging for. 
  All hosts matching the patterns will _not_ be logged in the log.

o New variable in the cgi module: Pass unparsed authority info.
  
o Security variables renamed so that they are easier to spot, and that
  obnoxious error in the configuration documentation regarding
  'Priority' is fixed.


Changes since beta 7:
---------------------

o New tag: <smallcaps size=X>Flerp</smallcaps>

o #include <foo> is now possible in both the extention list in the
  extention module, and in the client supports regexp list in the
  global variables section.

o The gopher proxy now have a location.

o Directory parsing moved from the filesystem modules to a special module.

  This has a few advantages:
  o Mountpoints are now visible in the directory lists

  o If you, as an example, have two modules mounted on the same spot, the
    files from both will be visible in the list.

  o It is now possible to later on add hooks in the directory list, to perhaps
    filter out some files, and add others.

  o It is easier to write a new directory list generator, and a new location
    module will automatically get directory list support, unless you 
    disable it.

o New module: directory parsing module.
 
  The only one available currently implements a macintosh like 
  'fold-n-unfold' directory tree.

   At the moment, the folded and unfolded state is kept in a global
   tree, so you might notice some quite strange effects when more than
   one person is using the list at any given time. :-)

o New module: secure filesystem
  This filesystem implements some more security than the normal one. This is 
  slightly slower than the normal filesystem, and should therefore only be used
  when needed (ofcourse it's still fast enough for any normal WWW server).

o The proxy module now has support for remote proxies.
  It use a "regexp host port" list. If the regexp match, a connection
  will be made to the host, using port port, and a HTTP proxy request will
  be sent.

o Module level security verified and optimized, and moved to the main
  module calling loop in spinner, from the filter function in the
  configuration objects. If this does not tell you anything, don't
  worry, be happy.

  This means that:
   o Security is now blocking. 
   o Modules that need passwords will now request them.
   o <insert file=...> will not bypass the security.
  
o setgid() is now done _before_ setuid().
  Before, the group was never set to anything, so it stayed the 
  same as that of root.

o Bug fixed in cern_http_date (http.lpc). " 2/Jan/1995..." -> "02/Jan/1995...".

o Another bug fixed in ismap module - if the mapfile was longer than
  10000k, only the first part would be parsed.

o Fixes in <apre> to fix <apre href=""> and <apre
  href=XXXX://>. <apre> now works as it should; like <a>.

o PATH_TRANSLATED and SCRIPT_NAME fixed in CGI-support. HTTP_REFERER added.
  CGI-scripts now runs in the directory they are in and not /tmp and the 
  current working directory is changed to the correct one (ie to the home
  of the CGI-script).

o The code behind the configuration interface rewritten quite a
  lot. This should _hopefully_ not be noticed at all :)

o New variable added to the CGI module. 'Pass all environment variables'. 
  Will do exactly that when set.

o Bug fixed in ismap-module. the type 'point' didn't work before.

o Typo fixed in the help for the user filesystem, and a few more users
  added to the default 'banish' list.

o New logging option added: $user_agent

o <signature> now works as it should (with all the attributes of <user>).

o <if date> didn't work before. Fixed.

o Requests for image files in the configuration interface without any
  file name (That is, the url http://configure.url/image/) does not
  return an error any more, but the text 'Nope.'.

o FTP-proxy now working.

Changes since beta 6 second release:
-----------------------------------

o Now changes are kept even if you add a new module before saving the
  old configuration. They were before to, but not the 'changed' flag.

o Spinner now compiles on FreeBSD, BUT crypt() is not ported yet for
  systems running with DES encryption. Therefore user validation will
  only work with clear-text passwords.
 
  We will work with this problem, and hope that the next release will
  have support for crypt() in FreeBSD as well.

o The bin/domainname and bin/hostname scripts should now be more
  portable, I hope.

o The value of the variable is now printed after the variable, for all
  variablee types but password, colors and text fields.

  The only type used right now that is not printed is the text field
  type.

o All variables can now be 'focused' on. Mostly because I wanted the
  value of the variable to be more separated from the variable name.

o A 'Add module' button added when focus is a module with copies. This
  button will add a new copy of that module. Useful as a shortcut to
  'Add module' -> Select type.

o The 'Remove module copy' button will now remove the module copy :)

o A shutdown button added to the main configuration interface. This
  will simply shut the server down.

o CGI PATH-INFO support added.

o Logging can now be done in almost any format, for any server, and
  differently for each response code.

o The install script asks you if the ip-number was correct.

o The logfiles are now in the Common Log format.
  
o New version of µLPC. Now Spinner will run on 64 bits computers
  (i.e. Alpha) as well as 32 bit. In theory, Spinner will also run on
  n bit computers, where n is an integer number bigger than or equal to
  32 that can be moduloed with the size of a byte on the given
  architecture, with zero as a result. 
  A byte can be any number of bits greater than 0.
 
o Makefiles in extern/ and root remade to make it possible to compile
  in another directory. Also made a configure-file in the spinner-root
  directory. To compile µLPC from source, do 'configure' followed by
  'make' and 'make install'.

o Each module can now have a priority. 

  Infact, this has been there for quite a while, but it has not been
  possible to configure it before.

  Modules with higher priority are tried before others. This is
  useful when you 'mount' multiple modules on the same spot, or have,
  as an example, more than one imagemap module.


o Now there is security on a per module basis.
  Each module has a few new variables:

  Password and username needed 
    To access this module, the user will have to have
     entered a valid username and password, from the user data base
     module.

  Allow
    Hosts whose IP number match any of the patterns in this comma
    separated list will be allowed access.

  Deny
    Hosts whose IP number match any of the patterns in this comma
    separated list will be denied access, even if their IP numbers
    match any of the Allow patterns.

o Foo.bar.tar.gz was sent with content-endoding gzip, and content type
  from 'bar', not 'tar'. Fixed. 
   Spinner.1.b6.tar.gz would be
    _____________________________
   |
   Content-encoding: gzip
   Content-type: text/plain
   |_____________________________

   if there is no type for 'b6', and the default type is
   'application/text' (the default)

o The password and username in the configuration interface can now be
  changed only from the initial screen, since a few users messed them
  up by writing into the variables in the 'Global variables' section
  (there is no 'write again to verify' option there.). If you really
  want to change them, it can be done by accessing
  http://your.config.url:port/(changepass)/
  There will be a button for this action in the future..


Changes since beta 6 first release:
-----------------------------------

o Now error messages from the configuration interface will be sent to
  the client.

o Decoding of username/password sent from client is now _100%_
  functional, I hope. It wasn't before :)


Changes since beta 5.1:
-----------------------

o New tag: <version>. Inserts the version of Spinner. Used in the
  default error message.

o Decoding of username/password sent from client is now 100%
  functional, I hope.

o REMOTE_HOST in the cgi module is correct nowdays, that is, it is the
  hostname if it is available. Otherwise it is the ip-number.

  This fix was not in the CGI module, but in the quick_ip_to_hostname
  function used almost everywhere. (which would return the ipnumber of
  the hostname it was quite sure was given to it, and not the hostname
  of the ipnumber that actually was given.)

o method=POST handled in the same way as method=GET.
  That is, in the cgi module you get QUERY_foo environment variables,
  and the modules have the got->variables->foo data available.

o The error log in the configuration interface now only log identical
  error messages once. Instead, it keeps a nice little counter for how
  many times each message have occured.. :)

o Bug fixed that made automatic generated directories transfer in full
  only if you have a very fast connection to the server.

  This might need some explanation.
  When spinner is about to send a file, it does (more or less) this:

  if(structure->len < 4096)
  {
    clientpointer->write(structure->data);
    clientpointer->close("rw");
    return;
  }
   ... set things nonblocking and go on in the general cheerful way of
   spiders...

  This work because the socket buffers are 4Kb.. :)
  
  But, for directories, the len was set to -2, no matter how long the
  actual data is. This is now fixed.

o proxy.lpc, gopher.lpc and relay.lpc was fixed so that they set the
  mode of the connection to pipe_in_progress. Now spinner will leave the
  socket alone, and not try to close it due to timeouts.

Changes since beta 5.0:
-----------------------

o µLPC compiled without debug. 20% faster overall performance.

o Performance tuned in the main server program.
  170% faster for files under 4Kb of length, and some 30% faster for
  large files. Medium sized files are not sent all that much faster,
  though (some 5% or so)..

o The redirector module can now set it's priority so that it will
  redirect everything that match the regexps to redirect, even if there
  is a file present with the required name.

o Unknown clients and headers are no longer logged to the log you can
  view from the configuration interface. They are instead just stored in
  the Debug.X logs in the logs directory.

o A small misfeature fixed in ismap.lpc
  I think that absolute redirects (That is, the URL in the mapfile is
  absolute) did not work before, and I can't realize how it can have
  worked at any time.

o One or two bugs fixed in cgi.lpc.

o New variable added to the global variables: NumAccept.
  If your system supports nonblocking accept in full (The only system
  we have found so far that doesent is AIX), setting this variable to
  something around 4 will make the server <i>feel</i> much faster for
  Netscape users, since all their requests will be accepted
  immediately. The data is not <i>really</i> sent faster, though, but
  for document with many inlined images, all images will begin to load
  more or less at once. For some reason, this feels faster.

  Setting this variable to something really high is not all that smart
  if you have multiple virtual servers, though, since if there is 100
  incoming requests on the first server, and 4 on the other, and the
  first servers responds first, NumAccept requests from that queue 
  will be accepted before the first is accepted from the second one.


Changes since (unofficial) beta 4:
----------------------------------

o .. and now the new configuration interface makes it possible to
  configure everything that was added before.

o A _lot_ of debugging done in the µLPC driver, using Purify and PureCoverage.
  Atleast twenty serious bugs, and ten memory leaks fixed.

o A lot of documentation written. Much more is needed, especially
  programming documentation.

o Bug fixed in the modules/cgi.lpc module, which made it impossible to
  use METHOD=POST in forms.
  
  METHOD=POST is still not handled perfectly, but it works better now...

o Bug fixed in proxy, which would sometimes cause spinner to panic,
  due to the fact that the pipe object was destructed when it already
  was self destructing.

  Another bug, which made URLs like http://www.info.com:80 illegal fixed.
  (That is, no filename, but portnumber and hostname)

o The changelog was accidentally deleted, so this is from memory only.


Changes since beta 3:
---------------------

o Multiple configurations per spinner is now possible. At the moment,
  there is no handy way to configure the configurations, simply use 
  cp configurations/<whaterver> configurations/<newconfname>
  and then edit configurations/<newconfname> a little... Example:
   
  At the moment, the file configurations/default is the only
  configuration, it should be named configurations/infovav instead,
  and a new configuration should be created, named
  configurations/testing. Testing should be using port 7500 instead of
  80.

  In a shell:

  cd configurations
  mv default infovav
  sed 's/^Port={80}$/Port={7500}/' < infovav > testing
  
  'Restart' spinner with the 'Kill' button in the info page
   /configure/(module=spider)
   
o The configuration parsing cache and the hostname lookup cache moved
  to the new `standard' cache.

o <i>Some</i> more documentation...

o Fixed the bin/{domain,host}name scripts.

o Even more debug info added to the spinner main module info page...

o New module: whois++ 
  Whois++ client.
  Coded by Pontus Hagström, law@lysator.liu.se

o New program in extern/, proxygarb, removes old files in the proxy
  cache when it (the cache) gets to large.  
  Coded by Pontus Hagström, law@lysator.liu.se

o Proxy garbage collector added to modules/proxy.lpc.

o FTP proxy added to the modules. (modules/ftpproxy.lpc)
  This one does not use the persistand disk cache yet.
  Coded by Pontus Hagström, law@lysator.liu.se

o New tags in the htmlparsing module: <prestate> and <apre>.
  See the documentation for more info.

o µLPC scripts, that is, *.ulpc files in the virtual filesystem, will
  now be reloaded if they encounter an error, or if the user press
  'reload'. The latter can be avoided by putting a 

    int no_reload(mapping id)
    {
     if(id["got"]["remote_addr"] != "your_ip_addr")
       return 1;
    }

  in the script. That might make it hard to update the script yourself,
  though..

o Memory leak (all headers sent to clients leaked) plugged in the µLPC driver.
  The bug was in ulpc/src/mapping.c::merge_mappings(). Same bug fixed in 
  list.c.  Another memory leak fixed in array.c.

o The problem with compiling ulpc/src/modules/spider/spider.c on SunOS 4
  (and possibly other BSD-ish systems) should now be fixed. 

o Stardate date support added 
  <date type=stardate>

o Discordian date support added to the HTML parser.
  <data type=disc>

o (much) More debug added to the spinner main module info page.

o The HTML parser (in ulpc/src/modules/spider.c) can now handle
  <foo bar="<hej=foo>">.

o Bug in spider.lpc, that would make the raw source of the page appear at
  times, instead of a HTML page. The type was set incorrectly to text/plain.

o Grammatic 'bug' in the results of the different date displaying functions.
  Somewhat better nowdays...

o Cache added to the parsing of the configuration file.

o Initial Server Location was set to 
  'http://hostname.domainname.domainname[:port]/' if the
  hostname included the domainname. Fixed.

Changes since beta 2:
---------------------

o The 'server/bin/ulpc'-link was incorrect.

o Configure script in 'extern/'. Now it should compile without manual
  assistance.  

o fatal() was undefined on IRIX 4.0.5 (in extern/selfdir.c). Fixed.

o Default colors in the configuration was changed from black text on
  black background. 

o HTML parse module added to the default module list.

o Local filename redirect fixed in ismap.lpc.

o The Void (TM) now shown instead of the map-file, if there is no
  matching action.

o discordian date added (ie <modified type=discordian>).


----------------------
Changes since beta 1:

o In beta 1, if you reload a module that cannot have copies from disk, 
  and then refresh the copy currently in memory, the server will fail to do 
  so. This is fixed in beta 2.

o In beta 1, the depend target in the makefile is not possible to do.
  The dependencies is supposed to be worked out in advance. This should 
  be fixed in beta 2, I hope.

o To make the compilation of the server easier, do 
  rm -rf ulpc/src/modules/image
  or replace all occurences of math with image in the configure file and 
  the Makefile in that directory. This will be fixed in beta 2.

o The function short_date2 in language.lpc fails to generate correct 
  dates. Currently, it says "13 of May" when it is supposed to say 
  "May 13th" or "13th of May", this will be fixed in beta 3.

o In the lpcscript module (in beta 2) the 'unload lpc script' feature 
  does not work. If you use the module, and want to refresh a script, 
  refresh the whole module, as this will force reload of all scripts.

o In the html parsing module, <accessed file=FILE>, FILE could not be 
  relative to the directory of the file in which the tag was present, it 
  can in BETA 2. Same goes for <insert file=FILE>. 

o In beta 2, there is now a check for failed write() to a host name 
  lookup process. There was a possibility for infinitive loops there.

o In beta 2, I fixed a layout problem with the tables, and fixed a bug in 
  the error reporting system, which in turn should be used more...

o Log file may now be stderr or stdout as well as a file, just type in
  "stdout" or "stderr"

o Initial Server Location set to 'http://hostname.domainname[:port]/' Was 
  'hostname.domainnameport'

o Changed some of the default settings, and added some more
  documentation in the setvars() commands.

o In modules/configure.lpc: Table code cleaned, new variable added: More 
  options (advanced), adds a reload from file and a refresh icon for 
  module developers, mainly (and for me, ofcourse...)
