Wed Dec  4 1996   Gisle Aas <>

 o  Release 5.05

 o  LWP::UserAgent::simple_request: local($SIG{__DIE__}) protects us
    against user defined die handlers.
 o  Use Net::Domain (instead of Sys::Hostname) to determine FQDN.  It
    is used by URI::URL when it determines anonymous ftp login address.
 o  lwp-download: New program in the bin directory

 o  HTML::Parser: Allow '_' in attribute names.  This makes it possible
    to parse Netscape's bookmarks.html file.

 o  HTTP::Daemon: Fixed chunked transfer encoding and multipart content
    in get_request().  Support HTTP/0.9 clients.

 o  Don't clobber regex variables when HTTP::Message delegates methods
    to the header.

 o  Base64::decode_base64 now checks that the length input string to
    decode is a multiple of 4.

 o  t/robot/rules-dbm.t clean up better and will use AnyDBM for dumping

 o  File::CounterFile: $/ strikes again by Andreas K├Ânig

 o  File::Listing updates from William York <>. We
    can now parse the MS-Windows ftp server listings.

 o  HTTP::Date now supports the MS-Windows 'dir' date format.  Patch by
    William York.

 o  LWP::MediaTypes::media_suffix will return first type in scalar context.

Tue Oct 22 1996   Gisle Aas <>

 o  Release 5.04

 o  Added HTTP::Daemon.  This is a HTTP/1.1 server class.  This means
    that libwww-perl no longer is a client library only.  The HTTP::Daemon
    is also used in the new test suite.

 o  HTTP::Message support the protocol() method.  Used by HTTP::Daemon.

 o  HTTP::Response can be constructed with a header and content as

 o  Typo corrections in the documentation.

 o  File::Listing::parse_dir accepts "GMT" as timezone now.

 o  HTML::Parser will call the start() method with two new parameters;
    $attrseq, $origtext.

 o  Integrated HTML::FormatPS patches from
    Jim Stern <>

 o  Class modules don't inherit from AutoLoader any more.  They just
    import the AUTOLOAD method.

 o  LWP::Protocol will untaints scheme before loading protocol module.

 o  Digest does not send "opaque" if it was not present in the request.
    The "Extension" header is not returned any more.

 o  New method: $url->crack that will return a list of the various
    elements in a URI::URL.

 o  WWW::RobotRules did not use the agent() method when determining
    who we are.  This affected WWW::RobotRules::AnyDBM_File parsing
    for robots.txt.  Visit count did not increment for

Tue Oct  1 1996   Gisle Aas <>

 o  Release 5.03

 o  Hakan Ardo's persistent robot rules is now part of the standard
    distribution.  This is still experimental and might change in the
    future.  It includes the new WWW::RobotRules::AnyDBM_File class
    and updates to LWP::RobotUA.

 o  HTML::Parser now supports buggy Netscape comment parsing.  Enable
    it by calling $p->netscape_buggy_comment(1).  The previous version
    of the parser could also (under very unlucky and unlikely
    circumstances) call the $self->comment() method several times for
    the same comment text.

 o  HTML::Parser: Use new $p->eof to signal end of document instead of

 o  HTML::Element::starttag() is now smarter about which quotes it
    use around attribute values.

 o  New HTTP::Response methods: current_age(), freshness_lifetime(),
    is_fresh(), fresh_until().

 o  HTTP::Message:  New method ($mess->content_ref) which will return
    a reference to the current content.

 o  URI::URL:  New method ($url->rel) which does the opposite of abs().
    Example: url("http://host/a/b/c", "http://host/c/d/e")->rel would
    return url("../../a/b/c", "http://host/c/d/e").  This was
    suggested by Nicolai Langfeldt <>

 o  URI::URL:  $url->query_form can now take array references as value
    specification.  For instance: $url->query_form(foo => ['bar', 'baz']

 o  Avoid '"my" variable $var masks earlier declaration in same scope'
    warnings in perl5.003_05.

Wed Sep 11 1996   Gisle Aas <>

 o  Release 5.02

 o  lwp-rget:  Initialize proxy settings from envirionment

 o  HTML::Entities::encode_entities: Don't encode $ and %

 o  HTML::LinkExtor::links: Now works when no links were found.

 o  HTTP::Headers::as_string: Allow \n in header value

Tue Aug  1 1996   Gisle Aas <>

 o  Release 5.01.

 o  Updated ftp protocol module to be compatible with Net::FTP 
    version 2.00 (the version found in libnet-1.00)

 o  New HTML parser module called HTML::LinkExtor

 o  Various documentation typo corrections.  Most of these contributed
    by Bob Dalgleish.

 o  HTML::HeadParser updates 'Content-Base' instead of 'Base'.  It also
    updates the 'Link' header based on <link ...>

 o  HTTP::Headers and HTTP::Status updated according to

 o  HTTP::Headers can now use "_" as alternative to "-" in field names.

 o  HTTP::Response::base now looks for 'Content-Base',
    'Content-Location' and 'Base' headers.

 o  Avoid warning in LWP::MediaTypes if $ENV{HOME} is not defined.

 o  The new $ua->parse_head() method can be used to turn off
    automatic initialization of response headers from the <HEAD>
    section of HTML documents.

 o  Added eq() method for URI::URL objects

 o  The HTML::Formatter recovers even if a handle method is not defined
    for all tags found during traversal

Sun May 26 1996   Gisle Aas <>

 o  Release 5.00.

 o  LWP::Simple::head() now return something useful in scalar context.

 o  Rewritten the HTML::Parse stuff.  Introduced the HTML::Parser class
    that will tokenize a HTML document.  The rest of the old
    HTML::Parse functionality has moved to HTML::TreeBuilder class.
    Note, that the HTML stuff is still alpha.

 o  Implemented HTML::HeadParser.  This is a lightweight parser for
    the <HEAD> section of a HTML document.

 o  HTML::Element had problem with presenting things like <foo

 o  HTML::Entities: Included additional ISO-8859/1 entities listed in

 o  HTML::AsSubs exported 'header' instead of 'head'

 o  We know about a few more of the HTML 3.2 element.

 o  HTTP::Date had problems with years before 1970, because Time::Local
    went into an infinite loop.  Check for this.

 o  Added $header->title method.

 o  Made $header->authorization_basic return "uname:passwd" in scalar

 o  LWP::Protocol::collect() will let the HTML::HeadParser look at the
    document content as it arrives.  This will initialize headers from
    elements like <base href="...">, <title>...</title> and <meta
    http-equiv="..." ...>.

 o  Simplified $response->base implementation, because we don't have
    to look into the content any more.

 o  Added -quiet option to lwp-rget

 o  Typo fixes and some documentation additions.

Thu May  9 1996   Gisle Aas <>

 o  Release 5b13

 o  Made URI::URL::strict(0) the default.  I got tired of all this
    eval { } stuff just to recover.  The URI::URL::strict'ness also
    determine if calling some standard method that happens to be
    illegal for some protocol scheme will croak or just be ignored.

    at places where we <> or print.

 o  Always localize $_ before any 'while(<FILE>) {}'-loops

 o  Implemented $protocol->collect_once() and simplified several
    of the protocol implementations by using it.

 o  The HTML parser used to get it wrong if you were unlucky about the
    breakup of the text. An example of broken behaviour was this:

        $html = parse_html "<!-- A comment -";
        $html = parse_html "-> and some text.";

 o  The HTML parser does not ignore whitespace-only text any more.

 o  HTML::Parse warnings are now optional and turned off by default.

 o  New start for $html->as_HTML().

 o  Fixed some typos

Wed Apr 24 1996   Gisle Aas <>

 o  Release 5b12

 o  New utility program called 'lwp-rget'.

 o  $response->base was broken for HTML documents

 o  New fancy LWP::Debug import() method.  Can now turn on debugging with
    "use LWP::Debug '+';"

 o  Trap exceptions (die) from the response callback routine

 o  The RobotUA now requires an e-mail address of the person reponsible
    for the robot.

 o  New $ua->from() method.

 o  Support for gopher Index-Search (gopher type '7' requests).
    Contributed by Harry Bochner <>

 o  Cleaned up white-space usage in the source.

Wed Apr  3 1996   Gisle Aas <>

 o  Release 5b11

 o  Implemented a NNTP protocol module.  The library can now fetch and
    post news articles.

 o  More documentation

 o  Don't look at the URI header for redirects

 o  New $res->base() method for HTTP::Responses

 o  Graham Barr's patch to File::Listing to make it more OO internally

 o  content_type() return value is canonicalized

 o  $ua->request() does not die on bad URLs any more

 o  LWP::MediaTypes merge all media.types files that if finds

 o  FTP request with content to file or callback did not work

 o  The value of HTTP Host: header is now $url->netloc;

 o  The URI::URL constructor now accept URLs wrapped up in "<>"

 o  $url->abs() now has a second optional argument that makes it accept
    that relative URLs can have scheme, i.e. treat "http:img.gif" as a
    relative URL.

 o  Added prototypes to the HTTP::Status::is_xxx() functions

 o  Added prototypes to the MIME:: encoding/decoding functions

 o  Always return scheme for mailto and news URLs (as_string)

 o  RobotRules patches from Henry A Rowley.

 o  More tests

 o  <SMALL> and <BIG> again

Thu Mar 14 1996   Gisle Aas <>

 o  Release 5b10

 o  GET ftp://host/doc was never successful for normal files.

 o  LWP::Socket: read_until() did not notice EOF condidtion.  I.e. if
    a HTTP server closed the connection before any output was generated,
    the we continued to read 0 bytes in a busy loop until the alarm()
    killed us.

 o  Added support for Digest Access Authentication.  Contributed by
    Doug MacEachern <>.

 o  Makefile.PL: check for MD5 library

 o  No longer print message content in HTTP::Response::error_as_HTML()

 o  Access to "file:/path" gave warning when the envirionment variable
    no_proxy was set.

 o  The http-post test sends a Content-Type header.  Some servers hang
    if this header is missing.

 o  HTML::Parse:
     -   allow <SMALL> and <BIG> tags
     -   allow empty attribute values

Tue Mar  5 1996   Gisle Aas <>

 o  Release 5b9

 o  Started to write on the libwww-perl cookbook (lwpcook.pod)

 o  The URI::URL module now exports the function url().  This is an
    alternative (easy to use) constructor function.

 o  Expanding relative file URLs starting with "#" did not work.

 o  Fixed autoloaded DESTROY problem by adding empty DESTROY routine
    to URI::URL.

 o  Does not try generate password for ftp-URLs unless the username is
    "anonymous" or "ftp"

 o  The LWP::Simple user agent proxy settings are intialized from
    the proxy environment variables. 

 o  LWP::Protocol::ftp: Use the Net::FTP library to access ftp servers.
    Convert directories to HTML on request (Accept: text/html).

 o  New module HTTP::Negotiate

 o  New module File::Listing

 o  HTTP::Date::str2time can parse a few more formats, like the 'ls -l'
    format and ISO 8601.  The function now also takes an optional second
    parameter which specify a default time zone.

 o  Added prototypes to the HTTP::Date functions.

 o  The library adds a timestamp to responses ("Client-Date")

 o  HTTP::Status:  Updated to proposed HTTP/1.1

 o  HTTP::Headers: Updated to proposed HTTP/1.1

 o  LWP::Protocol::http:  Updated to HTTP/1.1 methods

 o  Took out stringify overloading in HTML::Element.

Mon Feb 26 1996   Gisle Aas <>

 o  Release 5b8

 o  Renamed functions using thisStyleOfNames to this_style_of_names.
    Provided a script called 'update_from_5b7'

 o  Renamed the 'request' and 'mirror' scripts to 'lwp-request' and
    'lwp-mirror'.  The GET, POST, HEAD aliases for 'lwp-request' are
    the same.

 o  Implemented LWP::RobotUA

 o  Class name for RobotRules did not match the file name

 o  URI::URL
      - perl5.002gamma is required (because use vars).
      - The leading slash in now part of the path if it is present.
      - More documentation
      - Use AutoLoader to speed things up.
      - New class URI::URL::_login and made telnet, rlogin, tn3270
        subclasses from this one.
      - URI::URL::wais is better supported.
      - URI::URL::news is better supported.
      - New URI::URL::mailto methods: user/host

 o  HTTP::Date::time2str now works correctly with '0' as argument

 o  HTTP::Message delegates unknown methods to the headers.

 o  HTTP::Request::uri is an alias for HTTP::Request::url.  Can set
    the URL to undef.

 o  Added convenience methods to HTTP::Headers for easy access to
    frequently used headers.

 o  Simplified LWP::Debug

 o  Use standard AutoLoader for LWP::IO functions.

 o  Played with the profiler (Devel::DProf) and made some things
    go quicker.

 o  Included the File::CounterFile module.  Excluded Mail::Cap module
    as it is also part of the MailTools package.

Mon Feb  5 1996   Gisle Aas <>

 o  Release 5b7

 o  Perl5.002 is required now

 o  Rewrite of the URI::URL module (version 4.00)
      - escaping/unsafe stuff redone (and removed)
      - URI::URL::_generic moved out of
      - netloc, path, params, query is now stored internally in escaped form
      - new methods for URI::URL::_generic are:
      - new methods for URI::URL::http are:
      - new methods for URI::URL::file are:

 o  URI::Escape now semi-compile regular expressions (by evaling an
    anonymous sub).  Same techinque is also used in HTML::Entities.

 o  HTTP::Date parser rewritten using regular expressions.

 o  HTTP::Headers->as_string() now croaks if any field values
    contain newline.

 o  HTTP::Status constants use empty prototype.

 o  Font metrics moved to a new subdirectory (lib/Font/Metrics)

 o  Don't use the VERSION script any more (even if it was very clever)

 o  HTML::Entities will now export the names decode_entities() and

 o  Andreas Koenig's black patch to HTML::Element.

 o  The HTML::Formatter now knows about <menu> and <dir> tags

 o  The construct "defined ref($arg)" did not work on perl5.002
    becase ref now always return something defined.

 o  LWP::UserAgent sends by default an 'User-Agent' header.

 o  LWP::Simple sends 'User-Agent' header to servers.

 o  Updated the LWP::Socket module to use the new interface.

 o  LWP::Protocol::http sends the new HTTP/1.1 'Host' header.

 o  LWP::Protocol::file use $url->local_path to get a file to open.
    It also inserts a <BASE> tag in directories instead of a redirect.

 o  MIME::Base64 routines can be called as MIME::Base64::encode() and
    MIME::Base64::decode().  Same kind of thing for QuotedPrint.

Mon Nov  6 1995   Gisle Aas <>

 o  Release 5b6

 o  Installation should work better for those that still runs
    perl4 as 'perl'.  The mirror script is not installed by

 o  LWP::Socket::_getaddress() Numerical IP adresses did not work.

 o  LWP::Socket::pushback() did not work.  This also avoids the bad
    pp_select() core dump from perl.

 o  LWP::IO now also selects on socket exceptions.

 o  HTML::Parse:  Ignore <!DOCTYPE ...> regardless for case.  Some
    bad insertElement() calls made infinite loops.

 o  The uri.t test works better for places where /tmp is a sym-link.

Sat Sep 16 1995   Gisle Aas <>

 o  Release 5b5

 o  newlocal URI::URL does not put "//localhost" into the URLs any

 o  The request program: New -o option to reformat the HTML code
    New -C option to provide credentials on the command line.
    The -b option never worked.

 o  LWP::Protocol::file now returns redirect for access to directories
    where the trailing slash is missing.

Thu Sep 14 1995   Gisle Aas <>

 o  Speedups and bug fixes in the HTML parser.  The parser now
    understands some more depreciated tags (like <xmp> and <listing>).

 o  HTML::Elements are now stingified using perl overloading.
    The interface to the traverse() callback has changed.

 o  Implemented HTML formatters for plain text and Postscript.

 o  Added lib/Font stuff to support the Postscript formatter.

 o  Inspired by Tim Bunce, I implemented the HTML::AsSubs module.
    Don't know if it is really useful.

 o  The local/get test does not use /etc/passwd any more.

Thu Sep  7 1995   Gisle Aas <>

 o  Changed package name to libwww-perl-5xx

 o  Made LWP::Protocol::ftp actually transfer data

 o  Implemented methods for LWP::Socket to act as a server:
    bind(), listen(), accept(), getsockname(), host(), port()

Wed Sep  6 1995   Gisle Aas <>

 o  Release 0.04

 o  Implemented modules to parse HTML.

Mon Sep  4 1995   Gisle Aas <>

 o  Implemented Mail::Cap which will become part of the MailTools

 o  Moved Base64 to MIME::Base64.  Reimplemented MIME::Base64 by using
    [un]pack("u",...)   Implemented LWP::MIME::QuotedPrint for
    completness sake.  Routine names has changed as suggested by Tim

 o  LWP::MediaType reads default types from media.types file.
    guessMediaType() now also returns encodings.  New function mediaSuffix()

 o  Pass $url to $ua->getBasicCredentials().  This also fixes security
    hole with the old implementation of getBasicCredentials().

 o  LWP::Protocol::file now sets Content-Encoding headers

 o  Allow request content to be provided by a callback routine.

 o  Fix bug that prevented response callback to work.  The first parameter
    (data) is no longer a reference, because $_[0] is already a reference.
    Don't callback unless successful response.  Callbacks during redirects
    was confusing.

 o  URI::URL.  Remove port from netloc if it is the default port.
    Don't use anything, just require.

 o  HTTP::Message->addContent() does not need a reference parameter.

 o  LWP::Socket->open() has been renamed top LWP::Socket->connect()
    LWP::Socket->close has gone.  Implemented new method LWP::Socket->read()
    that returns as fast as it has some data to offer.  Implemented

 o  Does not die in LWP::UserAgent->request()

 o  LWP::Socket now use LWP::IO for low level IO

 o  Implemented LWP::TkIO as a replacement module for LWP::IO when using Tk.

Thu Aug 17 1995   Gisle Aas <>

 o  $ua->redirectOK() for checking redirects

 o  reorganized tests in the "t" directory.

Fri Aug 11 1995   Gisle Aas <>

 o  Release 0.03

 o  Included from Martijn Koster

Thu Aug 10 1995   Gisle Aas <>

 o  New module URI::Escape (URI::URL use this module for default
    escaping) that provide the uri_escape() and uri_unescape()

 o  Setting $url->scheme now changes the class of the object.

 o  Made $httpurl->user() and $httpurl->password() illegal.
    Likewise for other URL schemes.

Wed Aug  9 1995   Gisle Aas <>

 o  Reorganisation as discussed on <>
       LWP::Date       --> HTTP::Date
       LWP::MIMEheader --> HTTP::Headers
       LWP::StatusCode --> HTTP::Status
       LWP::Message    --> HTTP::Message
       LWP::Request    --> HTTP::Request
       LWP::Response   --> HTTP::Response
       LWP::MIMEtypes  --> LWP::MediaTypes

 o  HTTP::Date parses ctime format with missing timezone as suggested
    by Roy Fielding <>

 o  HTTP::Status and LWP::MediaTypes exports their functions by default.

 o  Splitted up the URI::URL module.  Schemes are implemented by separate
    files that are autoloaded when used.  Self test moved to "t/uri.t".

Mon Aug  7 1995   Gisle Aas <>

 o  Applied patch from Marc Hedlund <>
       - Update the @header_order according to the August 3rd draft.
       - Added Response Header fields: 'Location', 'Public', 'Retry-After',
         'Server', and 'WWW-Authenticate'.
       - Moved 'unknown header' handling from &scan to &header. The old
         implementation was forcing all unknown header-words to begin with
	 an uppercase (as it should be), but disallowed other uppercase
       - updates the status code messages under the August
         3rd HTTP/1.0 draft.  '203' became 'Non-Authoritative Information',
	 '303' became 'See Other', and a new code,
	 '411 Authorization Refused', was added.

 o  Can remove multiple headers with single removeHeader() call in MIMEheader.

 o  Can assign multiple field/value pairs in header() method of MIMEheader.

 o  A field with multiple values is printed as separate values in

 o  LWP::Response contain new attributes: previous() and request().  These
    attributes are updated by the UserAgent.

 o  Appended \n to some die statements in Socket so that line numbers are
    suppressed in error messages.

 o  Made UserAgent::clone work for reference members

 o  Check for redirect loops and multiple authorization failures by
    examination of the response chain.

 o  Use "\015\012" instead of "\r\n" in protocol modules.  Some systems
    define \r and \n differently.

 o  request program can now handle documents that needs autorization by
    prompting the user for username/password. Added new -S option to print
    request/response chain.

Tue Jul 25 1995   Gisle Aas <>

 o  Release 0.02

 o  Included URI::URL in the release

Mon Jul 24 1995   Gisle Aas <>

 o  Incorporated Makemake.PL and VERSION from Andreas Koenig <>
    As a result of this the following things have changed:
       - programs in "bin" are extracted from .PL-files
       - reintroduced "lib"
       - "test" has been renamed as "t"
       - test programs in "t" has been made Test::Harness compatible
       - we now have a MANIFEST file
       - no more need fro update_version, make-dist, lwp-install

 o  Renamed bin/get to bin/request.  Links to it are now all upper case.

 o  Proxy support in bin/request (provided by Martijn Koster)

 o  UserAgent can now load proxy settings from environment

 o  LWP::Protocol::ftp is under way but not really finished

Tue Jul 18 1995   Gisle Aas <>

 o  Implemented LWP::Protocol::gopher

 o  Implemented LWP::Protocol::mailto

 o  Fixed proxy typo

Mon Jul 17 1995   Gisle Aas <>

 o  Made release 0.01

Mon Jul 17 1995   Gisle Aas <>

 o  Don't loose first line of HTTP/0.9 requests

 o  LWP::Socket use syswrite() for writing

 o  Added RC_* documentation to LWP::StatusCode

 o  LWP::Date now use hash to look up month numbers

 o  Added -f option to "get"

 o  Untabify

 o  Added a "TODO" list

 o  Fixed various typos

Fri Jul 14 1995   Gisle Aas <>

 o  Reorganized directories.  Moved up.  Moved and
    into the LWP::Protocol direcotory.  Moved LWP out of the lib directory
    and removed lib.

 o  Implemented the "get" and "mirror" scripts in the "bin" directory.

 o  Implemented "install-lwp", "update_version" and "make-dist".  The library
    version number is found in the VERSION file.

 o  Always adds 1900 to the year in LWP::Date

 o  In LWP::MIMEheader:  Implemented clone(), removeHeader() and scan() 
    methods.  Reimplemented asString.  Removed asMIME().  Moved "Good
    Practice" into this file, and reimplemented it.

 o  Moved "header" and "content" into LWP::Message class.  This change made
    LWP::Request and LWP::Response much simpler.  Made clone() method
    actually work.

 o  LWP::Protocol::implementor does not die if it cannot load package.

 o  Moved UserAgent convenience methods into LWP::Simple.  Made LWP::Simple
    export LWP::StatusCode symbols and functions.

 o  Implemented $ua->isProtocolSupported($scheme) method.

 o  Nicer directory listing in

 o  Rely on URI::URL 3.00 behaviour for $url->full_path

 o  Library version number now in  You should be able to say
    "use LWP 1.0;" if you need at least this version.

 o  Various cleanups and arranging layout as I like it.  Use fooBar-style
    (as opposed to foo_bar stype) everywhere.  This means that as_string()
    now is called asString().

 o  Added more documentation.

Wed Jun 14 1995   Gisle Aas <>

 o  Removed lot of rendundant & before function calls.

 o  $this --> $self

 o  &collector passes content as a reference, don't want to copy so much

 o  parameterlist to collect callback has been rearranged

 o  Response::addContent gets a reference to the data

 o  Added some callback documentation to

 o  Protocol::file now uses the collector

 o  Introduced LWP::Simple

Sun Jun 11 1995   Martijn Koster <>

 o  Added basic authentication support

 o  Added mirroring of single documents

 o  Change Protocol construction from whacky (constructor returns
    subclass) to more normal C++'ish way.

Wed June 7 1995   Martijn Koster <>

 o  Minor cleanups from printed code inspection

Wed May 24 1995   Martijn Koster <>

 o  Added redirection resolution

 o  Added optional autoloading of protocols

Tue May 23 1995   Martijn Koster <>

 o  Separated socket stuff into separate module

 o  Added HTTP proxy support

 o  Made alarm handling optional

 o  Added a LWP::Message for completeness sake

 o  Added LWP::MemberMixin to reduce code duplication

 o  Cosmetic changes to LWP::Date

 o  Renamed LWP::Error to LWP::StatusCode

 o  Renamed LWP::MIME to LWP::MIMEtype

 o  Changed the tests to cope with all this

It's getting there...

Mon May 22 1995   Martijn Koster <>

 o  Changed the socket reading to use sysread.  This will have to go
    into a module of its own.

Thu 18 May 1995   Martijn Koster <>

 o  Mentioned on libwww-perl that I had changed the classes around lots.