Apache-ASP

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN

    MailHost
        The mail host is the smtp server that the below Mail* config directives
        will use when sending their emails. By default Net::SMTP uses smtp mail
        hosts configured in Net::Config, which is set up at install time, but
        this setting can be used to override this config.

        The mail hosts specified in the Net::Config file will be used as backup
        smtp servers to the MailHost specified here, should this primary server
        not be working.

          PerlSetVar MailHost smtp.yourdomain.com.foobar

    MailFrom
        Default NONE, set this to specify the default mail address placed in the
        From: mail header for the $Server->Mail() API extension, as well as
        MailErrorsTo and MailAlertTo.

          PerlSetVar MailFrom youremail@yourdomain.com.foobar

    MailErrorsTo
        No default, if set, ASP server errors, error code 500, that result while
        compiling or running scripts under Apache::ASP will automatically be
        emailed to the email address set for this config. This allows an
        administrator to have a rapid response to user generated server errors
        resulting from bugs in production ASP scripts. Other errors, such as 404
        not found will be handled by Apache directly.

        An easy way to see this config in action is to have an ASP script which
        calls a die(), which generates an internal ASP 500 server error.

        The Debug config of value 2 and this setting are mutually exclusive, as
        Debug 2 is a development setting where errors are displayed in the
        browser, and MailErrorsTo is a production setting so that errors are
        silently logged and sent via email to the web admin.

          PerlSetVar MailErrorsTo youremail@yourdomain.com

    MailAlertTo
        The address configured will have an email sent on any ASP server error
        500, and the message will be short enough to fit on a text based pager.
        This config setting would be used to give an administrator a heads up
        that a www server error occurred, as opposed to MailErrorsTo would be
        used for debugging that server error.

        This config does not work when Debug 2 is set, as it is a setting for
        use in production only, where Debug 2 is for development use.

          PerlSetVar MailAlertTo youremail@yourdomain.com

    MailAlertPeriod
        Default 20 minutes, this config specifies the time in minutes over which
        there may be only one alert email generated by MailAlertTo. The purpose
        of MailAlertTo is to give the admin a heads up that there is an error at
        the www server. MailErrorsTo is for to aid in speedy debugging of the
        incident.

          PerlSetVar MailAlertPeriod 20

  File Uploads
    FileUploadMax
        default 0, if set will limit file uploads to this size in bytes. This is
        currently implemented by setting $CGI::POST_MAX before handling the file
        upload. Prior to this, a developer would have to hardcode a value for
        $CGI::POST_MAX to get this to work.

          PerlSetVar 100000

    FileUploadTemp
        default 0, if set will leave a temp file on disk during the request,
        which may be helpful for processing by other programs, but is also a
        security risk in that other users on the operating system could
        potentially read this file while the script is running.

        The path to the temp file will be available at
        $Request->{FileUpload}{$form_field}{TempFile}. The regular use of file
        uploads remains the same with the <$filehandle> to the upload at
        $Request->{Form}{$form_field}. Please see the CGI section for more
        information on file uploads, and the $Request section in OBJECTS.

          PerlSetVar FileUploadTemp 0

SYNTAX
  General
    ASP embedding syntax allows one to embed code in html in 2 simple ways. The
    first is the <% xxx %> tag in which xxx is any valid perl code. The second
    is <%= xxx %> where xxx is some scalar value that will be inserted into the
    html directly. An easy print.

      A simple asp page would look like:
  
      <!-- sample here -->
      <html>
      <body>
      For loop incrementing font size: <p>
      <% for(1..5) { %>
            <!-- iterated html text -->
            <font size="<%=$_%>" > Size = <%=$_%> </font> <br>
      <% } %>
      </body>
      </html>
      <!-- end sample here -->

    Notice that your perl code blocks can span any html. The for loop above
    iterates over the html without any special syntax.

  XMLSubs
    XMLSubs allows a developer to define custom handlers for HTML & XML tags,
    which can extend the natural syntax of the ASP environment. Configured like:

      PerlSetVar XMLSubsMatch site:\w+

    A simple tag like:

      <site:header title="Page Title" />

    can be constructed that could translate into:

      sub site::header {
          my $args = shift;
          print "<html><head><title>$args->{title}</title></head>\n";
          print "<body bgcolor=white>\n";
      }

    Better yet, one can use this functionality to trap and post process embedded
    HTML & XML like:

      <site:page title="Page Title">
        ... some HTML here ...
      </site:page>

    and then:

      sub site::page {
        my($args, $html) = @_;
        &site::header($args);
        $main::Response->Write($html);
        $main::Response->Write("</body></html>");
      }

README  view on Meta::CPAN

          $$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.

    $Request->{TotalBytes}
        The amount of data sent by the client in the body of the request,
        usually the length of the form data. This is the same value as
        $Request->ServerVariables('CONTENT_LENGTH')

    $Request->BinaryRead([$length])
        Returns a string whose contents are the first $length bytes of the form
        data, or body, sent by the client request. If $length is not given, will
        return all of the form data. This data is the raw data sent by the
        client, without any parsing done on it by Apache::ASP.

        Note that BinaryRead will not return any data for file uploads. Please
        see the $Request->FileUpload() interface for access to this data.
        $Request->Form() data will also be available as normal.

    $Request->ClientCertificate()
        Not implemented.

    $Request->Cookies($name [,$key])
        Returns the value of the Cookie with name $name. If a $key is specified,
        then a lookup will be done on the cookie as if it were a query string.
        So, a cookie set by:

         Set-Cookie: test=data1=1&data2=2

        would have a value of 2 returned by $Request->Cookies('test','data2').

        If no name is specified, a hash will be returned of cookie names as keys
        and cookie values as values. If the cookie value is a query string, it
        will automatically be parsed, and the value will be a hash reference to
        these values.

        When in doubt, try it out. Remember that unless you set the Expires
        attribute of a cookie with $Response->Cookies('cookie', 'Expires',
        $xyz), the cookies that you set will only last until you close your
        browser, so you may find your self opening & closing your browser a lot
        when debugging cookies.

        For more information on cookies in ASP, please read $Response->Cookies()

    $Request->FileUpload($form_field, $key)
        API extension. The FileUpload interface to file upload data is
        stabilized. The internal representation of the file uploads is a hash of
        hashes, one hash per file upload found in the $Request->Form()
        collection. This collection of collections may be queried through the
        normal interface like so:

          $Request->FileUpload('upload_file', 'ContentType');
          $Request->FileUpload('upload_file', 'FileHandle');
          $Request->FileUpload('upload_file', 'BrowserFile');
          $Request->FileUpload('upload_file', 'Mime-Header');
          $Request->FileUpload('upload_file', 'TempFile');

          * note that TempFile must be use with the UploadTempFile 
            configuration setting.

        The above represents the old slow collection interface, but like all
        collections in Apache::ASP, you can reference the internal hash
        representation more easily.

          my $fileup = $Request->{FileUpload}{upload_file};
          $fileup->{ContentType};
          $fileup->{BrowserFile};
          $fileup->{FileHandle};
          $fileup->{Mime-Header};
          $fileup->{TempFile};

    $Request->Form($name)
        Returns the value of the input of name $name used in a form with POST
        method. If $name is not specified, returns a ref to a hash of all the
        form data. One can use this hash to create a nice alias to the form data
        like:

         # in global.asa
         use vars qw( $Form );
         sub Script_OnStart {
           $Form = $Request->Form;
         }
         # then in ASP scripts
         <%= $Form->{var} %>

        File upload data will be loaded into $Request->Form('file_field'), where
        the value is the actual file name of the file uploaded, and the contents
        of the file can be found by reading from the file name as a file handle
        as in:

         while(read($Request->Form('file_field_name'), $data, 1024)) {};

        For more information, please see the CGI / File Upload section, as file
        uploads are implemented via the CGI.pm module. An example can be found
        in the installation samples ./site/eg/file_upload.asp

    $Request->Params($name)
        API extension. If RequestParams CONFIG is set, the $Request->Params
        object is created with combined contents of $Request->QueryString and
        $Request->Form. This is for developer convenience simlar to CGI.pm's
        param() method. Just like for $Response->Form, one could create a nice
        alias like:

         # in global.asa
         use vars qw( $Params );
         sub Script_OnStart {
           $Params = $Request->Params;
         }

    $Request->QueryString($name)
        Returns the value of the input of name $name used in a form with GET
        method, or passed by appending a query string to the end of a url as in
        http://localhost/?data=value. If $name is not specified, returns a ref
        to a hash of all the query string data.

    $Request->ServerVariables($name)
        Returns the value of the server variable / environment variable with
        name $name. If $name is not specified, returns a ref to a hash of all
        the server / environment variables data. The following would be a common
        use of this method:

         $env = $Request->ServerVariables();
         # %{$env} here would be equivalent to the cgi %ENV in perl.

  $Application Object
    Like the $Session object, you may use the $Application object to store data
    across the entire life of the application. Every page in the ASP application
    always has access to this object. So if you wanted to keep track of how many
    visitors there where to the application during its lifetime, you might have
    a line like this:

     $Application->{num_users}++

    The Lock and Unlock methods are used to prevent simultaneous access to the
    $Application object.

    $Application->Lock()
        Locks the Application object for the life of the script, or until
        UnLock() unlocks it, whichever comes first. When $Application is locked,
        this guarantees that data being read and written to it will not suddenly
        change on you between the reads and the writes.

        This and the $Session object both lock automatically upon every read and
        every write to ensure data integrity. This lock is useful for concurrent
        access control purposes.

        Be careful to not be too liberal with this, as you can quickly create
        application bottlenecks with its improper use.

    $Application->UnLock()
        Unlocks the $Application object. If already unlocked, does nothing.

    $Application->GetSession($sess_id)
        This NON-PORTABLE API extension returns a user $Session given a session
        id. This allows one to easily write a session manager if session ids are

README  view on Meta::CPAN


    CGI.pm
        CGI.pm is a very useful module that aids developers in the building of
        these applications, and Apache::ASP has been made to be compatible with
        function calls in CGI.pm. Please see cgi.htm in the ./site/eg directory
        for a sample ASP script written almost entirely in CGI.

        As of version 0.09, use of CGI.pm for both input and output is seamless
        when working under Apache::ASP. Thus if you would like to port existing
        cgi scripts over to Apache::ASP, all you need to do is wrap <% %> around
        the script to get going. This functionality has been implemented so that
        developers may have the best of both worlds when building their web
        applications.

        For more information about CGI.pm, please see the web site

          http://search.cpan.org/dist/CGI/

    Query Object Initialization
        You may create a CGI.pm $query object like so:

                use CGI;
                my $query = new CGI;

        As of Apache::ASP version 0.09, form input may be read in by CGI.pm upon
        initialization. Before, Apache::ASP would consume the form input when
        reading into $Request->Form(), but now form input is cached, and may be
        used by CGI.pm input routines.

    CGI headers
        Not only can you use the CGI.pm $query->header() method to put out
        headers, but with the CgiHeaders config option set to true, you can also
        print "Header: value\n", and add similar lines to the top of your
        script, like:

         Some-Header: Value
         Some-Other: OtherValue

         <html><body> Script body starts here.

        Once there are no longer any cgi style headers, or the there is a
        newline, the body of the script begins. So if you just had an asp script
        like:

            print join(":", %{$Request->QueryString});

        You would likely end up with no output, as that line is interpreted as a
        header because of the semicolon. When doing basic debugging, as long as
        you start the page with <html> you will avoid this problem.

    print()ing CGI
        CGI is notorious for its print() statements, and the functions in CGI.pm
        usually return strings to print(). You can do this under Apache::ASP,
        since print just aliases to $Response->Write(). Note that $| has no
        affect.

                print $query->header();
                print $query->start_form();

    File Upload
        CGI.pm is used for implementing reading the input from file upload. You
        may create the file upload form however you wish, and then the data may
        be recovered from the file upload by using $Request->Form(). Data from a
        file upload gets written to a file handle, that may in turn be read
        from. The original file name that was uploaded is the name of the file
        handle.

                my $filehandle = $Request->Form('file_upload_field_name');
                print $filehandle; # will get you the file name
                my $data;
                while(read($filehandle, $data, 1024)) {
                        # data from the uploaded file read into $data
                };

        Please see the docs on CGI.pm (try perldoc CGI) for more information on
        this topic, and ./site/eg/file_upload.asp for an example of its use.
        Also, for more details about CGI.pm itself, please see the web site:

            http://search.cpan.org/dist/CGI/

        Occasionally, a newer version of CGI.pm will be released which breaks
        file upload compatibility with Apache::ASP. If you find this to occur,
        then you might consider downgrading to a version that works. For
        example, one can install a working CGI.pm v2.78 for a working version,
        and to get old versions of this module, one can go to BACKPAN at:

            http://backpan.cpan.org/modules/by-authors/id/L/LD/LDS/

        There is also $Request->FileUpload() API extension that you can use to
        get more data about a file upload, so that the following properties are
        available for querying:

          my $file_upload = $Request->{FileUpload}{upload_field};
          $file_upload->{BrowserFile}
          $file_upload->{FileHandle}
          $file_upload->{ContentType}

          # only if FileUploadTemp is set
          $file_upload->{TempFile}      

          # whatever mime headers are sent with the file upload
          # just "keys %$file_upload" to find out
          $file_upload->{?Mime-Header?}

        Please see the $Request section in OBJECTS for more information.

PERLSCRIPT
    Much work has been done to bring compatibility with ASP applications written
    in PerlScript under IIS. Most of that work revolved around bringing a
    Win32::OLE Collection interface to many of the objects in Apache::ASP, which
    are natively written as perl hashes.

    New as of version 2.05 is new functionality enabled with the CollectionItem
    setting, to giver better support to more recent PerlScript syntax. This
    seems helpful when porting from an IIS/PerlScript code base. Please see the
    CONFIG section for more info.

    The following objects in Apache::ASP respond as Collections:

            $Application
            $Session
            $Request->FileUpload *
            $Request->FileUpload('upload_file') *
            $Request->Form
            $Request->QueryString
            $Request->Cookies
            $Response->Cookies
            $Response->Cookies('some_cookie')       

      * FileUpload API Extensions

    And as such may be used with the following syntax, as compared with the
    Apache::ASP native calls. Please note the native Apache::ASP interface is
    compatible with the deprecated PerlScript interface.

     C = PerlScript Compatibility   N = Native Apache::ASP 
  
     ## Collection->Contents($name) 
     [C] $Application->Contents('XYZ')              
     [N] $Application->{XYZ}

     ## Collection->SetProperty($property, $name, $value)
     [C] $Application->Contents->SetProperty('Item', 'XYZ', "Fred");
     [N] $Application->{XYZ} = "Fred"
        
     ## Collection->GetProperty($property, $name)
     [C] $Application->Contents->GetProperty('Item', 'XYZ')         
     [N] $Application->{XYZ}

     ## Collection->Item($name)
     [C] print $Request->QueryString->Item('message'), "<br>\n\n";
     [N] print $Request->{QueryString}{'message'}, "<br>\n\n";              

     ## Working with Cookies
     [C] $Response->SetProperty('Cookies', 'Testing', 'Extra');
     [C] $Response->SetProperty('Cookies', 'Testing', {'Path' => '/'});
     [C] print $Request->Cookies(Testing) . "<br>\n";
     [N] $Response->{Cookies}{Testing} = {Value => Extra, Path => '/'};
     [N] print $Request->{Cookies}{Testing} . "<br>\n";

    Several incompatibilities exist between PerlScript and Apache::ASP:

     > Collection->{Count} property has not been implemented.
     > VBScript dates may not be used for Expires property of cookies.
     > Win32::OLE::in may not be used.  Use keys() to iterate over.
     > The ->{Item} property does not work, use the ->Item() method.

STYLE GUIDE
    Here are some general style guidelines. Treat these as tips for best
    practices on Apache::ASP development if you will.

  UseStrict
    One of perl's blessings is also its bane, variables do not need to be
    declared, and are by default globally scoped. The problem with this in
    mod_perl is that global variables persist from one request to another even
    if a different web browser is viewing a page.

    To avoid this problem, perl programmers have often been advised to add to
    the top of their perl scripts:

      use strict;

    In Apache::ASP, you can do this better by setting:

README  view on Meta::CPAN


          sub handler {
            my $r = shift; # get the Apache request object

            # if not a Mozilla User Agent, then disable sessions explicitly
            unless($r->headers_in('User-Agent') =~ /^Mozilla/) {
               $r->dir_config('AllowSessionState', 'Off');
            }

            return 200; # return OK mod_perl status code
          }

          1;

         </Perl>

        This will configure your environment before Apache::ASP executes and
        sees the configuration settings. You can use the mod_perl API in this
        way to configure Apache::ASP at runtime.

        Note that the Session Manager is very robust on its own, and denial of
        service attacks of the types that spiders and other web bots normally
        execute are not likely to affect the Session Manager significantly.

    How can I use $Session to store a $dbh database handle ?
        You cannot use $Session to store a $dbh handle. This can be awkward for
        those coming from the IIS/NT world, where you could store just about
        anything in $Session, but this boils down to a difference between
        threads vs. processes.

        Database handles often have per process file handles open, which cannot
        be shared between requests, so though you have stored the $dbh data in
        $Session, all the other initializations are not relevant in another
        httpd process.

        All is not lost! Apache::DBI can be used to cache database connections
        on a per process basis, and will work for most cases.

  Development
    VBScript or JScript supported?
        Only Perl scripting is supported with this module.

    How is database connectivity handled?
        Database connectivity is handled through perl's DBI & DBD interfaces. In
        the UNIX world, it seems most databases have cross platform support in
        perl. You can find the book on DBI programming at
        http://www.oreilly.com/catalog/perldbi/

        DBD::ODBC is often your ticket on Win32. On UNIX, commercial vendors
        like OpenLink Software (http://www.openlinksw.com/) provide the nuts and
        bolts for ODBC.

        Database connections can be cached per process with Apache::DBI.

    What is the best way to debug an ASP application ?
        There are lots of perl-ish tricks to make your life developing and
        debugging an ASP application easier. For starters, you will find some
        helpful hints by reading the $Response->Debug() API extension, and the
        Debug configuration directive.

    How are file uploads handled?
        Please see the CGI section. File uploads are implemented through CGI.pm
        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

README  view on Meta::CPAN

    the .htaccess file, move settings into *.conf Apache files.

    Instead of StatINC, try using the StatINCMatch config, which will check a
    small subset of perl libraries for changes. This config is fine for a
    production environment, and if used well might only incur a 10-20%
    performance penalty, depending on the number of modules your system loads in
    all, as each module needs to be checked for changes on a per request basis.

  Turn off Debugging
    Turn off system debugging by setting Debug to 0-3. Having the system debug
    config option on slows things down immensely, but can be useful when
    troubleshooting your application. System level debugging is settings -3
    through -1, where user level debugging is 1 to 3. User level debugging is
    much more light weight depending on how many $Reponse->Debug() statements
    you use in your program, and you may want to leave it on.

  Memory Sparing, NoCache
    If you have a lot (1000's+) of scripts, and limited memory, set NoCache to
    1, so that compiled scripts are not cached in memory. You lose about 10-15%
    in speed for small scripts, but save at least 10K RAM per cached script.
    These numbers are very rough and will largely depend on the size of your
    scripts and includes.

  Resource Limits
    Make sure your web processes do not use too many resources like CPU or RAM
    with the handy Apache::Resource module. Such a config might look like:

     PerlModule Apache::Resource
     PerlSetEnv PERL_RLIMIT_CPU  1000
     PerlSetEnv PERL_RLIMIT_DATA 60:60

    If ever a web process should begin to take more than 60M ram or use more
    than 1000 CPU seconds, it will be killed by the OS this way. You only want
    to use this configuration to protect against runaway processes and web
    program errors, not for terminating a normally functioning system, so set
    these limits HIGH!

SEE ALSO
    perl(1), mod_perl(3), Apache(3), MLDBM(3), HTTP::Date(3), CGI(3),
    Win32::OLE(3)

NOTES
    Many thanks to those who helped me make this module a reality. With Apache +
    ASP + Perl, web development could not be better!

    Special thanks go to my father Kevin & wife Lina for their love and support
    through it all, and without whom none of it would have been possible.

    Other honorable mentions include:

     !! Gregory Youngblood, Thanos Chatziathanassiou, & Tsirkin Evgeny for keeping the flame alive!

     :) Doug MacEachern, for moral support and of course mod_perl
     :) Helmut Zeilinger, Skylos, John Drago, and Warren Young for their help in the community
     :) Randy Kobes, for the win32 binaries, and for always being the epitome of helpfulness
     :) Francesco Pasqualini, for bug fixes with stand alone CGI mode on Win32
     :) Szymon Juraszczyk, for better ContentType handling for settings like Clean.
     :) Oleg Kobyakovskiy, for identifying the double Session_OnEnd cleanup bug.
     :) Peter Galbavy, for reporting numerous bugs and maintaining the OpenBSD port.
     :) Richard Curtis, for reporting and working through interesting module 
        loading issues under mod_perl2 & apache2, and pushing on the file upload API.
     :) Rune Henssel, for catching a major bug shortly after 2.47 release,
        and going to great lengths to get me reproducing the bug quickly.
     :) Broc, for keeping things filter aware, which broke in 2.45,
        & much help on the list.
     :) Manabu Higashida, for fixes to work under perl 5.8.0
     :) Slaven Rezic, for suggestions on smoother CPAN installation
     :) Mitsunobu Ozato, for working on a japanese translation of the site & docs.
     :) Eamon Daly for persistence in resolving a MailErrors bug.
     :) Gert, for help on the mailing list, and pushing the limits of use on Win32 
        in addition to XSLT.
     :) Maurice Aubrey, for one of the early fixes to the long file name problem.
     :) Tom Lancaster, for pushing the $Server->Mail API and general API discussion.
     :) Ross Thomas, for pushing into areas so far unexplored.
     :) Harald Kreuzer, for bug discovery & subsequent testing in the 2.25 era.
     :) Michael Buschauer for his extreme work with XSLT.
     :) Dariusz Pietrzak for a nice parser optimization.
     :) Ime Smits, for his inode patch facilitating cross site code reuse, and
        some nice performance enhancements adding another 1-2% speed.
     :) Michael Davis, for easier CPAN installation.
     :) Brian Wheeler, for keeping up with the Apache::Filter times,
        and pulling off filtering ASP->AxKit.
     :) Ged Haywood, for his great help on the list & professionally.
     :) Vee McMillen, for OSS patience & understanding.
     :) Craig Samuel, at LRN, for his faith in open source for his LCEC.
     :) Geert Josten, for his wonderful work on XML::XSLT
     :) Gerald Richter, for his Embperl, collaboration and competition!
     :) Stas Bekman, for his beloved guide, and keeping us all worldly.
     :) Matt Sergeant, again, for ever the excellent XML critique.
     :) Remi Fasol + Serge Sozonoff who inspired cookieless sessions.
     :) Matt Arnold, for the excellent graphics !
     :) Adi, who thought to have full admin control over sessions
     :) Dmitry Beransky, for sharable web application includes, ASP on the big.
     :) Russell Weiss again, for finding the internal session garbage collection 
        behaving badly with DB_File sensitive i/o flushing requirements.
     :) Tony Merc Mobily, inspiring tweaks to compile scripts 10 times faster
     :) Paul Linder, who is Mr. Clean... not just the code, its faster too !
        Boy was that just the beginning.  Work with him later facilitated better
        session management and XMLSubsMatch custom tag technology.
     :) Russell Weiss, for being every so "strict" about his code.
     :) Bill McKinnon, who understands the finer points of running a web site.
     :) Richard Rossi, for his need for speed & boldly testing dynamic includes.
     :) Greg Stark, for endless enthusiasm, pushing the module to its limits.
     :) Marc Spencer, who brainstormed dynamic includes.
     :) Doug Silver, for finding most of the bugs.
     :) Darren Gibbons, the biggest cookie-monster I have ever known.
     :) Ken Williams, for great teamwork bringing full SSI to the table
     :) Matt Sergeant, for his great tutorial on PerlScript and love of ASP
     :) Jeff Groves, who put a STOP to user stop button woes
     :) Alan Sparks, for knowing when size is more important than speed
     :) Lincoln Stein, for his blessed CGI.pm module
     :) Michael Rothwell, for his love of Session hacking
     :) Francesco Pasqualini, for bringing ASP to CGI
     :) Bryan Murphy, for being a PerlScript wiz
     :) Lupe Christoph, for his immaculate and stubborn testing skills
     :) Ryan Whelan, for boldly testing on Unix in the early infancy of ASP

SUPPORT
  COMMUNITY
    Mailing List Archives
        Try the Apache::ASP mailing list archive first when working through an

README  view on Meta::CPAN


     + = 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
           and linked to them from the docs RESOURCES section

         (d) Updated documention for the $Application->SessionCount API

         + Scripts with named subroutines, which is warned against in the style guide,
           will not be cached to help prevent my closure problems that often
           hurt new developers working in mod_perl environments.  The downside
           is that these script will have a performance penalty having to be
           recompiled each invocation, but this will kill many closure caching 
           bugs that are hard to detect.

         - $Request->FileUpload('upload_file', 'BrowserFile') would return
           a glob before that would be the file name in scalar form.  However
           this would be interpreted as a reference incorrectly.  The fix
           is to make sure this is always a scalar by stringifying 
           this data internally.  Thanks to Richard Curtis for pointing
           out this bug.

    $VERSION = 2.51; $DATE="02/10/2003"
         + added t/session_query_parse.t test to cover use of SessionQueryParse
           and $Server->URL APIs

         - Fixed duplicate "&" bug associated with using $Server->URL 
           and SessionQueryParse together

         + Patch to allow $Server->URL() to be called multiple times on the same URL
           as in $Server->URL($Server->URL($url, \%params), \%more_params)

         (d) Added new testimonials & sites & created a separate testimonials page.

         - SessionQueryParse will now add to &amp; to the query strings
           embedded in the HTML, instead of & for proper HTML generation.
           Thanks to Peter Galbavy for pointing out and Thanos Chatziathanassiou
           for suggesting the fix.

         - $Response->{ContentType} set to text/html for developer error reporting,
           in case this was set to something else before the error occured.
           Thanks to Philip Mak for reporting.

         - Couple of minor bug fixes under PerlWarn use, thanks Peter Galbavy
           for reporting.

         + Added automatic load of "use Apache2" for compat with mod_perl2 
           request objects when Apache::ASP is loaded via "PerlModule Apache::ASP"
           Thanks to Richard Curtis for reporting bug & subsequent testing.

         - When GlobalPackage config changes, but global.asa has not, global.asa
           will be recompiled anyway to update the GlobalPackage correctly.
           Changing GlobalPackage before would cause errors if global.asa was
           already compiled.

         ++ For ANY PerlSetVar type config, OFF/Off/off will be assumed 
            to have value of 0 for that setting.  Before, only a couple settings
            had this semantics, but they all do now for consistency.

         - Fix for InodeNames config on OpenBSD, or any OS that might have
           a device # of 0 for the file being stat()'d, thanks to Peter Galbavy
           for bug report.

         ++ Total XSLT speedups, 5-10% on large XSLT, 10-15% on small XSLT

         + bypass meta data check like expires for XSLT Cache() API use
           because XSLT tranformations don't expire, saves hit to cache dbm
           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"

README  view on Meta::CPAN


    $VERSION = 2.29; $DATE="11/19/2001";
         +Added some extra help text to the ./cgi/asp --help message
          to clarify how to pass arguments to a script from the command line.

         +When using $Server->Mail() API, if Content-Type header is set,
          and MIME-Version is not, then a "MIME-Version: 1.0" header will be sent
          for the email.  This is correct according to RFC 1521 which specifies
          for the first time the Content-Type: header for email documents.
          Thanks to Philip Mak for pointing out this correct behavior.

         +Made dependent on MLDBM::Sync version .25 to pass the taint_check.t test

         +Improved server_mail.t test to work with mail servers were relaying is denied

         +Added <html><body> tags to MailErrorsTo email

         --Fixed SessionCount / Session_OnEnd bug, where these things were not
          working for $Sessions that never had anything written to them.
          This bug was introduced in 2.23/2.25 release.

          There was an optimization in 2.23/2.25 where a $Session that was never
          used does not write its state lock file & dbm files to disk, only if
          it gets written too like $Session->{MARK}++.  Tracking of these NULL $Sessions 
          then is handled solely in the internal database.  For $Session garbage 
          collection though which would fire Session_OnEnd events and update 
          SessionCount, the Apache::ASP::State->GroupMembers() function was just 
          looking for state files on disk ... now it looks in the internal database 
          too for SessionID records for garbage collection.

          Added a test at ./t/session_events.t for these things.

         +Some optimizations for $Session API use.

         +Added support for XSLT via XML::LibXSLT, patch courtesy of Michael Buschauer

         -Got rid of an warning when recompiling changing includes under perl 5.6.1...
          undef($code) method did not work for this perl version, rather undef(&$code) does.
          Stopped using using Apache::Symbol for this when available.

         -Make Apache::ASP script run under perl taint checking -T for perl 5.6.1...
          $code =~ tr///; does not work to untaint here, so much use the slower:
          $code =~ /^(.*)$/s; $code = $1; method to untaint.

         -Check for inline includes changing, included in a dynamic included
          loaded at runtime via $Response->Include().  Added test case for
          this at t/include_change.t.  If an inline include of a dynamic include
          changes, the dynamic include should get recompiled now.

         -Make OK to use again with PerlTaintCheck On, with MLDBM::Sync 2.25.
          Fixed in ASP.pm, t/global.asa, and created new t/taint_check.t test script

         +Load more modules when Apache::ASP is loaded so parent will share more
          with children httpd: 
           Apache::Symbol 
           Devel::Symdump 
           Config 
           lib 
           MLDBM::Sync::SDBM_File

         +When FileUploadMax bytes is exceeded for a file upload, there will not
          be an odd error anymore resulting from $CGI::POST_MAX being triggered,
          instead the file upload input will simply be ignored via $CGI::DISABLE_UPLOADS.
          This gives the developer the opportunity to tell the user the the file upload
          was too big, as demonstrated by the ./site/eg/file_upload.asp example.

          To not let the web client POST a lot of data to your scripts as a form
          of a denial of service attack use the apache config LimitRequestBody for the 
          max limits.  You can think of PerlSetVar FileUploadMax as a soft limit, and 
          apache's LimitRequestBody as a hard limit.

         --Under certain circumstances with file upload, it seems that IsClientConnected() 
          would return an aborted client value from $r->connection->aborted, so
          the buffer output data would not be flushed to the client, and 
          the HTML page would return to the browser empty.  This would be under
          normal file upload use.  One work-around was to make sure to initialize
          the $Request object before $Response->IsClientConnected is called,
          then $r->connection->aborted returns the right value.
  
          This problem was probably introduced with IsClientConnected() code changes
          starting in the 2.25 release.

    $VERSION = 2.27; $DATE="10/31/2001";
         + Wrapped call to $r->connection->fileno in eval {} so to 
           preserve backwards compatibility with older mod_perl versions
           that do not have this method defined.  Thanks to Helmut Zeilinger
           for catching this.

         + removed ./dev directory from distribution, useless clutter

         + Removed dependency on HTTP::Date by taking code into
           Apache::ASP as Apache::ASP::Date.  This relieves
           the dependency of Apache::ASP on libwww LWP libraries.
           If you were using HTTP::Date functions before without loading
           "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.

README  view on Meta::CPAN

          harmless bug this was that just generated the wrong
          system debugging message.

    $VERSION = 2.19; $DATE="7/10/2001";
         +update docs in various parts

         +added ./make_httpd/build_httpds.sh scripts for quick builds
          of apache + mod_perl + mod_ssl

         ++plain CGI mode available for ASP execution.  
          cgi/asp script can now be used to execute ASP 
          scripts in CGI mode.  See CGI perldoc section for more info.
          The examples in ./site/eg have been set up to run
          in cgi mode if desired.  Configuration in CGI section
          only tested for Apache on Linux.

         -Fixed some faulty or out of date docs in XML/XSLT section.

         +added t/server_mail.t test for $Server->Mail(), requires
          Net::SMTP to be configured properly to succeed.

         +Net::SMTP debugging not enabled by Debug 1,2,3 configs,
          not only when system debugging is set with Debug -1,-2,-3
          However, a Debug param passed to $Server->Mail() will 
          sucessfully override the Debug -1,-2,-3 setting even
          when its Debug => 0

         -Check for undef values during stats for inline includes
          so we don't trigger unintialized warnings

         +Documented ';' may separate many directories in the IncludesDir
          setting for creating a more flexible includes search path.

    $VERSION = 2.17; $DATE="6/17/2001";
         +Added ASP perl mmm-mode subclass and configuration
          in editors/mmm-asp-perl.el file for better emacs support.
          Updated SYNTAX/Editors documentation.

         +Better debugging error message for Debug 2 or 3 settings 
          for global.asa errors.  Limit debug output for lines
          preceding rendered script.

         -In old inline include mode, there should no longer
          be the error "need id for includes" when using
          $Response->Include() ... if DynamicIncludes were
          enabled, this problem would not have likely occured
          anyway.  DynamicIncludes are preferrable to use so
          that compiled includes can be shared between scripts.
          This bug was likely introduced in version 2.11.

         -Removed logging from $Response->BinaryWrite() in regular
          debug mode 1 or 2.  Logging still enabled in system Debug mode, -1 or -2

         -Removed other extra system debugging call that is really not
          necessary.

    $VERSION = 2.15; $DATE="06/12/2001";
         -Fix for running under perl 5.6.1 by removing parser optimization
          introduced in 2.11.

         -Now file upload forms, forms with ENCTYPE="multipart/form-data"
          can have multiple check boxes and select items marked for 
          @params = $Request->Form('param_name') functionality.  This 
          will be demonstrated via the ./site/eg/file_upload.asp example.

    $VERSION = 2.11; $DATE="05/29/2001";
         +Parser optimization from Dariusz Pietrzak

         -work around for global destruction error message for perl 5.6
          during install

         +$Response->{IsClientConnected} now will be set
          correctly with ! $r->connection->aborted after each
          $Response->Flush()

         +New XSLTParser config which can be set to XML::XSLT or
          XML::Sablotron.  XML::Sablotron renders 10 times faster, 
          but differently.  XML::XSLT is pure perl, so has wider
          platform support than XML::Sablotron.  This config affects
          both the XSLT config and the $Server->XSLT() method.

         +New $Server->XSLT(\$xsl_data, \$xml_data) API which 
          allows runtime XSLT on components instead of having to process
          the entire ASP output as XSLT.  

         -XSLT support for XML::XSL 0.32.  Things broke after .24.

         -XSLTCacheSize config no longer supported.  Was a bad 
          Tie::Cache implementation.  Should be file based cache
          to greatly increases cache hit ratio.

         ++$Response->Include(), $Response->TrapInclude(),
          and $Server->Execute() will all take a scalar ref
          or \'asdfdsafa' type code as their first argument to execute 
          a raw script instead of a script file name.  At this time, 
          compilation of such a script, will not be cached.  It is 
          compiled/executed as an anonymous subroutine and will be freed
          when it goes out of scope.

         + -p argument to cgi/asp script to set GlobalPackage
          config for static site builds

         -pod commenting fix where windows clients are used for 
          ASP script generation.

         +Some nice performance enhancements, thank to submissions from
          Ime Smits.  Added some 1-2% per request execution speed.

         +Added StateDB MLDBM::Sync::SDBM_File support for faster
          $Session + $Application than DB_File, yet still overcomes
          SDBM_File's 1024 bytes value limitation.  Documented in 
          StateDB config, and added Makefile.PL entry.

         +Removed deprecated MD5 use and replace with Digest::MD5 calls

         +PerlSetVar InodeNames 1 config which will compile scripts hashed by 
          their device & inode identifiers, from a stat($file)[0,1] call.
          This allows for script directories, the Global directory,
          and IncludesDir directories to be symlinked to without
          recompiling identical scripts.  Likely only works on Unix
          systems.  Thanks to Ime Smits for this one.

         +Streamlined code internally so that includes & scripts were
          compiled by same code.  This is a baby step toward fusing

README  view on Meta::CPAN


         +MailFrom config option that defaults the From: field for 
          mails sent via the Mail* configs and $Server->Mail()

         +$Server->Mail(\%mail, %smtp_args) API extension

         +MailErrorsTo & MailAlertTo now can take comma
          separated email addresses for multiple recipients.

         -tracking of subroutines defined in scripts and includes so 
          StatINC won't undefine them when reloading the GlobalPackage, 
          and so an warning will be logged when another script redefines 
          the same subroutine name, which has been the bane of at least
          a few developers.

         -Loader() will now recompile dynamic includes that 
          have changed, even if main including script has not.
          This is useful if you are using Loader() in a 
          PerlRestartHandler, for reloading scripts when
          gracefully restarting apache.

         -Apache::ASP used to always set the status to 200 by 
          default explicitly with $r->status().  This would be 
          a problem if a script was being used to as a 404 
          ErrorDocument, because it would always return a 200 error
          code, which is just wrong.  $Response->{Status} is now 
          undefined by default and will only be used if set by 
          the developer.  

          Note that by default a script will still return a 200 status, 
          but $Response->{Status} may be used to override this behavior.

         +$Server->Config($setting) API extension that allows developer
          to access config settings like Global, StateDir, etc., and is a 
          wrapper around Apache->dir_config($setting)

         +Loader() will log the number of scripts
          recompiled and the number of scripts checked, instead
          of just the number of scripts recompiled, which is
          misleading as it reports 0 for child httpds after
          a parent fork that used Loader() upon startup.        

         -Apache::ASP->Loader() would have a bad error if it didn't load 
          any scripts when given a directory, prints "loaded 0 scripts" now

    $VERSION = 0.18; $DATE="02/03/2000";
         +Documented SessionQuery* & $Server->URL() and 
          cleaned up formatting some, as well as redoing
          some of the sections ordering for better readability.
          Document the cookieless session functionality more
          in a new SESSIONS section.  Also documented new 
          FileUpload configs and $Request->FileUpload collection.
          Documented StatScripts.

         +StatScripts setting which if set to 0 will not reload
          includes, global.asa, or scripts when changed.

         +FileUpload file handles cleanup at garbage collection
          time so developer does not have to worry about lazy coding
          and undeffing filehandles used in code.  Also set 
          uploaded filehandles to binmode automatically on Win32 
          platforms, saving the developer yet more typing.

         +FileUploadTemp setting, default 0, if set will leave
          a temp file on disk during the request, which may be 
          helpful for processing by other programs, but is also
          a security risk in that others could potentially read 
          this file while the script is running. 

          The path to the temp file will be available at
          $Request->{FileUpload}{$form_field}{TempFile}.
          The regular use of file uploads remains the same
          with the <$filehandle> to the upload at 
          $Request->{Form}{$form_field}.

         +FileUploadMax setting, default 0, currently an 
          alias for $CGI::POST_MAX, which determines the 
          max size for a file upload in bytes.  

         +SessionQueryParse only auto parses session-ids
          into links when a session-id COOKIE is NOT found.
          This feature is only enabled then when a user has
          disabled cookies, so the runtime penalty of this
          feature won't drag down the whole site, since most
          users will have cookies turned on.   

         -StatINC & StatINCMatch will not undef Fnctl.pm flock 
          functions constants like O_RDWR, because the code references
          are not well trackable.  This would result in sporadic 500 server
          errors when a changed module was reloaded that imported O_* flock 
          functions from Fnctl.

         +SessionQueryParse & SessionQueryParseMatch
          settings that enable auto parsing session ids into 
          URLs for cookieless sessions.  Will pick up URLs in 
          <a href>, <area href>, <form action>, <frame src>,
          <iframe src>, <img src>, <input src>, <link href>
          $Response->Redirect($URL) and the first URL in 
          script tags like <script>*.location.href=$URL</script>

          These settings require that buffering be enabled, as
          Apache::ASP will parse through the buffer to parse the URLs.

          With SessionQueryParse on, it will just parse non-absolute
          URLs, but with SessionQueryParseMatch set to some server
          url regexp, like ^http://localhost , will also parse
          in the session id for URLs that match that.

          When testing, the performance hit from this parsing
          a script dropped from 12.5 hits/sec on my WinNT box
          to 11.7 hits per second for 1K of buffered output.
          The difference is .007 of my PII300's processing power
          per second.

          For 10K of output then, my guess is that this speed
          of script, would be slowed to 6.8 hits per second.
          This kind of performance hit would also slow a
          script running at 40 hits per second on a UNIX box
          to 31 hits/sec for 1K, and to 11 hits/sec for 10K parsed.

          Your mileage may vary and you will have to test the difference
          yourself.  Get yourself a valid URL with a session-id in
          it, and run it through ab, or Socrates, with SessionQuery
          turned on, and then with SessionQueryParse set to see 
          the difference.  SessionQuery just enables of session id
          setting from the query string but will not auto parse urls.

         -If buffering, Content-Length will again be set.
          It broke, probably while I was tuning in the past 
          couple versions.

         +UseStrict setting compiles all scripts including
          global.asa with "use strict" turned on for catching
          more coding errors.  With this setting enabled,
          use strict errors die during compilation forcing
          Apache::ASP to try to recompile the script until
          successful.

README  view on Meta::CPAN

                $Session->{count}++;
                $Session->UnLock();     

          This method will reduce the number of ties to the $Session database
          from 6 to 1 for this kind of code, and will improve the performance
          dramatically.

          Also, instead of using explicit $Session locking, you can 
          create an automatic lock on $Session per script by setting
          SessionSerialize in your config to 1.  The danger here is
          if you have any long running scripts, the user will have
          to wait for it to finish before another script can be run.

          To see the number of lock/unlocks or ties/unties to each database
          during a script execution, look at the last lines of debug output
          to your error log when Debug is set to 1.  This can help you
          performance tweak access to these databases.

         +Updated documentation with new config settings and
          API extensions.

         +Added AllowApplicationState config option which allows
          you to leave $Application undefined, and will not
          execute Application_OnStart or Application_OnEnd.
          This can be a slight performance increase of 2-3% if
          you are not using $Application, but are using $Session.

         +Added $Session->Lock() / $Session->UnLock() API routines
          necessary additions since access to session is not
          serialized by default like IIS ASP.  Also prompted
          by change in locking code which retied to SDBM_File
          or DB_File each lock.  If you $Session->Lock / UnLock
          around many read/writes, you will increase performance.

         +Added StateCache config which, if set will cache
          the file handle locks for $Application and an internal 
          database used for tracking $Session info.  This caching can 
          make an ASP application perform up to 10% faster,
          at a cost of each web server process holding 2 more 
          cached file handles open, per ASP application using
          this configuration.  The data written to or read from
          these state databases is not cached, just the locking 
          file handles are held open.

         -Added in much more locking in session manager 
          and session garbage collector to help avoid collisions
          between the two.  There were definite windows that the
          two would collide in, during which bad things could 
          happen on a high volume site.

         -Fixed some warnings in DESTROY and ParseParams()

    $VERSION = 0.14; $DATE="07/29/1999";
         -CGI & StatINC or StatINCMatch would have bad results
          at times, with StatINC deleting dynamically compiled
          CGI subroutines, that were imported into other scripts
          and modules namespaces.

          A couple tweaks, and now StatINC & CGI play nice again ;)
          StatINCMatch should be safe to use in production with CGI. 
          This affects in particular environments that use file upload, 
          since CGI is loaded automatically by Apache::ASP to handle 
          file uploads.

          This fix should also affect other seemingly random 
          times when StatINC or StatINCMatch don't seem to do 
          the right thing.

         +use of ASP objects like $Response are now "use strict"
          safe in scripts, while UniquePackages config is set.

         +Better handling of "use strict" errors in ASP scripts.
          The error is detected, and the developer is pointed to the 
          Apache error log for the exact error.  

          The script with "use strict" errors will be recompiled again.  Its seems 
          though that "use strict" will only throw its error once, so that a script 
          can be recompiled with the same errors, and work w/o any use strict
          error messaging.

    $VERSION = 0.12; $DATE="07/01/1999";
         -Compiles are now 10 +times faster for scripts with lots of big
          embedded perl blocks <% #perl %>

          Compiles were slow because of an old PerlScript compatibility
          parsing trick where $Request->QueryString('hi')->{item}
          would be parsed to $Request->QueryString('hi') which works.
          I think the regexp that I was using had O(n^2) characteristics
          and it took a really big perl block to 10 +seconds to parse
          to understand there was a problem :(

          I doubt anyone needed this compatibility, I don't even see
          any code that looks like this in the online PerlScript examples,
          so I've commented out this parsing trick for now.  If you 
          need me to bring back this functionality, it will be in the 
          form of a config setting.

          For information on PerlScript compatibility, see the PerlScript
          section in the ASP docs.

         -Added UniquePackages config option, that if set brings back 
          the old method of compiling each ASP script into its own
          separate package.  As of v.10, scripts are compiled by default
          into the same package, so that scripts, dynamic includes & global.asa
          can share globals.  This BROKE scripts in the same ASP Application
          that defined the same sub routines, as their subs would redefine
          each other.  

          UniquePackages has scripts compiled into separate perl packages,
          so they may define subs with the same name, w/o fear of overlap.
          Under this settings, scripts will not be able to share globals.  

         -Secure field for cookies in $Response->Cookies() must be TRUE to 
          force cookie to be secure.  Before, it just had to be defined, 
          which gave wrong behavior for Secure => 0. 

         +$Response->{IsClientConnected} set to one by default.  Will
          work out a real value when I upgrade to apache 1.3.6.  This
          value has no meaning before, as apache aborts the perl code
          when a client drops its connection in earlier versions.

         +better compile time debugging of dynamic includes, with 
          Debug 2 setting

README  view on Meta::CPAN


            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 
          have a process spin out of control. (PORTABLE ? probably not)

         +Allow <!--include file=file.inc--> notation w/o quotes around file names

         -PerlSetEnv apache conf setting now get passed through to 
          $Request->ServerVariables. This update has ServerVariables 
          getting data from %ENV instead of $r->cgi_env

         +README FAQ for PerlHandler errors

    $VERSION = 0.08; $DATE="02/06/1999";
         ++SSI with Apache::Filter & Apache::SSI, see config options & ./eg files
          Currently filtering only works in the direction Apache::ASP -> Apache::SSI,
          will not work the other way around, as SSI must come last in a set of filters

         +SSI file includes may reference files in the Global directory, better 
          code sharing

         - <% @array... %> no longer dropped from code.

         +perl =pod comments are stripped from script before compiling, and associated
          PodComments configuration options.

         +Command line cgi/asp script takes various options, and allows execution
          of multiple asp scripts at one time.  This script should be used for
          command line debugging.  This is also the beginning of building
          a static site from asp scripts with the -b option, suppressing headers.

         +$Response->AddHeader('Set-Cookie') works for multiple cookies.

         -$Response->Cookies('foo', '0') works, was dropping 0 because of boolean test

         -Fixed up some config doc errors.

    $VERSION = 0.07; $DATE="01/20/1999";
         -removed SIG{__WARN__} handler, it was a bad idea.

         -fixes file locking on QNX, work around poor flock porting

         +removed message about Win32::OLE on UNIX platforms from Makefile.PL

         -Better lock garbage collection.  Works with StatINC seamlessly.

         -Multiple select forms now work in array context with $Response->Form()
                @values = $Response->Form('multi');

         -Better CGI.pm compatibility with $r->header_out('Content-type'),
          improved garbage collection under modperl, esp. w/ file uploads

    $VERSION = 0.06; $DATE="12/21/1998";
         +Application_OnStart & Application_OnEnd event handlers support.

         -Compatible with CGI.pm 2.46 headers() 

         -Compatible with CGI.pm $q = new CGI({}), caveat: does not set params 

         +use strict; followed by use of objects like $Session is fine.

         -Multiple cookies may be set per script execution.

         +file upload implemented via CGI.pm

         ++global.asa implemented with events Session_OnStart and Session_OnEnd
          working appropriately.

         +StateDir configuration directive implemented.
          StateDir allows the session state directory to be specified separately 
          from the Global directory, useful for operating systems with caching file 
          systems.

         +StateManager config directive.  StateManager specifies how frequently
          Sessions are cleaned up, with 10 (default) meaning that old Sessions
          will be cleaned up 10 times per SessionTimeout period (default 20 minutes).

         +$Application->SessionCount() implemented, non-portable method.
                : returns the number of currently active sessions

         -STOP button fix.  Users may hit STOP button during script 
          execution, and Apache::ASP will cleanup with a routine registered
          in Apache's $r->register_cleanup.  Works well supposedly.

         +PerlScript compatibility work, trying to make ports smoother.
                : Collection emulator, no ->{Count} property
                : $.*(.*)->{Item} parsed automatically, 
                  shedding the ->{Item} for Collection support (? better way ?)
                : No VBScript dates support, just HTTP RFC dates with HTTP::Date
                : Win32::OLE::in not supported, just use "keys %{$Collection}"  

         +./cgi/asp script for testing scripts from the command line
                : will be upgraded to CGI method of doing asp
                : is not "correct" in anyway, so not documented for now
                  but still useful

         +strips DOS carriage returns from scripts automatically, so that
          programs like FrontPage can upload pages to UNIX servers
          without perl choking on the extra \r characters.

    $VERSION = 0.05; $DATE="10/19/1998";
         +Added PERFORMANCE doc, which includes benchmarks  +hints.

         +Better installation warnings and errors for other modules required. 

         -Turned off StatINC in eg/.htaccess, as not everyone installs Devel::Symdump

         -Fixed AUTOLOAD state bug, which wouldn't let you each through state
          objects, like %{$Session}, or each %$Session, (bug introduced in v.04)

         +Parses ASP white space better.  HTML output matches author's intent
          by better dealing with white space surrounding <% perl blocks %>

         -Scalar insertion code <%=$foo%> can now span many lines.

         +Added include.t test script for includes.

         +Script recompiles when included files change.

         +Files can be included in script with 
          SSI <!--#include file="filename"--> syntax, needs to be
          done in ASP module to allow compilation of included code and html 
          into script.  Future chaining with Apache::SSI will allow static 
          html includes, and other SSI directives

    $VERSION = 0.04; $DATE="10/14/1998";
         +Example script eg/cgi.htm demonstrating CGI.pm use for output.

         +Optimized ASP parsing, faster and more legible executing code
                : try 'die();' in code with setting PerlSetVar Debug 2

         +Cleaned up code for running with 'use strict'

         -Fixed directory handle leak on Solaris, from not closing after opendir()

         +StatINC overhaul.  StatINC setting now works as it should, with 
          the caveat that exported functions will not be refreshed.

         +NoState setting optimization, disallows $Application & $Session

         +$Application->*Lock() functions implemented

         -SoftRedirect setting for those who want scripts to keep running
          after a Redirect()

         +SessionSerialize setting to lock session while script is running
                : Microsoft ASP style session locking
                : For a session, scripts execute one at a time 
                : NOT recommended use, please see note.

         -MLDBM can be used for other things without messing up internal use
                : before if it was used with different DB's and serializers,
                  internal state could be lost.

         --State file locking.  Corruption worries, and loss of data no more.

         +CGI header support, developer can use CGI.pm for *output*, or just print()
                : print "Set-Cookie: test=cookie\n", and things will just work



( run in 1.059 second using v1.01-cache-2.11-cpan-b16cb0d3907 )