Re: get the incoming TCP protocol type

André Warnier <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <[email protected]>
Torsten Förtsch wrote:
> On 11/26/2012 09:05 AM, André Warnier wrote:
>> http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond
>>
>> there is apparently a "server variable" HTTPS which can be tested in a
>> RewriteCond, and which looks just like what I need :
>>
>> HTTPS
>>     Will contain the text "on" if the connection is using SSL/TLS, or
>> "off" otherwise. (This variable can be safely used regardless of whether
>> or not mod_ssl is loaded).
>>
>> Now I just have to find out how I can actually access such a "server
>> variable" inside a mod_perl handler.  But that should be a breeze,
>> considering the nice online mod_perl documentation, right ?
>> Let's see if I can beat Torsten to it..
> 
> The problem is this "variable" is not something that is stored along
> with the other request data. It is just the temporary result of a
> function call.
> 
> What mod_rewrite does here to provide the "variable" is 2 things:
> 
> 1) it looks for an optional function (this is a thing APR has invented)
> named "ssl_is_https". In C it looks something like this:
> 
>   APR_OPTIONAL_FN_TYPE(ssl_is_https) *is_https;
>   is_https=APR_RETRIEVE_OPTIONAL_FN(ssl_is_https);
> 
> If the function cannot be found HTTPS will be off because mod_ssl is not
> loaded.
> 
> 2) then it calls the function, which returns a boolean value.
> 
> Apache2::ModSSL does exactly the same.
> 
> 
> To make this variable accessible by means of mod_rewrite to mod_perl you
> can:
> 
> RewriteCond %{HTTPS} =on
> RewriteRule .? - E=HTTPS:42
> 
> Later on in Perl you can ask
> 
>   if ($r->subprocess_env->{HTTPS} eq "42") ...
> 
> 
> Mod_rewrite normally works in the uri translation phase, except when it
> is called in a <Directory>, <Location> or <Files> block or a .htaccess
> file. In this case it works in the fixup phase. Unfortunately,
> mod_rewrite installs its handler with APR_HOOK_FIRST priority while
> mod_perl uses APR_HOOK_REALLY_FIRST. That means a PerlFixupHandler is
> called *before* mod_rewrite in directory context.
> 

Between the two of you, we're seeing the light at the end of the tunnel..
Many thanks.  I don't think that this is really documented anywhere, so my chances of 
finding this by myself were rather low to begin with.

I must say that I slightly prefer Torsten's solution, which looks easier (some of the URLs 
to proxy already have a query string, for instance).
But I can see also that I'll have to seriously document this in the code, otherwise some 
poor maintainer is going to have a hard time in a couple of years from now, trying to 
figure out what is going on here. Specially if he has never heard of Deep Thought.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.