Patch: Add X-Reproxy-Host

dormando dormando at rydia.net
Thu May 29 05:13:51 UTC 2008


We got the patch three times now, thank you :)

Logan Bowers wrote:
> (sorry if ya'll receive this message twice, I'm having trouble sending 
> to the list)
> 
> I have run into a limitation with Perlbal's handling of handling of the 
> Host header during a reproxy.  On reproxy, Perlbal sends the host header 
> from the original request, not the host specified in the reproxy URL.  
> This makes it impossible to redirect to a vhost other than the one the 
> targeted by the original request.  To work around this problem, I've 
> attached a patch that adds support for a new header: X-Reproxy-Host.  If 
> it exists in the reproxy response, the value overrides the host header 
> of the client request.
> 
> 
> Logan Bowers
> 
> Index: lib/Perlbal/ClientProxy.pm
> ===================================================================
> --- lib/Perlbal/ClientProxy.pm    (revision 771)
> +++ lib/Perlbal/ClientProxy.pm    (working copy)
> @@ -29,6 +29,8 @@
>                                   # and the headers we get back aren't 
> necessarily
>                                   # the ones we want.  instead, get most 
> headers
>                                   # from the provided res headers object 
> here.
> +            'reproxy_host_hdr',  #if defined, we are doing a 
> transparent reproxy and the
> +                                   #reproxy response included an 
> X-REPROXY-HOST header
>              'is_buffering',        # bool; if we're buffering some/all 
> of a request to memory/disk
>              'is_writing',          # bool; if on, we currently have an 
> aio_write out
>              'start_time',          # hi-res time when we started 
> getting data to upload
> @@ -140,6 +142,7 @@
>      my Perlbal::ClientProxy $self = $_[0];
>      my Perlbal::HTTPHeaders $primary_res_hdrs = $_[1];
>      my $urls = $_[2];
> +    my $host_hdr = $_[3];
> 
>      # at this point we need to disconnect from our backend
>      $self->{backend} = undef;
> @@ -157,6 +160,7 @@
>              push @{$self->{reproxy_uris}}, [ $1, $2 || 80, $3 || '/' ];
>          }
>      }
> +    $self->{reproxy_host_hdr} ||= $host_hdr;
> 
>      # if we get in here and we have currently_reproxying defined, then 
> something
>      # happened and we want to retry that one
> @@ -230,7 +234,7 @@
>      if (my $range = $self->{req_headers}->header("Range")) {
>          $extra_hdr .= "Range: $range\r\n";
>      }
> -    if (my $host = $self->{req_headers}->header("Host")) {
> +    if (my $host = ($self->{reproxy_host_hdr} || 
> $self->{req_headers}->header("Host"))) {
>          $extra_hdr .= "Host: $host\r\n";
>      }
> 
> @@ -465,6 +469,7 @@
>      $self->{currently_reproxying} = undef;
>      $self->{content_length_remain} = undef;
>      $self->{primary_res_hdrs} = undef;
> +    $self->{reproxy_host_hdr} = undef;
>      $self->{responded} = 0;
>      $self->{is_buffering} = 0;
>      $self->{is_writing} = 0;
> Index: lib/Perlbal/BackendHTTP.pm
> ===================================================================
> --- lib/Perlbal/BackendHTTP.pm    (revision 771)
> +++ lib/Perlbal/BackendHTTP.pm    (working copy)
> @@ -466,7 +466,7 @@
>      } elsif ((my $urls = $hd->header('X-REPROXY-URL')) && 
> $self->may_reproxy) {
>          $self->{service}->add_to_reproxy_url_cache($rqhd, $hd)
>              if $reproxy_cache_for;
> -        $client->start_reproxy_uri($self->{res_headers}, $urls);
> +        $client->start_reproxy_uri($self->{res_headers}, 
> $urls,$hd->header('X-REPROXY-HOST'));
>          $self->next_request;
>          return;
>      } elsif ((my $svcname = $hd->header('X-REPROXY-SERVICE')) && 
> $self->may_reproxy) {
> 



More information about the perlbal mailing list