1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "mojo/runner/url_resolver.h"
7 #include "base/base_paths.h"
8 #include "base/logging.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "mojo/runner/switches.h"
11 #include "mojo/shell/query_util.h"
12 #include "mojo/util/filename_util.h"
13 #include "url/url_util.h"
18 URLResolver::URLResolver() {
19 // Needed to treat first component of mojo URLs as host, not path.
20 url::AddStandardScheme("mojo");
23 URLResolver::~URLResolver() {
27 std::vector
<URLResolver::OriginMapping
> URLResolver::GetOriginMappings(
28 const base::CommandLine::StringVector
& args
) {
29 std::vector
<OriginMapping
> origin_mappings
;
30 const std::string kArgsForSwitches
[] = {
31 "-" + std::string(switches::kMapOrigin
) + "=",
32 "--" + std::string(switches::kMapOrigin
) + "=",
34 for (auto& arg
: args
) {
35 for (size_t i
= 0; i
< arraysize(kArgsForSwitches
); i
++) {
36 const std::string
& argsfor_switch
= kArgsForSwitches
[i
];
37 std::string arg_string
;
39 arg_string
= base::UTF16ToUTF8(arg
);
43 if (arg_string
.compare(0, argsfor_switch
.size(), argsfor_switch
) == 0) {
45 arg_string
.substr(argsfor_switch
.size(), std::string::npos
);
46 size_t delim
= value
.find('=');
47 if (delim
<= 0 || delim
>= value
.size())
49 origin_mappings
.push_back(
50 OriginMapping(value
.substr(0, delim
),
51 value
.substr(delim
+ 1, std::string::npos
)));
55 return origin_mappings
;
58 void URLResolver::AddURLMapping(const GURL
& url
, const GURL
& mapped_url
) {
59 url_map_
[url
] = mapped_url
;
62 void URLResolver::AddOriginMapping(const GURL
& origin
, const GURL
& base_url
) {
63 if (!origin
.is_valid() || !base_url
.is_valid() ||
64 origin
!= origin
.GetOrigin()) {
65 // Disallow invalid mappings.
66 LOG(ERROR
) << "Invalid origin for mapping: " << origin
;
69 // Force both origin and base_url to have trailing slashes.
70 origin_map_
[origin
] = util::AddTrailingSlashIfNeeded(base_url
);
73 GURL
URLResolver::ApplyMappings(const GURL
& url
) const {
75 GURL mapped_url
= shell::GetBaseURLAndQuery(url
, &query
);
77 const auto& url_it
= url_map_
.find(mapped_url
);
78 if (url_it
!= url_map_
.end()) {
79 mapped_url
= url_it
->second
;
83 GURL origin
= mapped_url
.GetOrigin();
84 const auto& origin_it
= origin_map_
.find(origin
);
85 if (origin_it
== origin_map_
.end())
87 mapped_url
= GURL(origin_it
->second
.spec() +
88 mapped_url
.spec().substr(origin
.spec().length()));
92 mapped_url
= GURL(mapped_url
.spec() + query
);
96 void URLResolver::SetMojoBaseURL(const GURL
& mojo_base_url
) {
97 DCHECK(mojo_base_url
.is_valid());
98 // Force a trailing slash on the base_url to simplify resolving
99 // relative files and URLs below.
100 mojo_base_url_
= util::AddTrailingSlashIfNeeded(mojo_base_url
);
103 GURL
URLResolver::ResolveMojoURL(const GURL
& mojo_url
) const {
104 if (mojo_url
.scheme() != "mojo") {
105 // The mapping has produced some sort of non-mojo: URL - file:, http:, etc.
109 // It's still a mojo: URL, use the default mapping scheme.
111 GURL base_url
= shell::GetBaseURLAndQuery(mojo_url
, &query
);
112 const std::string host
= base_url
.host();
113 return mojo_base_url_
.Resolve(host
+ "/" + host
+ ".mojo" + query
);
116 } // namespace runner