Technical Forum
Ask questions. Discover Answers.
cancel
Showing results for 
Search instead for 
Did you mean: 

HTTP::uri returns full URL

Magnum_IP
Nimbostratus
Nimbostratus
I have had reason to log HTTP::uri while troubleshooting an error on a new Virtual Server. When I log HTTP::uri I see the full URL including protocol, for example,

 

 

http://www.domain.com/dir/file.htm

 

 

I was anticipating only seeing

 

 

/dir/file.htm

 

 

Can anybody explain what is happening here? This goes against everything I thought I understood about HTTP::uri.

 

 

Thanks

 

 

fergu5
4 REPLIES 4

hooleylist
Cirrostratus
Cirrostratus
Hi Fergu,

 

 

An HTTP request can contain an absolute URI per RFC2616:

 

 

 

http://tools.ietf.org/html/rfc2616section-5.1.2

 

 

5.1.2 Request-URI

 

 

 

The Request-URI is a Uniform Resource Identifier (section 3.2) and

 

identifies the resource upon which to apply the request.

 

 

Request-URI = "*" | absoluteURI | abs_path | authority

 

 

The four options for Request-URI are dependent on the nature of the

 

request. The asterisk "*" means that the request does not apply to a

 

particular resource, but to the server itself, and is only allowed

 

when the method used does not necessarily apply to a resource. One

 

example would be

 

 

OPTIONS * HTTP/1.1

 

 

The absoluteURI form is REQUIRED when the request is being made to a

 

proxy. The proxy is requested to forward the request or service it

 

from a valid cache, and return the response. Note that the proxy MAY

 

forward the request on to another proxy or directly to the server

 

specified by the absoluteURI. In order to avoid request loops, a

 

proxy MUST be able to recognize all of its server names, including

 

any aliases, local variations, and the numeric IP address. An example

 

Request-Line would be:

 

 

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

 

 

To allow for transition to absoluteURIs in all requests in future

 

versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI

 

form in requests, even though HTTP/1.1 clients will only generate

 

them in requests to proxies.

 

 

 

You can detect a relative URI by checking if HTTP::uri or HTTP::path start with "/". If not, it should be an absolute URI. You can use the URI:: commands to parse an absolute URI into the protocol, host and relative URI/path:

 

 

http://devcentral.f5.com/wiki/iRules.URI.ashx

 

http://devcentral.f5.com/wiki/iRules.URI__path.ashx

 

http://devcentral.f5.com/wiki/iRules.URI__host.ashx

 

 

Aaron

Magnum_IP
Nimbostratus
Nimbostratus

Hey Hoolio,

 

Firstly, can I just say that my friend LyonsG and I are continually impresses by your seemingly endless knowledge and your everpresence on DevCentral - do you ever sleep?;-P Thanks for taking the time to help 😉

 

 

Secondly your excerpt from the RFC answers my question. This latest project I'm working on is to load balance some proxy servers! So the quote...

 

 

 

The absoluteURI form is REQUIRED when the request is being made to a proxy.

nails it;-D

 

 

I have been writing iRules for a fair while (admittedly never in relation to proxy servers) but I have not come across this absoloute format when using HTTP::uri.

 

 

I think the Wiki page for HTTP::uri could really do with being updated to include a reference to the quote from your previous reply or the full RFC.

 

 

At the moment the Wiki page suggests the HTTP::uri will return something beginning with / i.e. something relative. If you read closely the Wiki page does says 'typically' but I only spotted this in hindsight and I imagine others have missed it too.

 

 

What do you think?

 

 

fergu5

 

hooleylist
Cirrostratus
Cirrostratus
There's an RFE for this, BZ222409. You could open a case with F5 Support and ask them to attach it to the RFE.

For now, you can add logic to your iRule to handle relative and absolute URIs:

http://devcentral.f5.com/Community/GroupDetails/tabid/1082223/asg/50/aft/1178966/showtab/groupforums...


when HTTP_REQUEST {

 Check for an absolute URI
if {not ([HTTP::uri] starts_with "/")}{

if {[scan $abs_uri {%[^/]//%[^/]%s} proto host uri] == 3}{

 Log the URI to a local URI
log local0. "\$proto: $proto, \$host: $host, \$uri: $uri"
}
}
}

Aaron

spark_86682
Historic F5 Account
That RFE is for changing HTTP::path, not HTTP::uri. You could open up a new RFE for adding a new command to get only the relative part of the URI, and I would encourage you to do so.