Apache-ASP

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN

        This member when set appends itself to the value of the Content-Type
        HTTP header. If $Response->{Charset} = 'ISO-LATIN-1' is set, the
        corresponding header would look like:

          Content-Type: text/html; charset=ISO-LATIN-1

    $Response->{Clean} = 0-9;
        API extension. Set the Clean level, default 0, on a per script basis.
        Clean of 1-9 compresses text/html output. Please see the Clean config
        option for more information. This setting may also be useful even if
        using compression to obfuscate HTML.

    $Response->{ContentType} = "text/html"
        Sets the MIME type for the current response being sent to the client.
        Sent as an HTTP header.

    $Response->{Debug} = 1|0
        API extension. Default set to value of Debug config. May be used to
        temporarily activate or inactivate $Response->Debug() behavior.
        Something like:

         {
           local $Response->{Debug} = 1;
           $Response->Debug($values);
         }

        maybe be used to always log something. The Debug() method can be better
        than AppendToLog() because it will log data in data structures one level
        deep, whereas AppendToLog prints just raw string/scalar values.

    $Response->{Expires} = $time
        Sends a response header to the client indicating the $time in SECONDS in
        which the document should expire. A time of 0 means immediate
        expiration. The header generated is a standard HTTP date like: "Wed, 09
        Feb 1994 22:23:32 GMT".

    $Response->{ExpiresAbsolute} = $date
        Sends a response header to the client with $date being an absolute time
        to expire. Formats accepted are all those accepted by
        HTTP::Date::str2time(), e.g.

         "Wed, 09 Feb 1994 22:23:32 GMT"     -- HTTP format
         "Tuesday, 08-Feb-94 14:15:29 GMT"   -- old rfc850 HTTP format

         "08-Feb-94"       -- old rfc850 HTTP format    
         "09 Feb 1994"     -- proposed new HTTP format  

         "Feb  3  1994"    -- Unix 'ls -l' format
         "Feb  3 17:03"    -- Unix 'ls -l' format

    $Response->{FormFill} = 0|1
        If true, HTML forms generated by the script output will be auto filled
        with data from $Request->Form. This feature requires HTML::FillInForm to
        be installed. Please see the FormFill CONFIG for more information.

        This setting overrides the FormFill config at runtime for the script
        execution only.

    $Response->{IsClientConnected}
        1 if web client is connected, 0 if not. This value starts set to 1, and
        will be updated whenever a $Response->Flush() is called. If BufferingOn
        is set, by default $Response->Flush() will only be called at the end of
        the HTML output.

        As of version 2.23 this value is updated correctly before global.asa
        Script_OnStart is called, so global script termination may be correctly
        handled during that event, which one might want to do with excessive
        user STOP/RELOADS when the web server is very busy.

        An API extension $Response->IsClientConnected may be called for
        refreshed connection status without calling first a $Response->Flush

    $Response->{PICS}
        If this property has been set, a PICS-Label HTTP header will be sent
        with its value. For those that do not know, PICS is a header that is
        useful in rating the internet. It stands for Platform for Internet
        Content Selection, and you can find more info about it at:
        http://www.w3.org

    $Response->{Status} = $status
        Sets the status code returned by the server. Can be used to set messages
        like 500, internal server error

    $Response->AddHeader($name, $value)
        Adds a custom header to a web page. Headers are sent only before any
        text from the main page is sent, so if you want to set a header after
        some text on a page, you must turn BufferingOn.

    $Response->AppendToLog($message)
        Adds $message to the server log. Useful for debugging.

    $Response->BinaryWrite($data)
        Writes binary data to the client. The only difference from
        $Response->Write() is that $Response->Flush() is called internally
        first, so the data cannot be parsed as an html header. Flushing flushes
        the header if has not already been written.

        If you have set the $Response->{ContentType} to something other than
        text/html, cgi header parsing (see CGI notes), will be automatically be
        turned off, so you will not necessarily need to use BinaryWrite for
        writing binary data.

        For an example of BinaryWrite, see the binary_write.htm example in
        ./site/eg/binary_write.htm

        Please note that if you are on Win32, you will need to call binmode on a
        file handle before reading, if its data is binary.

    $Response->Clear()
        Erases buffered ASP output.

    $Response->Cookies($name, [$key,] $value)
        Sets the key or attribute of cookie with name $name to the value $value.
        If $key is not defined, the Value of the cookie is set. ASP CookiePath
        is assumed to be / in these examples.

         $Response->Cookies('name', 'value'); 
          --> Set-Cookie: name=value; path=/

         $Response->Cookies("Test", "data1", "test value");     
         $Response->Cookies("Test", "data2", "more test");      
         $Response->Cookies(
                "Test", "Expires", 
                &HTTP::Date::time2str(time+86400)
                ); 

README  view on Meta::CPAN


          Key - The cache item identity.  Can be $data, \$data, \%data, \@data, 
            this data is serialized and combined with the filename & @include_args 
            to create a MD5 checksum to fetch from the cache with. If you wanted
            to cache the results of a search page from form data POSTed, 
            then this key could be 

              { Key => $Request->Form }

          Clear - If set to 1, or boolean true, will always execute the include 
            and update the cache entry for it.

        Motivation: If an include takes 1 second to execute because of complex
        SQL to a database, and you can cache the output of this include because
        it is not realtime data, and the cache layer runs at .01 seconds, then
        you have a 100 fold savings on that part of the script. Site scalability
        can be dramatically increased in this way by intelligently caching
        bottlenecks in the web application.

        Use Sparingly: If you have a fast include, then it may execute faster
        than the cache layer runs, in which case you may actually slow your site
        down by using this feature. Therefore try to use this sparingly, and
        only when sure you really need it. Apache::ASP scripts generally execute
        very quickly, so most developers will not need to use this feature at
        all.

    $Response->Include(\$script_text, @args)
        Added in Apache::ASP 2.11, this method allows for executing ASP scripts
        that are generated dynamically by passing in a reference to the script
        data instead of the file name. This works just like the normal
        $Response->Include() API, except a string reference is passed in instead
        of a filename. For example:

          <%
            my $script = "<\% print 'TEST'; %\>";
            $Response->Include(\$script);
          %>

        This include would output TEST. Note that tokens like <% and %> must be
        escaped so Apache::ASP does not try to compile those code blocks
        directly when compiling the original script. If the $script data were
        fetched directly from some external resource like a database, then these
        tokens would not need to be escaped at all as in:

          <%
            my $script = $dbh->selectrow_array(
               "select script_text from scripts where script_id = ?",
               undef, $script_id
               );
            $Response->Include(\$script);
          %>

        This method could also be used to render other types of dynamic scripts,
        like XML docs using XMLSubs for example, though for complex runtime XML
        rendering, one should use something better suited like XSLT. See the
        $Server->XSLT API for more on this topic.

    $Response->IsClientConnected()
        API Extension. 1 for web client still connected, 0 if disconnected which
        might happen if the user hits the stop button. The original API for this
        $Response->{IsClientConnected} is only updated after a $Response->Flush
        is called, so this method may be called for a refreshed status.

        Note $Response->Flush calls $Response->IsClientConnected to update
        $Response->{IsClientConnected} so to use this you are going straight to
        the source! But if you are doing a loop like:

          while(@data) {
            $Response->End if ! $Response->{IsClientConnected};
            my $row = shift @data;
            %> <%= $row %> <%
            $Response->Flush;
          }

        Then its more efficient to use the member instead of the method since
        $Response->Flush() has already updated that value for you.

    $Response->Redirect($url)
        Sends the client a command to go to a different url $url. Script
        immediately ends.

    $Response->TrapInclude($file, @args)
        Calls $Response->Include() with same arguments as passed to it, but
        instead traps the include output buffer and returns it as as a perl
        string reference. This allows one to postprocess the output buffer
        before sending to the client.

          my $string_ref = $Response->TrapInclude('file.inc');
          $$string_ref =~ s/\s+/ /sg; # squash whitespace like Clean 1
          print $$string_ref;

        The data is returned as a referenece to save on what might be a large
        string copy. You may dereference the data with the $$string_ref
        notation.

    $Response->Write($data)
        Write output to the HTML page. <%=$data%> syntax is shorthand for a
        $Response->Write($data). All final output to the client must at some
        point go through this method.

  $Request Object
    The request object manages the input from the client browser, like posts,
    query strings, cookies, etc. Normal return results are values if an index is
    specified, or a collection / perl hash ref if no index is specified.
    WARNING, the latter property is not supported in ActiveState PerlScript, so
    if you use the hashes returned by such a technique, it will not be portable.

    A normal use of this feature would be to iterate through the form variables
    in the form hash...

     $form = $Request->Form();
     for(keys %{$form}) {
            $Response->Write("$_: $form->{$_}<br>\n");
     }

    Please see the ./site/eg/server_variables.htm asp file for this method in
    action.

    Note that if a form POST or query string contains duplicate values for a
    key, those values will be returned through normal use of the $Request
    object:

      @values = $Request->Form('key');

    but you can also access the internal storage, which is an array reference
    like so:

      $array_ref = $Request->{Form}{'key'};
      @values = @{$array_ref};

    Please read the PERLSCRIPT section for more information on how things like
    $Request->QueryString() & $Request->Form() behave as collections.

    $Request->{Method}
        API extension. Returns the client HTTP request method, as in GET or
        POST. Added in version 2.31.

README  view on Meta::CPAN

        which is loaded at runtime only for this purpose. This is the only time
        that CGI.pm will be loaded by Apache::ASP, which implements all other
        cgi-ish functionality natively. The rationale for not implementing file
        uploads natively is that the extra 100K in memory for CGI.pm shouldn't
        be a big deal if you are working with bulky file uploads.

    How do I access the ASP Objects in general?
        All the ASP objects can be referenced through the main package with the
        following notation:

         $main::Response->Write("html output");

        This notation can be used from anywhere in perl, including routines
        registered with $Server->RegisterCleanup().

        You use the normal notation in your scripts, includes, and global.asa:

         $Response->Write("html output");

    Can I print() in ASP?
        Yes. You can print() from anywhere in an ASP script as it aliases to the
        $Response->Write() method. Using print() is portable with PerlScript
        when using Win32::ASP in that environment.

    Do I have access to ActiveX objects?
        Only under Win32 will developers have access to ActiveX objects through
        the perl Win32::OLE interface. This will remain true until there are
        free COM ports to the UNIX world. At this time, there is no ActiveX for
        the UNIX world.

  Support and Production
    How do I get things I want done?!
        If you find a problem with the module, or would like a feature added,
        please mail support, as listed in the SUPPORT section, and your needs
        will be promptly and seriously considered, then implemented.

    What is the state of Apache::ASP? Can I publish a web site on it?
        Apache::ASP has been production ready since v.02. Work being done on the
        module is on a per need basis, with the goal being to eventually have
        the ASP API completed, with full portability to ActiveState PerlScript
        and MKS PScript. If you can suggest any changes to facilitate these
        goals, your comments are welcome.

TUNING
    A little tuning can go a long way, and can make the difference between a web
    site that gets by, and a site that screams with speed. With Apache::ASP, you
    can easily take a poorly tuned site running at 10 hits/second to 50+
    hits/second just with the right configuration.

    Documented below are some simple things you can do to make the most of your
    site.

  Online Resources
    For more tips & tricks on tuning Apache and mod_perl, please see the tuning
    documents at:

      Stas Bekman's mod_perl guide
      http://perl.apache.org/guide/

    Written in late 1999 this article provides an early look at how to tune your
    Apache::ASP web site. It has since been updated to remain current with
    Apache::ASP v2.29+

      Apache::ASP Site Tuning
      http://www.apache-asp.org/articles/perlmonth3_tune.html

  Tuning & Benchmarking
    When performance tuning, it is important to have a tool to measure the
    impact of your tuning change by change. The program ab, or Apache Bench,
    provides this functionality well, and is freely included in the apache
    distribution.

    Because performance tuning can be a neverending affair, it is a good idea to
    establish a threshold where performance is "good enough", that once reached,
    tuning stops.

  $Application & $Session State
    Use NoState 1 setting if you don't need the $Application or $Session
    objects. State objects such as these tie to files on disk and will incur a
    performance penalty.

    If you need the state objects $Application and $Session, and if running an
    OS that caches files in memory, set your "StateDir" directory to a cached
    file system. On WinNT, all files may be cached, and you have no control of
    this. On Solaris, /tmp is a RAM disk and would be a good place to set the
    "StateDir" config setting to. When cached file systems are used there is
    little performance penalty for using state files. Linux tends to do a good
    job caching its file systems, so pick a StateDir for ease of system
    administration.

    On Win32 systems, where mod_perl requests are serialized, you can freely use
    SessionSerialize to make your $Session requests faster, and you can achieve
    similar performance benefits for $Application if you call
    $Application->Lock() in your global.asa's Script_OnStart.

  Low MaxClients
    Set your MaxClients low, such that if you have that many httpd servers
    running, which will happen on busy site, your system will not start swapping
    to disk because of excessive RAM usage. Typical settings are less than 100
    even with 1 gig RAM! To handle more client connections, look into a dual
    server, mod_proxy front end.

  High MaxRequestsPerChild
    Set your max requests per child thread or process (in httpd.conf) high, so
    that ASP scripts have a better chance being cached, which happens after they
    are first compiled. You will also avoid the process fork penalty on UNIX
    systems. Somewhere between 50 - 500 is probably pretty good. You do not want
    to set this too high though or you will risk having your web processes use
    too much RAM. One may use Apache::SizeLimit or Apache::GTopLimit to
    optimally tune MaxRequestsPerChild at runtime.

  Precompile Modules
    For those modules that your Apache::ASP application uses, make sure that
    they are loaded in your sites startup.pl file, or loaded with PerlModule in
    your httpd.conf, so that your modules are compiled pre-fork in the parent
    httpd.

  Precompile Scripts
    Precompile your scripts by using the Apache::ASP->Loader() routine
    documented below. This will at least save the first user hitting a script
    from suffering compile time lag. On UNIX, precompiling scripts upon server

README  view on Meta::CPAN

           http://www.modperlcookbook.org

           Programming the Perl DBI
           http://www.oreilly.com/catalog/perldbi/

  Reference Cards
            Apache & mod_perl Reference Cards
            http://www.refcards.com/

  Web Sites
            mod_perl Apache web module
            http://perl.apache.org

            mod_perl 1.x Guide
            http://perl.apache.org/guide/

            Perl Programming Language
            http://www.perl.com

            Apache Web Server
            http://www.apache.org

TODO
    There is no specific time frame in which these things will be implemented.
    Please let me know if any of these is of particular interest to you, and I
    will give it higher priority.

  WILL BE DONE
     + Database storage of $Session & $Application, so web clusters 
       may scale better than the current NFS/CIFS StateDir implementation
       allows, maybe via Apache::Session.

CHANGES
    Apache::ASP has been in development since 1998, and was production ready
    since its .02 release. Releases are always used in a production setting
    before being made publically available.

    In July 2000, the version numbers of releases went from .19 to 1.9 which is
    more relevant to software development outside the perl community. Where a
    .10 perl module usually means first production ready release, this would be
    the equivalent of a 1.0 release for other kinds of software.

     + = improvement   - = bug fix    (d) = documentations

    $VERSION = 2.63; $DATE="03/14/2018"
         + Added section ``raw'' to MailErrors.inc to debug POSTs without
           form fields

         - MailErrorsHTML now uses monospaced fonts for errors. Easier on
           the eyes and more informative

    $VERSION = 2.62; $DATE="08/16/2011"
         - Fixed 'application/x-www-form-urlencoded' for AJAX POSTs post
           Firefox 3.x

         + First sourceforge.net hosted version

         + Incremented version number to actually match SVN branch tag

    $VERSION = 2.61; $DATE="05/24/2008"
         - updated for more recent mod_perl 2 environment to trigger correct loading of modules

         + loads modules in a backwards compatible way for older versions of mod_perl 1.99_07 to 1.99_09

         + license changes from GPL to Perl Artistic License

    $VERSION = 2.59; $DATE="05/23/2005"
         + added "use bytes" to Response object to calculate Content-Length
           correctly for UTF8 data, which should require therefore at least
           perl version 5.6 installed

         + updated to work with latest mod_perl 2.0 module naming convention,
           thanks to Randy Kobes for patch

         + examples now exclude usage of Apache::Filter & Apache::SSI under mod_perl 2.0

    $VERSION = 2.57; $DATE="01/29/2004"
         - $Server->Transfer will update $0 correctly

         - return 0 for mod_perl handler to work with latest mod_perl 2 release
           when we were returning 200 ( HTTP_OK ) before

         - fixed bug in $Server->URL when called like $Server->URL($url)
           without parameters.  Its not clear which perl versions this bug 
           affected.

    $VERSION = 2.55; $DATE="08/09/2003"
         - Bug fixes for running on standalone CGI mode on Win32 submitted
           by Francesco Pasqualini

         + Added Apache::ASP::Request::BINMODE for binmode() being
           called on STDIN after STDIN is tied to $Request object

         + New RequestBinaryRead configuration created, may be turned off
           to prevent $Request object from reading POST data

         ++ mod_perl 2 optmizations, there was a large code impact on this,
           as much code was restructured to reduce the differences between
           mod_perl 1 and mod_perl 2, most importantly, Apache::compat is
           no longer used

         + preloaded CGI for file uploads in the mod_perl environment

         - When XSLT config is set, $Response->Redirect() should work now
           Thanks to Marcus Zoller for pointing problem out

         + Added CookieDomain setting, documented, and added test to cover 
           it in t/cookies.t . Setting suggested by Uwe Riehm, who nicely 
           submitted some code for this.

    $VERSION = 2.53; $DATE="04/10/2003"
         + XMLSubs tags with "-" in them will have "-" replaced with "_" or underscore, so a
           tag like <my:render-table /> will be translated to &my::render_table() ... tags with
           - in them are common in extended XML syntaxes, but perl subs cannot have - in them only.

         + Clean setting now works on output when $Response->{ContentType} begins with text/html;
           like "text/html; charset=iso-8859-2" ... before Clean would only work on output marked
           with ContentType text/html.  Thanks to Szymon Juraszczyk for recommending fix.

         --Fixed a bug which would cause Session_OnEnd to be called twice on sessions in a certain case,
           particularly when an old expired session gets reused by and web browser... this bug was
           a result of a incomplete session cleanup method in this case.  Thanks to Oleg Kobyakovskiy 
           for reporting this bug.  Added test in t/session_events.t to cover this problem going forward.

         - Compile errors from Apache::ASP->Loader() were not being reported.  They will
           be reported again now.  Thanks to Thanos Chatziathanassiou for discovering and
           documenting this bug.  Added test in t/load.t to cover this problem going forward.

         + use of chr(hex($1)) to decode URI encoded parameters instead of pack("c",hex($1))
           faster & more correct, thanks to Nikolay Melekhin for pointing out this need.

         (d) Added old perlmonth.com articles to ./site/articles in distribution

README  view on Meta::CPAN

           for meta data

         + use of direct Apache::ASP::State methods like FETCH/STORE
           in Cache() layer so we don't have to go through slower tied interface.
           This will speed up XSLT & and include output caching mostly.

         + minor optimizations for speed & memory usage

    $VERSION = 2.49; $DATE="11/10/2002"
         -- bug introduced in 2.47 cached script compilations for executing
            scripts ( not includes ) of the same name in different directories
            for the same Global/GlobalPackage config for an application.
            Fix was to remove optimization that caused problem, and
            created test case t/same_name.t to cover bug.

    $VERSION = 2.47; $DATE="11/06/2002"
         ++ Runtime speed enhancements for 15-20% improvement including:
           + INTERNAL API ReadFile() now returns scalar ref as memory optimization
           + cache InodeNames config setting in ASP object now for common lookups
           + removed CompileChecksum() INTERNAL API, since it was an unnecesary
             method decomposition along a common code path
           + removed IsChanged() INTERNAL API since compiling of scripts
             is now handled by CompileInclude() which does this functionality already
           + removed unnecessary decomp of IncludesChanged() INTERNAL API, which was along
             critical code path
           + do not call INTERNAL SearchDirs() API when compiling base script
             since we have already validated its path earlier
           + Use stat(_) type shortcut for stat() & -X calls where possible
           + Moved @INC initilization up to handler() & consolidated with $INCDir lib
           + removed useless Apache::ASP::Collection::DESTROY
           + removed useless Apache::ASP::Server::DESTROY
           + removed useless Apache::ASP::GlobalASA::DESTROY
           + removed useless Apache::ASP::Response::DESTROY

         - Default path for $Response->{Cookies} was from CookiePath
           config, but this was incorrect as CookiePath config is only
           for $Session cookie, so now path for $Response->{Cookies}
           defaults to /

         - Fixed bug where global.asa events would get undefined with
           StatINC and GlobalPackage set when the GlobalPackage library
           changed & get reloaded.

         (d) Documented long time config NoCache.

         -- Fixed use with Apache::Filter, capable as both source
            and destination filter.  Added ./site/eg/filter.filter example
            to demonstrate these abilities.

         + Use $r->err_headers_out->add Apache::Table API for cookies 
           now instead of $r->cgi_header_out.  Added t/cookies.t test to 
           cover new code path as well as general $Response->Cookies API.
           Also make cookies headers sorted by cookie and dictionary key 
           while building headers for repeatable behavior, this latter was 
           to facilitate testing.

         - fixed $Server->Mail error_log output when failing to connect
           to SMTP server.

         + added tests to cover UniquePackages & NoCache configs since this
           config logic was updated

         + made deprecated warnings for use of certain $Response->Member
           calls more loudly write to error_log, so I can remove the AUTOLOAD
           for Response one day

         - Probably fixed behavior in CgiHeaders, at least under perl 5.8.0, and
           added t/cgi_headers.t to cover this config.

         + removed $Apache::ASP::CompressGzip setting ability, used to possibly
           set CompressGzip in the module before, not documented anyway

         + removed $Apache::ASP::Filter setting ability to set Filter globally, 
           not documented anyway

         + removed old work around for setting ServerStarting to 0
           at runtime, which was bad for Apache::DBI on win32 a long
           time ago:

            $Apache::ServerStarting and $Apache::ServerStarting = 0;

           If this code is still needed in Apache::ASP->handler() let
           me know.

         + check to make sure data in internal database is a HASH ref
           before using it for session garbage collection.  This is to
           help prevent against internal database corruption in a 
           network share that does not support flock() file locking.

         + For new XMLSubs ASP type <%= %> argument interpolation
           activated with XMLSubsPerlArgs 0, data references can now
           be passed in addition to SCALAR/string references, so one
           can pass an object reference like so:

             <my:tag value="<%= $Object %>" />

           This will only work as long as the variable interpolation <%= %>
           are flushed against the containing " " or ' ', or else the object
           reference will be stringified when it is concatenated with 
           the rest of the data.

           Testing for this feature was added to ./t/xmlsubs_aspargs.t

           This feature is still experimental, and its interface may change.
           However it is slated for the 3.0 release as default method,
           so feedback is appreciated.

         + For new XMLSubs ASP type <%= %> argument interpolation
           activated with XMLSubsPerlArgs 0, <% %> will no longer work,
           just <%= %>, as in 

             <my:tag value="some value <%= $value %> more data" />

           This feature is still experimental, and its interface may change.
           However it is slated for the 3.0 release as default method,
           so feedback is appreciated.

    $VERSION = 2.45; $DATE="10/13/2002"
         ++New XMLSubsPerlArgs config, default 1, indicates how 
          XMLSubs arguments have always been parsed.  If set to 0,
          will enable new XMLSubs args that are more ASP like with

README  view on Meta::CPAN

           "use HTTP::Date;" on your own, you will have to do this now.

         + Streamlined code execution.  Especially worked on 
           $Response->IsClientConnected which gets called during
           a normal request execution, and got rid of IO::Select
           dependency. Some function style calls instead of OO style 
           calls where private functions were being invokes that one 
           would not need to override.

         - Fixed possible bug when flushing a data buffer where there
           is just a '0' in it.

         + Updated docs to note that StateCache config was deprecated
           as of 2.23.  Removed remaining code that referenced the config.

         + Removed references to unused OrderCollections code.

         - Better Cache meta key, lower chance of collision with 
           unrelated data since its using the full MD5 keyspace now

         + Optimized some debugging statements that resulted 
           from recent development.

         + Tie::TextDir .04 and above is supported for StateDB
           and CacheDB settings with MLDBM::Sync .21. This is good for 
           CacheDB where output is larger and there are not many 
           versions to cache, like for XSLTCache, where the site is 
           mostly static.

         + Better RESOURCES section to web site, especially with adding
           some links to past Apache::ASP articles & presentations.

    $VERSION = 2.25; $DATE="10/11/2001";
         + Improved ./site/apps/search application, for better
           search results at Apache::ASP site.  Also, reengineered
           application better, with more perl code moved to global.asa.
           Make use of MLDBM::Sync::SDBM_File, where search database
           before was engineering around SDBM_File's shortcomings.

         - Fix for SessionSerialize config, which broke in 2.23
           Also, added t/session_serialize.t to test suite to catch
           this problem in the future.

    $VERSION = 2.23; $DATE="10/11/2001";
         +Make sure a couple other small standard modules get loaded
          upon "PerlModule Apache::ASP", like Time::HiRes, Class::Struct,
          and MLDBM::Serializer::Data::Dumper.  If not available
          these modules won't cause errors, but will promote child httpd
          RAM sharing if they are.

         -XMLSubs args parsing fix so an arg like z-index
          does not error under UseStrict.  This is OK now:

           <my:layer z-index=3 top=0 left=0> HTML </my:layer>

         -Only remove outermost <SCRIPT> tags from global.asa
          for IIS/PerlScript compatibility.  Used to remove
          all <SCRIPT> tags, which hurt when some subs in globa.asa
          would be printing some JavaScript.

         +$Response->{IsClientConnected} now updated correctly 
          before global.asa Script_OnStart.  $Response->IsClientConnect()
          can be used for accurate accounting, while 
          $Response->{IsClientConnected} only gets updated
          after $Response->Flush().  Added test cases to response.t

         +$Server->HTMLEncode(\$data) API extension, now can take
          scalar ref, which can give a 5% improvement in benchmarks
          for data 100K in size.

         -Access to $Application is locked when Application_OnEnd & 
          Application_OnStart is called, creating a critical section
          for use of $Application

         ++MLDBM::Sync used now for core DBM support in Apache::ASP::State.
          This drastically simplifies/stabilizes the code in there
          and will make it easier for future SQL database plugins.

         +New API for accessing ASP object information in non content
          handler phases:

            use Apache::ASP;
            sub My::Auth::handler {
              my $r = shift;
              my $ASP = Apache::ASP->new($r) 
              my $Session = $ASP->Session;
            }

          In the above example, $Session would be the same $Session
          object created later while running the ASP script for this
          same request.  

          Added t/asp_object.t test for this.  Fixed global.asa to only 
          init StateDir when application.asp starts which is the first 
          test script to run.

         -Fixed on Win32 to make Apache::ASP->new($r) able to create
          multiple master ASP objects per request.  Was not reentrant 
          safe before, particularly with state locking for dbms like 
          $Application & $Session.  

         ++Output caching for includes, built on same layer ( extended )
          as XSLTCache, test suite at t/cache.t.  Enabled with special 
          arguments to 

            $Response->Include(\%args, @include_args)
            $Response->TrapInclude(\%args, @include_args)
            $Server->Execute(\%args, @include_args)

          where %args = (
            File => 'file.inc',
            Cache => 1, # to activate cache layer
            Expires => 3600, # to expire in one hour
            LastModified => time() - 600, # to expire if cached before 10 minutes ago
            Key => $Request->Form, # to cache based on checksum of serialized form data,
            Clear => 1, # to not allow fetch from cache this time, will always execute include
          );

          Like the XSLTCache, it uses MLDBM::Sync::SDBM_File
          by default, but can use DB_File or GDBM_File if
          CacheDB is set to these.

          See t/cache.t for API support until this is documented.

README  view on Meta::CPAN

          API extension which allows for setting of Apache's error
          document at runtime.  This is really just a wrapper 
          for Apache->custom_response() renamed so it syncs with
          the Apache ErrorDocument config setting.  Updated
          documentation, and added error_document.htm example.

         =OrderCollections setting was added, but then REMOVED
          because it was not going to be used.  It bound 
          $Request->* collections/hashes to Tie::IxHash, so that data
          in those collections would be read in the order the 
          browser sent it, when eaching through or with keys.

         -global.asa will be reloaded when changed.  This broke
          when I optimized the modification times with (stat($file))[9]
          rather than "use File::stat; stat($file)->mtime"

         -Make Apache::ASP->Loader() PerlRestartHandler safe,
          had some unstrict code that was doing the wrong thing.

         -IncludesDir config now works with DynamicIncludes.

         +DebugBufferLength feature added, giving control to 
          how much buffered output gets shown when debugging errors.

         ++Tuning of $Response->Write(), which processes all
          static html internally, to be almost 50% faster for
          its typical use, when BufferingOn is enabled, and 
          CgiHeaders are disabled, both being defaults.

          This can show significant speed improvements for tight
          loops that render ASP output.

         +Auto linking of ./site/eg/ text to example scripts
          at web site.

         +$Application->GetSession($session_id) API extension, useful
          for managing active user sessions when storing session ids
          in $Application.  Documented.

         -disable use of flock() on Win95/98 where it is unimplemented

         -@array context of $Request->Form('name') returns
          undef when value for 'name' is undefined.  Put extra
          logic in there to make sure this happens.

    $VERSION = 0.16; $DATE="09/22/99";
         -$Response->{Buffer} and PerlSetVar BufferingOn
          configs now work when set to 0, to unbuffer output,
          and send it out to the web client as the script generates it.

          Buffering is enabled by default, as it is faster, and
          allows a script to error cleanly in the middle of execution.  

         +more bullet proof loading of Apache::Symbol, changed the 
          way Apache::ASP loads modules in general.  It used to 
          check for the module to load every time, if it hadn't loaded
          successfully before, but now it just tries once per httpd,
          so the web server will have to be restarted to see new installed
          modules.  This is just for modules that Apache::ASP relies on.

          Old modules that are changed or updated with an installation
          are still reloaded with the StatINC settings if so configured. 

         +ASP web site wraps <font face="courier new"> around <pre>
          tags now to override the other font used for the text
          areas.  The spacing was all weird in Netscape before
          for <pre> sections.

         -Fixed Content-Length calculation when using the Clean
          option, so that the length is calculated after the HTML
          is clean, not before.  This would cause a browser to 
          hang sometimes.

         +Added IncludesDir config option that if set will also be
          used to check for includes, so that includes may easily be
          shared between applications.  By default only Global and 
          the directory the script is in are checked for includes.

          Also added IncludesDir as a possible configuration option
          for Apache::ASP->Loader()

         -Re-enabled the Application_OnStart & OnEnd events, after
          breaking them when implementing the AllowApplicationState
          config setting.

         +Better pre-fork caching ... StatINC & StatINCMatch are now 
          args for Apache::ASP->Loader(), so StatINC symbols loading
          may be done pre-fork and shared between httpds.  This lowers
          the child httpd init cost of StatINC.  Documented.

         +Made Apache::ASP Basic Authorization friendly so authentication
          can be handled by ASP scripts.  If AuthName and AuthType Apache
          config directives are set, and a $Response->{Status} is set to 
          401, a user will be prompted for username/password authentication
          and the entered data will show up in ServerVariables as:
            $env = $Request->ServerVariables
            $env->{REMOTE_USER} = $env->{AUTH_USER} = username
            $env->{AUTH_PASSWD} = password
            $env->{AUTH_NAME}   = your realm
            $env->{AUTH_TYPE}   = 'Basic'

          This is the same place to find auth data as if Apache had some 
          authentication handler deal with the auth phase separately.

         -MailErrorsTo should report the right file now that generates
          the error.

    $VERSION = 0.15; $DATE="08/24/1999";
         --State databases like $Session, $Application are 
          now tied/untied to every lock/unlock triggered by read/write 
          access.  This was necessary for correctness issues, so that 
          database file handles are flushed appropriately between writes
          in a highly concurrent multi-process environment.

          This problem raised its ugly head because under high volume, 
          a DB_File can become corrupt if not flushed correctly.  
          Unfortunately, there is no way to flush SDBM_Files & DB_Files 
          consistently other than to tie/untie the databases every access.

          DB_File may be used optionally for StateDB, but the default is
          to use SDBM_File which is much faster, but limited to 1024 byte

README  view on Meta::CPAN


          Scripts used to have their own namespace, thus globals
          were not shared between them.

         +a -o $output_dir switch on the ./cgi/asp script allows
          it to execute scripts and write their output to an output
          directory.  Useful for building static html sites, based on
          asp scripts.  An example use would be:

            asp -b -o out *.asp

          Without an output directory, script output is written to STDOUT

    $VERSION = 0.09; $DATE="04/22/1999";
         +Updated Makefile.PL optional modules output for CGI & DB_File

         +Improved docs on $Response->Cookies() and $Request->Cookies()

         +Added PERFORMANCE doc to main README, and added sub section
          on precompiling scripts with Apache::ASP->Loader()

         +Naming of CompileIncludes switched over to DynamicIncludes 
          for greater clarity.

         +Dynamic includes can now reference ASP objects like $Session
          w/o the $main::* syntax.  These subs are no longer anonymous
          subs, and are now compiled into the namespace of the global.asa package.

         +Apache::ASP->Loader() precompiles dynamic includes too. Making this work
          required fixing some subtle bugs / dependencies in the compiling process.

         +Added Apache::ASP->Loader() similar to Apache::RegistryLoader for
          precompiling ASP scripts.  Precompile a whole site at server 
          startup with one function call.

         +Prettied the error messaging with Debug 2.

         +$Response->Debug(@args) debugging extension, which
          allows a developer to hook into the module's debugging,
          and only have @args be written to error_log when Debug is greater
          than 0.

         -Put write locking code around State writes, like $Session
          and $Application.  I thought I fixed this bug a while ago.

         -API change: converted $Session->Timeout() and $Session->SessionID() 
          methods into $Session->{Timeout} and $Session->{SessionID} properties.
          The use of these properties as methods is deprecated, but 
          backwards compatibility will remain.  Updated ./eg/session.asp
          to use these new properties.

         +Implemented $Response->{PICS} which if set sends out a PICS-Label
          HTTP header, useful for ratings.

         +Implemented $Response->{CacheControl} and $Response->{Charset} members.
          By default, CacheControl is 'private', and this value gets sent out
          every request as HTTP header Cache-Control.  Charset appends itself
          onto the content type header.

         +Implemented $Request->BinaryRead(), $Request->{TotalBytes},
          documented them, and updated ./eg/form.asp for an example usage. 

         +Implemented $Response->BinaryWrite(), documented, and created
          and example in ./eg/binary_write.htm

         +Implemented $Server->MapPath() and created example of its use
          in ./eg/server.htm

         -$Request->Form() now reads file uploads correctly with 
          the latest CGI.pm, where $Request->Form('file_field') returns
          the actual file name uploaded, which can be used as a file handle
          to read in the data.  Before, $Request->Form('file_field') would
          return a glob that looks like *Fh::filename, so to get the file
          name, you would have to parse it like =~ s/^\*Fh\:\://,
          which you no longer have to do.  As long as parsing was done as
          mentioned, the change should be backwards compatible.

         +Updated  +enhanced documentation on file uploads.  Created extra
          comments about it as an FAQ, and under $Response->Form(), the latter
          being an obvious place for a developer to look for it.

         +Updated ./eg/file_upload.asp to show use of non file form data, 
          with which we had a bug before.

         +Finished retieing *STDIN to cached STDIN contents, so that 
          CGI input routines may be used transparently, along side with
          use of $Request->Form()

         +Cleaned up and optimized $Request code

         +Updated documentation for CGI input & file uploads.  Created
          file upload FAQ.

         +Reworked ./eg/cgi.htm example to use CGI input routines
          after doing a native read of STDIN.

         ++Added dynamic includes with <!--include file=file args=@args-->
          extension.  This style of include is compiled as an anonymous sub & 
          cached, and then executed with @args passed to the subroutine for 
          execution.  This is include may also be rewritten as a new API 
          extension: $Response->Include('file', @args)

         +Added ./eg/compiled_includes.htm example documenting new dynamic includes.

         +Documented SSI: native file includes, and the rest with filtering 
          to Apache::SSI

         +Turned the documentation of Filter config to value of Off so 
          people won't cut and paste the On config by default.

         +Added SecureSession config option, which forces session cookie to 
          be sent only under https secured www page requests.

         +Added StateDB config option allows use of DB_File for $Session, since 
          default use of SDBM_File is limited.  See StateDB in README.

         +file include syntax w/o quotes supported like <!--#include file=test.inc-->

         +Nested includes are supported, with includes including each other.
          Recursive includes are detected and errors out when an include has been 
          included 100 times for a script.  Better to quit early than 



( run in 0.619 second using v1.01-cache-2.11-cpan-39bf76dae61 )