The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
Revision history for Perl extension Net::Gopher.

1.15 - New license: the GNU LGPL instead of the GNU GPL. Added  a  new  option,
       Handler, to extract_items() to allow a user to process items as  they're
       parsed. Also, the return value of  both  request()  and  extract_items()
       handlers are used as flags to tell those functions  whether  or  not  to
       keep on going or return abruptly. Also added dozens more tests.

1.11 - Simplified the requirements in Makefile.PL and Build.PL.

1.10 - Rewrote get_named_params()  so  it's  significantly  faster,  especially
       with very, very  large  parameter  values.  The  check_params()  routine
       retains  the  old  behavior.  Also,  fixed  the  error   reporting   for
       _find_item_blocks(), and added a test for it.

1.07 - Added dozens of new tests to information_blocks.t,  and  configured  the
       test server to just listen on what ever  ports  the  OS  assigns  to  it
       instead of requesting specific ports.

1.06 - Deprecated  extract_description()  and  is_description()  in  favor   of
       extract_descriptor() and is_descriptor(),  as  well  as  deprecated  the
       internal check_params() function in  favor  of  get_named_params()  (the
       old names still work, though, with an added warning). Cleaned up  new();
       it sets the Net::Gopher::Exception and Net::Gopher::Debugging  variables
       using  their  global  accessor  methods.  Removed  remove_bytes()   from
       Net::Gopher::Utility, as  it's  not  needed  anymore.  Also,  fixed  the
       faulty rounding in extract_views().

1.05 - Net::Gopher::Response::XML is gone, as is the as_xml()  method;  they're
       now distributed separately in their own package.

1.00 - First stable version.

0.98 - *Really*  fixed  the  test  server  this  time,  and  also   fixed   the
       extract_date_*() methods  and  their  corresponding  tests  to  use  the
       Time::Local::timegm()    and    gmtime()    functions     instead     of
       Time::Local::timelocal()  and  localtime().  The  Net::Gopher   internal
       methods _read() and _write() have been renamed  _read_from_socket()  and
       _write_to_socket() to synchronize  them  with  the  forthcoming  C  API.
       Also,  the  request()  method  now  resets  _network_error()  to  ensure
       subsequent calls using the same Net::Gopher  object  don't  inherit  the
       same error, and it now check the return value of IO::Socket::INET  new()
       instead of looking at $@ to determine success or failure.

0.97 - Improved the timeout checking, fixed several  errors  in  the  POD,  and
       fixed the newly added content length checking introduced  in  0.96.  The
       test suite  is  now  also  fixed,  and  should  work   right.   Finally,
       _get_status_line()  was  renamed  _read_status_line(),   _parse_blocks()
       was    renamed    _extract_blocks(),    _parse_error()    was    renamed
       _extract_error(), _parse_attributes() was renamed _extract_attributes(),
       and _parse_attr_timestamp() was  renamed  _extract_attribute_timestamp()
       to synchronize them with the public API.

0.96 - The _data_read() method is gone, long since outliving its usefulness and
       serving only  as  a  redundant  source  of  data  copying.  For  Gopher+
       responses with content lengths, Net::Gopher now makes  sure  the  actual
       length of the content is equal to the alleged content  length  (give  or
       take a single byte), resulting in an error if it isn't. There  are  also
       three new  constants  for  Gopher+  error  codes:  DOES_NOT_EXIST_ERROR,
       TRY_AGAIN_LATER_ERROR,  and  HAS_MOVED_ERROR.  Several   new   debugging
       statements have also been added.

0.95 - Fixed the test server and added some major POD updates.

0.94 - The Net::Gopher::MenuItem accessor methods are now  get/set  instead  of
       just being get. Added the Net::Gopher::Response  has_block()  method  to
       see if a particular block is in the response. Also, You can now  prepend
       dashes to the front of all parameter names and put underscores  in  them
       too.      Finally,      the       test       suite       tests       the
       Net::Gopher::Response::InformationBlock methods much better.

0.93 -

       (1) 
           The information block method attributes_as_hash() has  been  renamed
           get_attributes().

       (2) 
           Added the new information block method get_attribute() that  returns
           a single block attribute, and has_attribute() to check to see  if  a
           block has a particular attribute.

       (3) 
           Added the Net::Gopher::Response get_block()  method  to  retrieve  a
           single block.

       (4) 
           Infromation block methods warn and die much more.

0.92 - (Gone from CPAN?)

       (1) 
           Build.pl: you can  use  Module::Build  to  install  now  instead  of
           MakeMaker.

       (2) 
           A new, much improved, much enhanced test  suite  complete  with  its
           own (almost) functional server.

       (3) 
           Net::Gopher now fully supports  (experimentally)  Unicode.  Selector
           strings,  attributes,  data  blocks--everything--can   now   contain
           multi-byte UTF-8 characters.

       (4) 
           Net::Gopher now dies and warns much, much more and with  much,  much
           more detailed messages (using carp() and croak(), but this  behavior
           can be controlled with the options listed next).

       (5) 
           Named parameters are now case-insensitive.

       (6) 
           The   Net::Gopher   constructor   takes   several   new   arguments:
           WarnHandler, DieHandler, Silent, and LogFile.

       (7) 
           The request() method option "Callback" has been renamed "Handler".

       (8) 
           User-defined response handler subs  for  the  request()  method  now
           receive the following arguments in this order: the  raw,  unmodified
           buffer; the request object; the response object.

       (9) 
           Net::Gopher::Response   has   three   new   methods:   error_code(),
           error_admin(), and error_message() to parse Gopher+ errors.

       (10) 
           The extract_menu_items() method has been renamed extract_items().

       (11) 
           The    extract_administrator()    method    has     been     renamed
           extract_admin(),  and   extract_ask_queries()   has   been   renamed
           extract_queries().

0.90 - First beta release:
       (1) 
           Added     a     new     class     for     menu     items      called
           Net::Gopher::Response::MenuItem  with  methods   to   retrieve   the
           tab-delimited fields of a menu  item,  convert  a  menu  item  to  a
           Gopher URL,  and  convert  the  item  into  a  request  object.  The
           as_menu() has been renamed extract_menu_items(), and it now  returns
           a list containing Net::Gopher::Response::MenuItem objects  for  each
           item.

       (2) 
           item_blocks(), directory_blocks(), and as_blocks(),  are  all  gone,
           for good. The names were never that descriptive or well-thought  out
           in the first place, and their  functionality  was  easily  condensed
           into one new method: get_blocks().

       (3) 
           The   Net::Gopher::Response::Blocks   class   has    been    renamed
           Net::Gopher::Response::InformationBlock. In  addition,  its  methods
           have been renamed, removed, and replaced. Where possible,  they  now
           return a list of elements, or the first element from the  list.  The
           old hash-based behavior was long since made  antiquated  by  changes
           to  the  info  block  code.   Also,   this   class   now   overloads
           stringification so block objects can be treated  as  simple  scalars
           containing block values.

       (4) 
           The items and their attribute  information  block  objects  are  now
           stored internally as an array of arrays.

       (5) 
           Added the as_xml() method to Net::Gopher::Response, which  generates
           XML  for  item/directory  attribute  information  requests,   Gopher
           menus, and other non-menu text items.

       (6) 
           A new module, Net::Gopher::Constants has been added,  which  exports
           on demand constants for every known item type, constants to  compare
           against the value  returned  by  request_type(),  and  constants  to
           compare against the value returned by status().

       (7) 
           Added the as_url() method to Net::Gopher::Request,  which  generates
           a Gopher URL using the request object.

       (8) 
           The  Net::Gopher::Response  as_string()  method  has  been   renamed
           raw_response(). Even if as_string() is the current president set  by
           LWP and others, I don't think it's descriptive enough.
       
       (9) 
           The attribute information block methods  as_string()  and  content()
           have been replaced with raw_value() and value() respectively, and  a
           new method, name(), has been added.
       
       (10) 
           %GOPHER_ITEM_TYPES  and  %GOPHER_PLUS_ITEM_TYPES  have  been  merged
           into %ITEM_DESCRIPTIONS.

0.80 - Many more POD changes.

0.78 - POD changes in each module.

0.77 - This version incorporates a wealth of new functionality into
       Net::Gopher, including:
       (1)
           A new class, Net::Gopher::Request, is used to encapsulate  requests.
	   This class has accessor methods to modify every relevant aspect of a
	   Gopher/Gopher+ request, as well as named constructors you can import
	   for each type of request.

       (2)
           The Net::Gopher connect() and disconnect()  methods  are  gone.  The
           request() method now takes care of connecting and  disconnecting  by
           itself.

       (3)
           The request() method now takes a Net::Gopher::Request object as  its
           first argument. In addition, it  takes  the  parameters  "File"  and
           "Callback," with the first specifying  a  file  where  the  response
           content should be outputted to, and the other, a reference to a  sub
           that will be called as the response is collected.

       (4)
           The request_url() method is gone.

       (5)
           Net::Gopher  now  has  the  Net::Gopher::Request  shortcut   methods
           gopher(), gopher_plus(), item() and directory().

       (6)
           _get_buffer() is gone, replaced with _read() to do all reading,  and
           a new function, _write(), used to do all writing.

       (7)
           The code to generate the request string from the parameters or  from
           a URL has been moved to Net::Gopher::Request.

       (8)
           All   response   content-modifying   code   has   been   moved    to
           Net::Gopher::Response,    which    means    _unescape    is    gone.
           Net::Gopher::Response now has the  methods  _convert_newlines()  and
           _clean_period_termination() to do that work.

       (9)
           Net::Gopher::Response  now  has  the   convenient   is_gopher_plus()
           method and the is_text() method.

       (10)
           Added check_params()  routine  to  Net::Gopher::Utility.  This  will
           ensure that param names are not misspelled, raising an error if  the
           user supplies an invalid parameter name when calling a method.

0.57 - Added new Net::Gopher::Response::Blocks class and moved all block  value
       manipulation methods  to  there.  All  newlines  are  now  converted  to
       standard Unix linefeed characters in the response content.

0.47 - Removed  the  ADMIN,  ASK,  INFO,  and  VIEWS  block  parsing  from  the
       _parse_blocks() method and  put  them  into  separate  as_admin_block(),
       as_ask_block(),    as_info_block(),    and    as_views_block()   methods
       respectively. Also, changed the key for  Gopher+  strings  in  the  hash
       returned by as_menu() from 'gopher+' to 'gopher_plus'.

0.43 - You can now specify a which item  you  want  for  directory_blocks()  by
       its selector, hostname, port, etc., in addition to its number. Fixed the
       typo in request_url() for the default scheme, and changed  request_url()
       to die when you specify an invalid scheme.

0.40 - The Net::Gopher::Response attribute information methods now  also  parse
       Gopher+ +ASK blocks. The is_menu() method  is  now  far  more  accurate.
       Also, request() now defaults to item type 1 (menu) if you don't  specify
       the 'Type' named parameter.

0.37 - Added  named  parameters  to  the  Net::Gopher  constructor: BufferSize,
       GopherPlus, and Debug. Added  debugging,  which  causes  Net::Gopher  to
       print out various diagnostic messages at different times. Also  added  a
       corresponding  debug()  method.  The  POD  has  also  been substantially
       improved. Also refractored request(), and improved the error checking.

0.35 - Improved the error checking  in  request().  Also,  request()  now  more
       efficiently handles Gopher+ responses  with  content  lengths (a  number
       denoting the length of the response in bytes as opposed to -1 or -2).

0.34 - The request() method now removes the period on a line by itself  in  the
       response content if type is supplied and isn't 0  or  1.  Also,  periods
       escaped by adding and extra period (e.g., '..' instead of '.'), are  now
       unescaped in the response content.

0.33 - The request_url() now properly returns a Net::Gopher::Response object if
       if fails to connect to the server. Also fixed a typo in  the  POD  which
       had (until now) gone unnoticed.

0.32 - Added new is_menu() and is_blocks() methods.

0.30 - Removed as_block() and replaced it with item_blocks(), and added the new
       directory_blocks()  and  as_blocks()  methods.  Also   refractored   the
       request_url() method.

0.27 - Refractored  request()  and   removed   the  _get_gopher_response()  and
       _get_gopher_plus_response() methods.