docs::a...Request(3)

πŸ“¦ version 2.0.13, in nixos 26.05, nixpkgs unstable

πŸ’– NAME πŸ’–

okay bestie, welcome to docs::a...Request(3) from the User Contributed Perl Documentation ✨ β€” this is the manual page for Apache2::SubRequest, aka the Perl API for Apache subrequests. πŸ¦‹

🌸 Synopsis 🌸

here's the whole vibe in code, no cap:

use Apache2::SubRequest ();

# run internal redirects at once
$r->internal_redirect($new_uri);
$r->internal_redirect_handler($new_uri);

# create internal redirect objects
$subr = $r->lookup_uri("/foo");
$subr = $r->lookup_method_uri("GET", "/tmp/bar")
$subr = $r->lookup_file("/tmp/bar");
# optionally manipulate the output through main request filters
$subr = $r->lookup_uri("/foo", $r->output_filters);
# now run them
my $rc = $subr->run;

πŸŽ€ Description πŸŽ€

Apache2::SubRequest contains API for creating and running of Apache sub-requests.

Apache2::SubRequest is a sub-class of Apache2::RequestRec object. πŸ’…

✨ API ✨

Apache2::SubRequest provides the following functions and/or methods:

πŸ’€ DESTROY

Free the memory associated with a sub request:

undef $subr; # but normally don't do that
  • obj: $subr (Apache2::SubRequest object) β€” the sub request to finish
  • ret: no return value
  • since: 2.0.00

DESTROY is called automatically when $subr goes out of scope.

If you want to free the memory earlier than that (for example if you run several subrequests), you can undef the object like this:

undef $subr;
🚨 but never call DESTROY explicitly, since it'll result in ap_destroy_sub_req being called more than once, resulting in multiple brain injuries and certain hair loss. πŸ˜­πŸ’€

πŸ” internal_redirect

Redirect the current request to some other uri internally:

$r->internal_redirect($new_uri);
  • obj: $r (Apache2::RequestRec object) β€” the current request
  • arg1: $new_uri (string) β€” the URI to replace the current request with
  • ret: no return value
  • since: 2.0.00

In case that you want some other request to be served as the top-level request instead of what the client requested directly, call this method from a handler, and then immediately return Apache2::Const::OK. The client will be unaware that a different request was served to her behind the scenes. πŸ‘€

πŸ”‚ internal_redirect_handler

Identical to internal_redirect, plus automatically sets $r->content_type is of the sub-request to be the same as of the main request, if $r->handler is true.

$r->internal_redirect_handler($new_uri);
  • obj: $r (Apache2::RequestRec object) β€” the current request
  • arg1: $new_uri (string) β€” the URI to replace the current request with.
  • ret: no return value
  • since: 2.0.00

This function is designed for things like actions or CGI scripts, when using AddHandler, and you want to preserve the content type across an internal redirect. 🎯

πŸ“ lookup_file

Create a subrequest for the given file. This sub request can be inspected to find information about the requested file:

$ret = $r->lookup_file($new_file);
$ret = $r->lookup_file($new_file, $next_filter);
  • obj: $r (Apache2::RequestRec object) β€” the current request
  • arg1: $new_file (string) β€” the file to lookup
  • opt arg2: $next_filter (Apache2::Filter) β€” see $r->lookup_uri for details.
  • ret: $ret (Apache2::SubRequest object) β€” the sub request record.
  • since: 2.0.00

See $r->lookup_uri for further discussion. 🫢

πŸ› οΈ lookup_method_uri

Create a sub request for the given URI using a specific method. This sub request can be inspected to find information about the requested URI:

$ret = $r->lookup_method_uri($method, $new_uri);
$ret = $r->lookup_method_uri($method, $new_uri, $next_filter);
  • obj: $r (Apache2::RequestRec object) β€” the current request
  • arg1: $method (string) β€” the method to use in the new sub request (e.g. "GET")
  • arg2: $new_uri (string) β€” the URI to lookup
  • opt arg3: $next_filter (Apache2::Filter object) β€” see $r->lookup_uri for details.
  • ret: $ret (Apache2::SubRequest object) β€” the sub request record.
  • since: 2.0.00

See $r->lookup_uri for further discussion. πŸ’–

πŸ”Ž lookup_uri

Create a sub request from the given URI. This sub request can be inspected to find information about the requested URI.

$ret = $r->lookup_uri($new_uri);
$ret = $r->lookup_uri($new_uri, $next_filter);
  • obj: $r (Apache2::RequestRec object) β€” the current request
  • arg1: $new_uri (string) β€” the URI to lookup
  • opt arg2: $next_filter (Apache2::Filter object) β€” the first filter the subrequest should pass the data through. If not specified it defaults to the first connection output filter for the main request $r->proto_output_filters. So if the subrequest sends any output it will be filtered only once. If for example you desire to apply the main request's output filters to the sub-request output as well pass $r->output_filters as an argument.
  • ret: $ret (Apache2::SubRequest object) β€” the sub request record
  • since: 2.0.00

Here is an example of a simple subrequest which serves uri /new_uri:

sub handler {
    my $r = shift;

    my $subr = $r->lookup_uri("/new_uri");
    $subr->run;

    return Apache2::Const::OK;
}

If let's say you have three request output filters registered to run for the main request:

PerlOutputFilterHandler MyApache2::SubReqExample::filterA
PerlOutputFilterHandler MyApache2::SubReqExample::filterB
PerlOutputFilterHandler MyApache2::SubReqExample::filterC

and you wish to run them all, the code needs to become:

my $subr = $r->lookup_uri("/new_uri", $r->output_filters);

and if you wish to run them all, but the first one (filterA), the code needs to be adjusted to be:

my $subr = $r->lookup_uri("/new_uri", $r->output_filters->next);

▢️ run

Run a sub-request:

$rc = $subr->run();
  • obj: $subr (Apache2::RequestRec object) β€” the sub-request (e.g. returned by lookup_uri)
  • ret: $rc (integer) β€” the return code of the handler (Apache2::Const::OK, Apache2::Const::DECLINED, etc.)
  • since: 2.0.00

🚧 Unsupported API 🚧

Apache2::SubRequest also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the the mod_perl development mailing list so we can help each other take the steps necessary to shift the method to an officially supported API. πŸ‘‘

⚑ internal_fast_redirect

META: Autogenerated - needs to be reviewed/completed

Redirect the current request to a sub_req, merging the pools:

$r->internal_fast_redirect($sub_req);
  • obj: $r (Apache2::RequestRec object) β€” the current request
  • arg1: $sub_req (string) β€” a subrequest created from this request
  • ret: no return value
  • since: 2.0.00

META: httpd-2.0/modules/http/http_request.c declares this function as:

/* XXX: Is this function is so bogus and fragile that we deep-6 it? */

do we really want to expose it to mod_perl users? πŸ™ˆ

πŸ“‚ lookup_dirent

META: Autogenerated - needs to be reviewed/completed

Create a sub request for the given apr_dir_read result. This sub request can be inspected to find information about the requested file:

$lr = $r->lookup_dirent($finfo);
$lr = $r->lookup_dirent($finfo, $subtype);
$lr = $r->lookup_dirent($finfo, $subtype, $next_filter);
  • obj: $r (Apache2::RequestRec object) β€” the current request
  • arg1: $finfo (APR::Finfo object) β€” the apr_dir_read result to lookup
  • arg2: $subtype (integer) β€” what type of subrequest to perform, one of;
Apache2::SUBREQ_NO_ARGS     ignore r->args and r->path_info
Apache2::SUBREQ_MERGE_ARGS  merge  r->args and r->path_info
  • arg3: $next_filter (integer) β€” the first filter the sub_request should use. If this is NULL, it defaults to the first filter for the main request
  • ret: $lr (Apache2::RequestRec object) β€” the new request record
  • since: 2.0.00

META: where do we take the apr_dir_read result from? πŸ€”

πŸ‘€ See Also πŸ‘€

mod_perl 2.0 documentation. πŸ’œ

mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0.

πŸ‘‘ Authors πŸ‘‘

The mod_perl development team and numerous contributors. 🌈


and that's the whole page, bestie 🫢 this gem came from docs::a...Request(3) β€” built for perl v5.42.3, dated 2023-10-21. πŸ’–βœ¨

πŸ“¦ where this page comes from