Skip to content

Commit

Permalink
[backend] refactor url handling
Browse files Browse the repository at this point in the history
- move urlencode to BSHTTP
- add urldecode
- add queryencode
- support a fragment
  • Loading branch information
mlschroe committed Dec 12, 2018
1 parent 4dab810 commit ad348b4
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 42 deletions.
26 changes: 26 additions & 0 deletions src/backend/BSHTTP.pm
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,32 @@ This library contains functions to handle http requests in obs
=cut

sub urlencode {
my ($str, $iscgi) = @_;
if ($iscgi) {
$str =~ s/([\000-\037<>;\"#\?&\+=%[\177-\377])/sprintf("%%%02X",ord($1))/sge;
$str =~ s/ /+/sg;
} else {
$str =~ s/([\000-\040<>;\"#\?&\+=%[\177-\377])/sprintf("%%%02X",ord($1))/sge;
}
return $str;
}

sub urldecode {
my ($str, $iscgi) = @_;
$str =~ tr/+/ / if $iscgi;
$str =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/sge;
return $str;
}

sub queryencode {
my (@args, $iscgi) = @_;
for (@args) {
$_ = urlencode($_, $iscgi);
s/%3D/=/; # convert now escaped = back
}
return join('&', @args);
}

sub gethead {
my ($h, $t) = @_;
Expand Down
27 changes: 6 additions & 21 deletions src/backend/BSRPC.pm
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,7 @@ sub import {
my $tcpproto = getprotobyname('tcp');

sub urlencode {
my $url = $_[0];
$url =~ s/([\000-\040<>;\"#\?&\+=%[\177-\377])/sprintf("%%%02X",ord($1))/sge;
return $url;
return BSHTTP::urlencode($_[0]);
}

sub createuri {
Expand All @@ -63,22 +61,13 @@ sub createuri {
# encode uri, but do not encode the host part
if ($uri =~ /^(https?:\/\/[^\/]*\/)(.*)$/s) {
$uri = $1;
$uri .= urlencode($2);
$uri .= BSHTTP::urlencode($2);
} else {
$uri = urlencode($uri);
$uri = BSHTTP::urlencode($uri);
}
}
if (@args) {
for (@args) {
$_ = urlencode($_);
s/%3D/=/; # convert first now escaped '=' back
}
if ($uri =~ /\?/) {
$uri .= '&'.join('&', @args);
} else {
$uri .= '?'.join('&', @args);
}
}
$uri .= (($uri =~ /\?/) ? '&' : '?') . BSHTTP::queryencode(@args) if @args;
$uri .= "#".BSHTTP::urlencode($param->{'fragment'}) if defined $param->{'fragment'};
return $uri;
}

Expand Down Expand Up @@ -251,11 +240,7 @@ sub rpc {
push @xhdrs, 'Content-Type: application/x-www-form-urlencoded';
}
if ($formurlencode) {
for (@args) {
$_ = urlencode($_);
s/%3D/=/; # convert now escaped = back
}
$data = join('&', @args);
$data = BSHTTP::queryencode(@args);
@args = ();
}
}
Expand Down
9 changes: 5 additions & 4 deletions src/backend/BSServer.pm
Original file line number Diff line number Diff line change
Expand Up @@ -597,17 +597,18 @@ sub readrequest {
$qu = '';
}
my $query_string = '';
if ($path =~ /^(.*?)\?(.*)$/) {
$path = $1;
$query_string = $2;
}
my $fragment;
($path, $fragment) = ($1, $2) if $path =~ /^(.*?)\#(.*)$/;
($path, $query_string) = ($1, $2) if $path =~ /^(.*?)\?(.*)$/;
$path =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; # unescape path
$fragment =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge if defined $fragment; # unescape fragment
die("501 invalid path\n") unless $path =~ /^\//s; # forbid relative paths
my %headers;
BSHTTP::gethead(\%headers, $rawheaders);
$req->{'action'} = $act;
$req->{'path'} = $path;
$req->{'query'} = $query_string;
$req->{'fragment'} = $fragment if defined $fragment;
$req->{'headers'} = \%headers;
$req->{'rawheaders'} = $rawheaders;
if ($act eq 'POST' || $act eq 'PUT' || $act eq 'PATCH') {
Expand Down
9 changes: 5 additions & 4 deletions src/backend/BSServerEvents.pm
Original file line number Diff line number Diff line change
Expand Up @@ -327,13 +327,14 @@ sub getrequest {
die("501 Bad method, must be GET\n") if $act ne 'GET';
}
my $query_string = '';
if ($path =~ /^(.*?)\?(.*)$/) {
$path = $1;
$query_string = $2;
}
my $fragment;
($path, $fragment) = ($1, $2) if $path =~ /^(.*?)\#(.*)$/;
($path, $query_string) = ($1, $2) if $path =~ /^(.*?)\?(.*)$/;
$path =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge;
$fragment =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge if defined $fragment;
die("501 invalid path\n") unless $path =~ /^\//;
%$req = ( %$req, 'action' => $act, 'path' => $path, 'query' => $query_string, 'headers' => $headers, 'state' => 'processing' );
$req->{'fragment'} = $fragment if defined $fragment;
# FIXME: should not use global
local $BSServer::request = $req;
my @r = $conf->{'dispatch'}->($conf, $req);
Expand Down
10 changes: 5 additions & 5 deletions src/backend/BSUrlmapper.pm
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
package BSUrlmapper;

use BSConfiguration;
use BSRPC;
use BSHTTP;

my $extrepodir = "$BSConfig::bsdir/repos";

Expand Down Expand Up @@ -101,13 +101,13 @@ sub get_downloadurl {
# default to repodownload url
return undef unless $BSConfig::repodownload;
if ($extrep->[0] =~ /^\Q$BSConfig::bsdir\E\/repos\/(.*)$/) {
my $url = "$BSConfig::repodownload/".BSRPC::urlencode($1).'/';
my $url = "$BSConfig::repodownload/".BSHTTP::urlencode($1).'/';
$url =~ s!//$!/!;
return $url;
}
my $prp_ext = $prp;
$prp_ext =~ s/:/:\//g;
return "$BSConfig::repodownload/".BSRPC::urlencode($prp_ext)."/";
return "$BSConfig::repodownload/".BSHTTP::urlencode($prp_ext)."/";
}

sub get_path_downloadurl {
Expand All @@ -124,12 +124,12 @@ sub get_path_downloadurl {
$url = $extrep->[2] if !defined($url);
if ((!defined($path) || !defined($url)) && $extrep->[0] =~ /^\Q$BSConfig::bsdir\E\/repos\/(.*)$/) {
$path = $1 if !defined $path;
$url = "$BSConfig::repodownload/".BSRPC::urlencode($1) if $BSConfig::repodownload && !defined($url);
$url = "$BSConfig::repodownload/".BSHTTP::urlencode($1) if $BSConfig::repodownload && !defined($url);
}
if (!defined($url) && $BSConfig::repodownload) {
my $prp_ext = $prp;
$prp_ext =~ s/:/:\//g;
$url = "$BSConfig::repodownload/".BSRPC::urlencode($prp_ext);
$url = "$BSConfig::repodownload/".BSHTTP::urlencode($prp_ext);
}
$url =~ s/\/?$/\// if defined $url;
return ($path, $url);
Expand Down
2 changes: 1 addition & 1 deletion src/backend/bs_repserver
Original file line number Diff line number Diff line change
Expand Up @@ -2269,7 +2269,7 @@ sub putjob {
# write jobstatus and free lock
if (@{$kiwitree_tosign || []}) {
my $c = '';
$c .= BSRPC::urlencode($_)."\n" for @$kiwitree_tosign;
$c .= BSHTTP::urlencode($_)."\n" for @$kiwitree_tosign;
writestr("$dir/.kiwitree_tosign", undef, $c);
} else {
unlink("$dir/.kiwitree_tosign");
Expand Down
5 changes: 3 additions & 2 deletions src/backend/bs_srcserver
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ use JSON::XS ();

use BSConfiguration;
use BSRPC ':https';
use BSHTTP;
use BSServer;
use BSUtil;
use BSFileDB;
Expand Down Expand Up @@ -5088,7 +5089,7 @@ sub published_path {
}
if (defined($p) && !$medium) {
$path .= "/$p" if defined $path;
$url .= BSRPC::urlencode($p) if defined $url;
$url .= BSHTTP::urlencode($p) if defined $url;
}
}

Expand Down Expand Up @@ -5126,7 +5127,7 @@ sub published_path {
}
if ($medium) {
$path .= "/$medium" if defined $path;
$url .= BSRPC::urlencode($medium) if defined $url;
$url .= BSHTTP::urlencode($medium) if defined $url;
}
$url =~ s/([^\/])\/$/$1/ if defined $url; # compat
$ret->{'path'} = $path if defined $path;
Expand Down
10 changes: 5 additions & 5 deletions src/backend/bs_worker
Original file line number Diff line number Diff line change
Expand Up @@ -3218,7 +3218,7 @@ sub buildkiwitree {
my $sdir = shift @dirs;
$sdir = '' unless defined $sdir;
next unless -d $dir;
$tree{$1} = "d ". BSRPC::urlencode($1) if $sdir =~ /^(.+)\/$/;
$tree{$1} = "d ". BSHTTP::urlencode($1) if $sdir =~ /^(.+)\/$/;
push @todo, $dir, $sdir;
}
while (@todo) {
Expand All @@ -3231,17 +3231,17 @@ sub buildkiwitree {
if (-l $f) {
my $sl = readlink($f);
die("readlink $f: $!\n") unless defined $sl;
$tree{$sf} = "l ". BSRPC::urlencode($sf) . " " . BSRPC::urlencode($sl);
$tree{$sf} = "l ". BSHTTP::urlencode($sf) . " " . BSHTTP::urlencode($sl);
} elsif (-d $f) {
$tree{$sf} = "d ". BSRPC::urlencode($sf);
$tree{$sf} = "d ". BSHTTP::urlencode($sf);
push @todo, $f, "$sf/";
} elsif (-f $f) {
my $leadsigmd5 = '';
Build::queryhdrmd5($f, \$leadsigmd5) if $f =~ /\.rpm$/;
if ($leadsigmd5) {
$tree{$sf} = "f ". BSRPC::urlencode($sf) . " " . $leadsigmd5;
$tree{$sf} = "f ". BSHTTP::urlencode($sf) . " " . $leadsigmd5;
} else {
$tree{$sf} = "f ". BSRPC::urlencode($sf);
$tree{$sf} = "f ". BSHTTP::urlencode($sf);
}
}
}
Expand Down

0 comments on commit ad348b4

Please sign in to comment.