diff --git a/etc/dev.localhost.localdomain.psgi b/eg/basic.psgi similarity index 100% rename from etc/dev.localhost.localdomain.psgi rename to eg/basic.psgi diff --git a/eg/urlmap.psgi b/eg/urlmap.psgi new file mode 100644 index 000000000..1d402c65e --- /dev/null +++ b/eg/urlmap.psgi @@ -0,0 +1,20 @@ +use lib '/data/WebGUI/lib'; +use WebGUI; + +my $wg1 = WebGUI->new; +my $wg2 = WebGUI->new; + +use Plack::Builder; +my $app = builder { + mount "http://dev.localhost.localdomain:5000/" => $wg1; + mount "/wg1" => $wg1; + mount "/wg2" => $wg2; + mount "/" => sub { [ 200, [ 'Content-Type' => 'text/html' ], [ <WebGUI + URLMap

+ +END_HTML +}; diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index 565d27bf3..6b67ba6ad 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -742,8 +742,8 @@ sub fixUrl { # fix urls used by uploads and extras # and those beginning with http my @badUrls = ( - $self->session->config->get("extrasURL"), - $self->session->config->get("uploadsURL"), + $self->session->url->make_urlmap_work($self->session->config->get("extrasURL")), + $self->session->url->make_urlmap_work($self->session->config->get("uploadsURL")), ); foreach my $badUrl (@badUrls) { $badUrl =~ s{ / $ }{}x; # Remove trailing slashes from the end of the URL @@ -1970,7 +1970,7 @@ sub outputWidgetMarkup { my $assetId = $self->getId; my $hexId = $session->id->toHex($assetId); my $conf = $session->config; - my $extras = $conf->get('extrasURL'); + my $extras = $session->url->make_urlmap_work($conf->get('extrasURL')); # the widgetized version of content that has the widget macro in it is # executing in an iframe. this iframe doesn't have a style object. @@ -2072,7 +2072,7 @@ sub prepareWidgetView { my $self = shift; my $templateId = shift; my $template = WebGUI::Asset::Template->newById($self->session, $templateId); - my $extras = $self->session->config->get('extrasURL'); + my $extras = $self->session->url->make_urlmap_work($self->session->config->get('extrasURL')); $template->prepare; diff --git a/lib/WebGUI/Asset/Wobject/ProjectManager.pm b/lib/WebGUI/Asset/Wobject/ProjectManager.pm index fa4730997..5b73a9d13 100644 --- a/lib/WebGUI/Asset/Wobject/ProjectManager.pm +++ b/lib/WebGUI/Asset/Wobject/ProjectManager.pm @@ -741,7 +741,7 @@ sub view { my $config = $session->config; my $eh = $session->errorHandler; - $var->{'extras'} = $config->get("extrasURL")."/wobject/ProjectManager"; + $var->{'extras'} = $session->url->make_urlmap_work($config->get("extrasURL"))."/wobject/ProjectManager"; $var->{'project.create'} = $self->getUrl("func=editProject;projectId=new"); $var->{'project.create.label'} = $i18n->get("project new label"); @@ -904,7 +904,7 @@ sub www_drawGanttChart { my ($dunits,$hoursPerDay) = $db->quickArray("select durationUnits,hoursPerDay from PM_project where projectId=".$db->quote($projectId)); - $var->{'extras'} = $config->get("extrasURL")."/wobject/ProjectManager"; + $var->{'extras'} = $session->url->make_urlmap_work($config->get("extrasURL"))."/wobject/ProjectManager"; #Initialize display settings my $projectDisplay = "weeks"; @@ -1494,8 +1494,8 @@ sub www_editTask { }); $var->{'form.footer'} = WebGUI::Form::formFooter($session); - $var->{'extras'} = $config->get("extrasURL"); - $var->{'assetExtras'} = $config->get("extrasURL").'/wobject/ProjectManager'; + $var->{'extras'} = $session->url->make_urlmap_work($config->get("extrasURL")); + $var->{'assetExtras'} = $session->url->make_urlmap_work($config->get("extrasURL")).'/wobject/ProjectManager'; $var->{'task_name_label'} = $i18n->get('task name label'); $var->{'task_start_label'} = $i18n->get('task start label'); @@ -1726,8 +1726,8 @@ sub www_viewProject { return $privilege->insufficient unless $self->_userCanObserveProject($user, $projectId); #Set extras template variables - my $extras = $config->get("extrasURL"); - my $assetExtras = $config->get("extrasURL")."/wobject/ProjectManager"; + my $extras = $session->url->make_urlmap_work($config->get("extrasURL")); + my $assetExtras = $session->url->make_urlmap_work($config->get("extrasURL"))."/wobject/ProjectManager"; $var->{'extras' } = $assetExtras; $var->{'extras.base'} = $extras; diff --git a/lib/WebGUI/Asset/Wobject/TimeTracking.pm b/lib/WebGUI/Asset/Wobject/TimeTracking.pm index e53528e98..128f5825f 100644 --- a/lib/WebGUI/Asset/Wobject/TimeTracking.pm +++ b/lib/WebGUI/Asset/Wobject/TimeTracking.pm @@ -185,7 +185,7 @@ sub view { my ($session,$privilege,$form,$db,$dt,$user,$eh,$config) = $self->getSessionVars("privilege","form","db","datetime","user","errorHandler","config"); my $i18n = WebGUI::International->new($session,'Asset_TimeTracking'); - $var->{'extras'} = $config->get("extrasURL")."/wobject/TimeTracking"; + $var->{'extras'} = $session->url->make_urlmap_work($config->get("extrasURL"))."/wobject/TimeTracking"; if($user->isInGroup($self->groupToManage)) { $var->{'project.manage.url'} = $self->getUrl("func=manageProjects"); @@ -337,7 +337,7 @@ sub www_editProject { return $privilege->insufficient unless ($user->isInGroup($self->groupToManage)); my $projectId = $_[0] || $form->get("projectId") || "new"; my $taskError = qq|
$_[1]| if($_[1]); - my $extras = $config->get("extrasURL")."/wobject/TimeTracking"; + my $extras = $session->url->make_urlmap_work($config->get("extrasURL"))."/wobject/TimeTracking"; my $project = $db->quickHashRef("select * from TT_projectList where projectId=".$db->quote($projectId)); #Build Form @@ -509,7 +509,7 @@ sub www_manageProjects { my $pnLabel = $i18n->get("manage project name label"); my $atLabel = $i18n->get("manage project available task label"); my $resLabel = $i18n->get("manage project resource label"); - my $extras = $config->get("extrasURL")."/wobject/TimeTracking"; + my $extras = $session->url->make_urlmap_work($config->get("extrasURL"))."/wobject/TimeTracking"; my $errorMessage = ""; $errorMessage = qq|$_[0]| if($_[0]); diff --git a/lib/WebGUI/AssetExportHtml.pm b/lib/WebGUI/AssetExportHtml.pm index b267b8868..4ba566d8a 100644 --- a/lib/WebGUI/AssetExportHtml.pm +++ b/lib/WebGUI/AssetExportHtml.pm @@ -636,9 +636,9 @@ sub exportSymlinkExtrasUploads { my $config = $session->config; my $extrasPath = $config->get('extrasPath'); - my $extrasUrl = $config->get('extrasURL'); + my $extrasUrl = $session->url->make_urlmap_work($config->get('extrasURL')); my $uploadsPath = $config->get('uploadsPath'); - my $uploadsUrl = $config->get('uploadsURL'); + my $uploadsUrl = $session->url->make_urlmap_work($config->get('uploadsURL')); # we have no assurance whether the exportPath is valid or not, so check it. my $exportPath = WebGUI::Asset->exportCheckPath($session); diff --git a/lib/WebGUI/Macro/FilePump.pm b/lib/WebGUI/Macro/FilePump.pm index d8312b310..058d3842b 100644 --- a/lib/WebGUI/Macro/FilePump.pm +++ b/lib/WebGUI/Macro/FilePump.pm @@ -92,8 +92,8 @@ sub process { my $uploadsDir = Path::Class::Dir->new($session->config->get('uploadsPath')); my $extrasDir = Path::Class::Dir->new($session->config->get('extrasPath')); - my $uploadsUrl = Path::Class::Dir->new($session->config->get('uploadsURL')); - my $extrasUrl = Path::Class::Dir->new($session->config->get('extrasURL')); + my $uploadsUrl = Path::Class::Dir->new($session->url->make_urlmap_work($session->config->get('uploadsURL'))); + my $extrasUrl = Path::Class::Dir->new($session->url->make_urlmap_work($session->config->get('extrasURL'))); ##Normal mode if (! $session->var->isAdminOn) { diff --git a/lib/WebGUI/Macro/Widget.pm b/lib/WebGUI/Macro/Widget.pm index ab7e2faee..6c4bba62c 100644 --- a/lib/WebGUI/Macro/Widget.pm +++ b/lib/WebGUI/Macro/Widget.pm @@ -33,7 +33,7 @@ sub process { # Get location for CSS and JS files my $conf = $session->config; - my $extras = $conf->get("extrasURL"); + my $extras = $session->url->make_urlmap_work($conf->get("extrasURL")); # add CSS and JS to the page my $style = $session->style; diff --git a/lib/WebGUI/Session/Url.pm b/lib/WebGUI/Session/Url.pm index 1f5e470e9..17000762d 100644 --- a/lib/WebGUI/Session/Url.pm +++ b/lib/WebGUI/Session/Url.pm @@ -144,7 +144,7 @@ consecutive slashes in the path part of the URL will be replaced with a single s sub extras { my $self = shift; my $path = shift; - my $url = $self->session->config->get("extrasURL"); + my $url = $self->session->url->make_urlmap_work($self->session->config->get("extrasURL")); my $cdnCfg = $self->session->config->get('cdn'); if ( $cdnCfg and $cdnCfg->{'enabled'} and $cdnCfg->{'extrasCdn'} ) { unless ( $path and grep $path =~ m/$_/, @{ $cdnCfg->{'extrasExclude'} } ) { @@ -190,7 +190,7 @@ sub gateway { my $pageUrl = shift; my $pairs = shift; my $skipPreventProxyCache = shift; - my $url = $self->session->config->get("gateway").'/'.$pageUrl; + my $url = $self->make_urlmap_work($self->session->config->get("gateway")).'/'.$pageUrl; $url =~ s/\/+/\//g; if ($self->session->setting->get("preventProxyCache") == 1 and !$skipPreventProxyCache) { $url = $self->append($url,"noCache=".randint(0,1000).':'.$self->session->datetime->time()); @@ -198,7 +198,19 @@ sub gateway { if ($pairs) { $url = $self->append($url,$pairs); } - return $url; + + return $url; +} + +# Temporary hack +sub make_urlmap_work { + my $self = shift; + my $url = shift; + my $uri = $self->session->request->base; + $uri->path($uri->path . $url); + my $path = $uri->path; + $path =~ s{^//}{/}; + return $path; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Storage.pm b/lib/WebGUI/Storage.pm index c07dbd7f0..fafa38596 100644 --- a/lib/WebGUI/Storage.pm +++ b/lib/WebGUI/Storage.pm @@ -1265,7 +1265,7 @@ If specified, we'll return a URL to the file rather than the storage location. sub getUrl { my $self = shift; my $file = shift; - my $url = $self->session->config->get("uploadsURL") . '/' . $self->getPathFrag; + my $url = $self->session->url->make_urlmap_work($self->session->config->get("uploadsURL")) . '/' . $self->getPathFrag; my $cdnCfg = $self->session->config->get('cdn'); if ( $cdnCfg and $cdnCfg->{'enabled'}