Hi Matt,

After sending two patches for AxKit::XSP::WebUtils on 16 Oct 2001 against 1.3_90 and on 15 Jun 2002 against 1.4 without getting any feedback I thought why not continue the tradition of my annual attempts...

Attached, the diff against the current CVS version adding missing docs and adding mostly XSP-as-(Access|Error)Handler-related tags including docs.

Don Michael de la Mancha

--
IT Services                University of Innsbruck
063A F25E B064 A98F A479  1690 78CD D023 5E2A 6688
http://zis.uibk.ac.at/.m/uibk.ac.at_pgp_pubkey.asc
Index: WebUtils.pm
===================================================================
RCS file: /home/cvs/AxKit-XSP-WebUtils/WebUtils.pm,v
retrieving revision 1.8
diff -u -r1.8 WebUtils.pm
--- WebUtils.pm 2003/06/17 19:49:25     1.8
+++ WebUtils.pm 2003/06/19 18:09:55
@@ -11,6 +11,8 @@
 use Apache;
 use Apache::Constants qw(OK);
 use Apache::Util;
+use Apache::Request;
+use Apache::URI;
 use Apache::AxKit::Language::XSP::TaglibHelper;
 sub parse_char  { Apache::AxKit::Language::XSP::TaglibHelper::parse_char(@_); }
 sub parse_start { Apache::AxKit::Language::XSP::TaglibHelper::parse_start(@_); 
}
@@ -32,6 +34,17 @@
   'return_code($code)',
   'username()',
   'password()',
+  'request_parsed_uri(;$omit)',
+  'request_prev_parsed_uri(;$omit)',
+  'request_prev_uri()',
+  'request_prev_query_string()',
+  'request_prev_param($name)',
+  'match_useragent($name)',
+  'is_https()',
+  'is_initial_req()',
+  'variant_list():as_xml=true',
+  'error_notes()',
+  'server_admin()',
 );
 
 @ISA = qw(Apache::AxKit::Language::XSP);
@@ -90,14 +103,14 @@
             $uri = "./$uri" if $uri =~ /^\./;
 
             # relative path, so let's resolve the path ourselves
-           my $base = $Request->uri;
+        my $base = $Request->uri;
             $base =~ s{[^/]*$}{};
-           $uri = "$base$uri";
-           $uri =~ s{//+}{/}g;
-           $uri =~ s{/.(/|$)}{/}g;                     # embedded ./
-           1 while ($uri =~ s{[^/]+/\.\.(/|$)}{}g);   # embedded ../
-           $uri =~ s{^(/\.\.)+(/|$)}{/}g;              # ../ off of "root"
-       }
+        $uri = "$base$uri";
+        $uri =~ s{//+}{/}g;
+        $uri =~ s{/.(/|$)}{/}g;                     # embedded ./
+        1 while ($uri =~ s{[^/]+/\.\.(/|$)}{}g);   # embedded ../
+        $uri =~ s{^(/\.\.)+(/|$)}{/}g;              # ../ off of "root"
+    }
 
         if (not defined $host) {
             $myhost = $Request->header_in("Host");
@@ -188,6 +201,94 @@
     return;
 }
 
+sub request_parsed_uri ($) {
+    my $omit = shift;
+    my $r = AxKit::Apache->request;
+    my $uri = Apache::URI->parse($r);
+
+    if ($omit eq 'path') {
+        $uri->path(undef);
+        $uri->query(undef); # we don't want a query without a path
+    }
+    elsif ($omit eq 'path_info' or $omit eq 'query') {
+        $uri->$omit(undef);
+    }
+
+    return $uri->unparse;
+}
+
+sub request_prev_parsed_uri ($) {
+    my $omit = shift;
+    my $r = AxKit::Apache->request;
+    my $uri = Apache::URI->parse($r->prev||$r);
+
+    if ($omit eq 'path') {
+        $uri->path(undef);
+        $uri->query(undef); # we don't want a query without a path
+    }
+    elsif ($omit eq 'path_info' or $omit eq 'query') {
+        $uri->$omit(undef);
+    }
+
+    return $uri->unparse;
+}
+
+sub request_prev_uri () {
+    my $r = AxKit::Apache->request;
+    return ($r->prev||$r)->uri;
+}
+
+sub request_prev_query_string () {
+    my $r = AxKit::Apache->request;
+    return ($r->prev||$r)->query_string;
+}
+
+sub request_prev_param ($) {
+    my $name = shift;
+    my $apr = 
Apache::Request->instance((AxKit::Apache->request->prev||AxKit::Apache->request));
+
+    return $apr->param($name);
+}
+
+sub match_useragent ($) {
+    my $name = shift;
+    my $r = AxKit::Apache->request;
+
+    return $r->header_in('User-Agent') =~ $name;
+}
+
+sub is_https () {
+    my $r = AxKit::Apache->request;
+    return 1 if $r->subprocess_env('https');
+}
+
+sub is_initial_req () {
+    my $r = AxKit::Apache->request;
+    return $r->is_initial_req;
+}
+
+sub variant_list () {
+    my $r = AxKit::Apache->request;
+    my $variant_list = ($r->prev||$r)->notes('variant-list');
+
+    $variant_list =~ s/([^:>])\n/$1<\/li>\n/g; # tidy up single li-tags 
because 
+                                               # mod_negotiation's list is not
+                                               # well-balanced up to Apache 
1.3.28
+
+    return $variant_list;
+}
+
+sub error_notes () {
+    my $r = AxKit::Apache->request;
+    return ($r->prev||$r)->notes('error-notes');
+}
+
+sub server_admin () {
+    my $r = AxKit::Apache->request;
+    return $r->server->server_admin;
+}
+
+
 1;
 
 __END__
@@ -250,7 +351,7 @@
 
 =head2 C<<web:request_uri/>>
 
-Returns the full URI of the current request
+Returns the requested URI minus optional query string
 
 =head2 C<<web:request_host/>>
 
@@ -331,6 +432,175 @@
   Your browser is: <web:header name="HTTP_USER_AGENT"/>
   </p>
 
+=head2 C<<web:return_code/>>
+
+This tag allows you to set the reply status for the client request.
+
+Parameters:
+
+=over 4
+
+=item code (required)
+
+The integer value of a valid HTTP status code.
+
+=back
+
+=head2 C<<web:username/>>
+
+Returns the name of the authenticated user.
+
+=head2 C<<web:password/>>
+
+If the current request is protected by Basic authentication, this tag
+will return the decoded password sent by the client.
+
+=head2 C<<web:request_parsed_uri>>
+
+This tag allows you to get the fully parsed URI for the current request.
+In contrast to <web:request_uri/> the parsed URI will always include things 
like
+scheme, hostname, or the querystring.
+
+Parameters:
+
+=over 4
+
+=item omit (optional)
+
+Valid values: B<path>, B<path_info>, and B<query>.
+If specified, the corresponding URL components will be ommited for the return 
value.
+
+=back
+
+=head2 C<<web:request_prev_parsed_uri>>
+
+This tag allows you to get the fully parsed URI for the previous request. This 
can be useful
+in 403 error documents where it is required to post login information back to 
the originally
+requested URI.
+
+Parameters:
+
+=over 4
+
+=item omit (optional)
+
+Valid values: B<path>, B<path_info>, and B<query>.
+If specified, the corresponding URL components will be ommited for the return 
value.
+
+=back
+
+Example:
+
+  <p>Access Denied. Please login</p>
+  <form method="post" name="login">
+      <xsp:attribute name="action">
+          <web:request_prev_parsed_uri omit="query"/>
+      </xsp:attribute>
+      ...
+
+=head2 C<<web:request_prev_uri/>>
+
+Returns the URI of the previous request minus optional query string
+
+=head2 C<<web:request_prev_query_string/>>
+
+Returns the query string of the previous request.
+
+=head2 C<<web:request_prev_param name="...">>
+
+Returns the value of the requested CGI parameter of the previous request.
+
+Parameters:
+
+=over 4
+
+=item name (required)
+
+The name of the parameter to be retrieved.
+
+=back
+
+=head2 C<<web:match_useragent name="...">>
+
+Returns true if the User Agent pattern in B<name> matches the current User 
Agent.
+
+Parameters:
+
+=over 4
+
+=item name (required)
+
+A User Agent pattern string to be matched.
+
+=back
+
+Example:
+
+  <xsp:logic>
+  if (!<web:match_useragent name="MSIE|Gecko|Lynx|Opera"/>) {
+  </xsp:logic>
+      <h1>Sorry, your Web browser is not supported.</h1>
+  <xsp:logic>
+  }
+  else {
+  </xsp:logic>
+  ...
+
+=head2 C<<web:is_https/>>
+
+Returns true if the current request comes in via SSL.
+
+Example:
+
+  <xsp:logic>
+  if (!<web:is_https/>) {
+  </xsp:logic>
+    <a>
+      <xsp:attribute name="href">
+        https://<web:request_host/><web:request_uri/>
+      </xsp:attribute>
+      use secure connection
+    </a>
+  <xsp:logic>
+  }
+  </xsp:logic>
+
+=head2 C<<web:is_initial_req/>>
+
+Returns true if the current request is the first internal request, returns
+false if the request is a sub-request or an internal redirect.
+
+=head2 C<<web:variant_list/>>
+
+Returns the list of variants returned by mod_negotation in case of a 406 HTTP 
status code.
+Useful for 406 error documents.
+
+Example:
+
+  <h1>406 Not Acceptable</h1>
+  <p>
+    An appropriate representation of the requested resource 
<web:request_prev_uri/>
+    could not be found on this server.
+  </p>
+  <web:variant_list/>
+
+=head2 C<<web:server_admin/>>
+
+Returns the value of the Apache "ServerAdmin" config directive.
+
+=head2 C<<web:error_notes/>>
+
+Returns the last 'error-notes' entry set by Apache. Useful for verbose 500 
error documents.
+
+Example:
+
+    <h1>Server Error</h1>
+
+    <p>An error occured. If the problem persists, please contact 
<web:server_admin/>.</p>
+    <p>Error Details:<br/>
+        <web:error_notes/>
+    </p>
+
 =head1 AUTHOR
 
 Matt Sergeant, [EMAIL PROTECTED]
@@ -343,3 +613,4 @@
 
 You may use or redistribute this software under the terms of either the
 Perl Artistic License, or the GPL version 2.0 or higher.
+

Attachment: pgpUTBCj83ctk.pgp
Description: PGP signature



Reply via email to