libapa...2::URI(3pm)

πŸ’– libapa...2::URI β€” the Perl API for manipulating URIs

okay bestie, gather round 🫢 this is Apache2::URI, straight outta the User Contributed Perl Documentation, living in the libapa...2::URI(3pm) section. It's a Perl API for manipulating URIs and honestly? she's giving utility icon energy πŸ‘‘


✨ Synopsis ✨

use Apache2::URI ();

$hostport = $r->construct_server();
$hostport = $r->construct_server($hostname);
$hostport = $r->construct_server($hostname, $port);
$hostport = $r->construct_server($hostname, $port, $pool);

$url = $r->construct_url();
$url = $r->construct_url($rel_uri);
$url = $r->construct_url($rel_uri, $pool);

$parsed_uri = $r->parse_uri($uri);

$parsed_uri = $r->parsed_uri();

$url = join '%20', qw(one two three);
Apache2::URI::unescape_url($url);

🌸 Description 🌸

so here's the tea β˜• APR::URI is the generic one β€” she'll dissect, adjust and put together any URI string you hand her, no questions asked. But Apache2::URI? She's the Apache-specific bestie πŸ’… she pulls the info straight out of the $r object instead. Which means when you're messing with the URI of the current HTTP request, you're usually using methods from both classes together. dynamic duo fr fr πŸ¦‹


πŸ‘‘ API πŸ‘‘

Apache2::URI comes with these functions and methods, no cap:

πŸŽ€ construct_server

Builds a string out of the hostname and the port ✨

$hostport = $r->construct_server();
$hostport = $r->construct_server($hostname);
$hostport = $r->construct_server($hostname, $port);
$hostport = $r->construct_server($hostname, $port, $pool);
  • obj: $r ( Apache2::RequestRec object ) β€” the current request object, the main character of this whole thing πŸ’–
  • opt arg1: $hostname ( string ) β€” the hostname of the server. If you don't hand it over, "$r->get_server_name" gets used instead 🌸
  • opt arg2: $port ( string ) β€” the port the server is running on. Don't pass it and she falls back to "$r->get_server_port" πŸ’«
  • opt arg3: $pool ( APR::Pool object ) β€” the pool to allocate the string from. Skip it and "$r->pool" is your girl 🫢
  • ret: $hostport ( string ) β€” the server's hostport string, slay ✨
  • since: 2.0.00

Examples:

  • Assuming that:
$r->get_server_name == "localhost";
$r->get_server_port == 8001;

The code:

$hostport = $r->construct_server();

returns a string:

localhost:8001
  • The following code sets the values explicitly:
$hostport = $r->construct_server("my.example.com", 8888);

and it returns a string:

my.example.com:8888

πŸ¦‹ construct_url

Builds a fully qualified URL from the uri plus all the info chillin' in the request rec πŸ”₯

$url = $r->construct_url();
$url = $r->construct_url($rel_uri);
$url = $r->construct_url($rel_uri, $pool);
  • obj: $r ( Apache2::RequestRec object ) β€” the current request object, periodt πŸ’…
  • opt arg1: $rel_uri ( string ) β€” the path to the requested file (it may include a concatenation of path, query and fragment components). If you don't pass it, "$r->uri" is used πŸ’–
  • opt arg2: $pool ( APR::Pool object ) β€” the pool to allocate the URL from. No argument? Then it's "$r->pool" 🌈
  • ret: $url ( string ) β€” a fully qualified URL ⭐
  • since: 2.0.00

Examples:

  • Assuming that the request was
http://localhost.localdomain:8529/test?args

The code:

my $url = $r->construct_url;

returns the string:

http://localhost.localdomain:8529/test

notice that the query (args) component is not in the string. You need to append it manually if it's needed πŸ‘€ β€” she's not gonna do it for you, bestie.

  • Assuming that the request was
http://localhost.localdomain:8529/test?args

The code:

my $rel_uri = "/foo/bar?tar";
my $url = $r->construct_url($rel_uri);

returns the string:

http://localhost.localdomain:8529/foo/bar?tar

πŸ’… parse_uri

Breaks apart a URI (and yes, that does affect the current request's uri components πŸ™ˆ)

$r->parse_uri($uri);
  • obj: $r ( Apache2::RequestRec object ) β€” the current request object πŸ’œ
  • arg1: $uri ( string ) β€” the uri to break apart πŸ”¨
  • ret: no return value β€” she gives you nothing back, she just does things πŸ’€
  • warning: This method has several side-effects explained below
  • since: 2.0.00

This method call has the following side-effects, and they are not subtle:

  1. sets "$r->args" to the rest after '?' if such exists in the passed $uri, otherwise sets it to "undef".
  2. sets "$r->uri" to the passed $uri without the "$r->args" part.
  3. sets "$r->hostname" (if not set already) using the ("scheme://host:port") parts of the passed $uri.
okay so heads up 🚨 this one edits the request while you watch. Side effects go crazy. Know what you're doing before you call her, fr fr.

πŸ“ parsed_uri

Grabs the current request's parsed uri object πŸŽ€

my $uri = $r->parsed_uri();
  • obj: $r ( Apache2::RequestRec object ) β€” the current request object 🌸
  • ret: $uri ( APR::URI object ) β€” the parsed uri ✨
  • since: 2.0.00 β€” and this object is suitable for using with "APR::URI::rpath" πŸ’«

🧚 unescape_url

Unescapes URLs. That's it, that's the whole job πŸ’–

Apache2::URI::unescape_url($url);
  • obj: $url ( string ) β€” the URL to unescape 🌈
  • ret: no return value β€” but the argument $url is now unescaped, so it did the thing in place, lowkey iconic ✨
  • since: 2.0.00

Example:

my $url = join '%20', qw(one two three);
Apache2::URI::unescape_url($url);

$url now contains the string:

"one two three";

🌈 See Also 🌈

"APR::URI", and the mod_perl 2.0 documentation πŸ“š (iykyk)


mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. Legal girlies stay winning πŸ‘‘


⭐ Authors ⭐

The mod_perl development team and numerous contributors. Legends, every single one 🫢


and that's the whole page, bestie!! πŸŽ€ this was perl v5.42.3, dated 2026-08-20, from the libapa...2::URI(3pm) manpage and honestly she ate and left no crumbs πŸ’…βœ¨ bye ily πŸ¦‹

πŸ“¦ where this page comes from