Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(705)

Side by Side Diff: url/gurl.cc

Issue 2617173003: [url] Reserve output buffer for various URL parsing paths (Closed)
Patch Set: brettw review Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | url/url_canon.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "url/gurl.h" 5 #include "url/gurl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <ostream> 10 #include <ostream>
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 } 101 }
102 102
103 GURL::GURL(std::string canonical_spec, const url::Parsed& parsed, bool is_valid) 103 GURL::GURL(std::string canonical_spec, const url::Parsed& parsed, bool is_valid)
104 : spec_(std::move(canonical_spec)), is_valid_(is_valid), parsed_(parsed) { 104 : spec_(std::move(canonical_spec)), is_valid_(is_valid), parsed_(parsed) {
105 InitializeFromCanonicalSpec(); 105 InitializeFromCanonicalSpec();
106 } 106 }
107 107
108 template<typename STR> 108 template<typename STR>
109 void GURL::InitCanonical(base::BasicStringPiece<STR> input_spec, 109 void GURL::InitCanonical(base::BasicStringPiece<STR> input_spec,
110 bool trim_path_end) { 110 bool trim_path_end) {
111 // Reserve enough room in the output for the input, plus some extra so that
112 // we have room if we have to escape a few things without reallocating.
113 spec_.reserve(input_spec.size() + 32);
114 url::StdStringCanonOutput output(&spec_); 111 url::StdStringCanonOutput output(&spec_);
115 is_valid_ = url::Canonicalize( 112 is_valid_ = url::Canonicalize(
116 input_spec.data(), static_cast<int>(input_spec.length()), trim_path_end, 113 input_spec.data(), static_cast<int>(input_spec.length()), trim_path_end,
117 NULL, &output, &parsed_); 114 NULL, &output, &parsed_);
118 115
119 output.Complete(); // Must be done before using string. 116 output.Complete(); // Must be done before using string.
120 if (is_valid_ && SchemeIsFileSystem()) { 117 if (is_valid_ && SchemeIsFileSystem()) {
121 inner_url_.reset(new GURL(spec_.data(), parsed_.Length(), 118 inner_url_.reset(new GURL(spec_.data(), parsed_.Length(),
122 *parsed_.inner_parsed(), true)); 119 *parsed_.inner_parsed(), true));
123 } 120 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 return spec_ > other.spec_; 188 return spec_ > other.spec_;
192 } 189 }
193 190
194 // Note: code duplicated below (it's inconvenient to use a template here). 191 // Note: code duplicated below (it's inconvenient to use a template here).
195 GURL GURL::Resolve(const std::string& relative) const { 192 GURL GURL::Resolve(const std::string& relative) const {
196 // Not allowed for invalid URLs. 193 // Not allowed for invalid URLs.
197 if (!is_valid_) 194 if (!is_valid_)
198 return GURL(); 195 return GURL();
199 196
200 GURL result; 197 GURL result;
201
202 // Reserve enough room in the output for the input, plus some extra so that
203 // we have room if we have to escape a few things without reallocating.
204 result.spec_.reserve(spec_.size() + 32);
205 url::StdStringCanonOutput output(&result.spec_); 198 url::StdStringCanonOutput output(&result.spec_);
206
207 if (!url::ResolveRelative(spec_.data(), static_cast<int>(spec_.length()), 199 if (!url::ResolveRelative(spec_.data(), static_cast<int>(spec_.length()),
208 parsed_, relative.data(), 200 parsed_, relative.data(),
209 static_cast<int>(relative.length()), 201 static_cast<int>(relative.length()),
210 nullptr, &output, &result.parsed_)) { 202 nullptr, &output, &result.parsed_)) {
211 // Error resolving, return an empty URL. 203 // Error resolving, return an empty URL.
212 return GURL(); 204 return GURL();
213 } 205 }
214 206
215 output.Complete(); 207 output.Complete();
216 result.is_valid_ = true; 208 result.is_valid_ = true;
217 if (result.SchemeIsFileSystem()) { 209 if (result.SchemeIsFileSystem()) {
218 result.inner_url_.reset( 210 result.inner_url_.reset(
219 new GURL(result.spec_.data(), result.parsed_.Length(), 211 new GURL(result.spec_.data(), result.parsed_.Length(),
220 *result.parsed_.inner_parsed(), true)); 212 *result.parsed_.inner_parsed(), true));
221 } 213 }
222 return result; 214 return result;
223 } 215 }
224 216
225 // Note: code duplicated above (it's inconvenient to use a template here). 217 // Note: code duplicated above (it's inconvenient to use a template here).
226 GURL GURL::Resolve(const base::string16& relative) const { 218 GURL GURL::Resolve(const base::string16& relative) const {
227 // Not allowed for invalid URLs. 219 // Not allowed for invalid URLs.
228 if (!is_valid_) 220 if (!is_valid_)
229 return GURL(); 221 return GURL();
230 222
231 GURL result; 223 GURL result;
232
233 // Reserve enough room in the output for the input, plus some extra so that
234 // we have room if we have to escape a few things without reallocating.
235 result.spec_.reserve(spec_.size() + 32);
236 url::StdStringCanonOutput output(&result.spec_); 224 url::StdStringCanonOutput output(&result.spec_);
237
238 if (!url::ResolveRelative(spec_.data(), static_cast<int>(spec_.length()), 225 if (!url::ResolveRelative(spec_.data(), static_cast<int>(spec_.length()),
239 parsed_, relative.data(), 226 parsed_, relative.data(),
240 static_cast<int>(relative.length()), 227 static_cast<int>(relative.length()),
241 nullptr, &output, &result.parsed_)) { 228 nullptr, &output, &result.parsed_)) {
242 // Error resolving, return an empty URL. 229 // Error resolving, return an empty URL.
243 return GURL(); 230 return GURL();
244 } 231 }
245 232
246 output.Complete(); 233 output.Complete();
247 result.is_valid_ = true; 234 result.is_valid_ = true;
248 if (result.SchemeIsFileSystem()) { 235 if (result.SchemeIsFileSystem()) {
249 result.inner_url_.reset( 236 result.inner_url_.reset(
250 new GURL(result.spec_.data(), result.parsed_.Length(), 237 new GURL(result.spec_.data(), result.parsed_.Length(),
251 *result.parsed_.inner_parsed(), true)); 238 *result.parsed_.inner_parsed(), true));
252 } 239 }
253 return result; 240 return result;
254 } 241 }
255 242
256 // Note: code duplicated below (it's inconvenient to use a template here). 243 // Note: code duplicated below (it's inconvenient to use a template here).
257 GURL GURL::ReplaceComponents( 244 GURL GURL::ReplaceComponents(
258 const url::Replacements<char>& replacements) const { 245 const url::Replacements<char>& replacements) const {
259 GURL result; 246 GURL result;
260 247
261 // Not allowed for invalid URLs. 248 // Not allowed for invalid URLs.
262 if (!is_valid_) 249 if (!is_valid_)
263 return GURL(); 250 return GURL();
264 251
265 // Reserve enough room in the output for the input, plus some extra so that
266 // we have room if we have to escape a few things without reallocating.
267 result.spec_.reserve(spec_.size() + 32);
268 url::StdStringCanonOutput output(&result.spec_); 252 url::StdStringCanonOutput output(&result.spec_);
269
270 result.is_valid_ = url::ReplaceComponents( 253 result.is_valid_ = url::ReplaceComponents(
271 spec_.data(), static_cast<int>(spec_.length()), parsed_, replacements, 254 spec_.data(), static_cast<int>(spec_.length()), parsed_, replacements,
272 NULL, &output, &result.parsed_); 255 NULL, &output, &result.parsed_);
273 256
274 output.Complete(); 257 output.Complete();
275 if (result.is_valid_ && result.SchemeIsFileSystem()) { 258 if (result.is_valid_ && result.SchemeIsFileSystem()) {
276 result.inner_url_.reset(new GURL(result.spec_.data(), 259 result.inner_url_.reset(new GURL(result.spec_.data(),
277 result.parsed_.Length(), 260 result.parsed_.Length(),
278 *result.parsed_.inner_parsed(), true)); 261 *result.parsed_.inner_parsed(), true));
279 } 262 }
280 return result; 263 return result;
281 } 264 }
282 265
283 // Note: code duplicated above (it's inconvenient to use a template here). 266 // Note: code duplicated above (it's inconvenient to use a template here).
284 GURL GURL::ReplaceComponents( 267 GURL GURL::ReplaceComponents(
285 const url::Replacements<base::char16>& replacements) const { 268 const url::Replacements<base::char16>& replacements) const {
286 GURL result; 269 GURL result;
287 270
288 // Not allowed for invalid URLs. 271 // Not allowed for invalid URLs.
289 if (!is_valid_) 272 if (!is_valid_)
290 return GURL(); 273 return GURL();
291 274
292 // Reserve enough room in the output for the input, plus some extra so that
293 // we have room if we have to escape a few things without reallocating.
294 result.spec_.reserve(spec_.size() + 32);
295 url::StdStringCanonOutput output(&result.spec_); 275 url::StdStringCanonOutput output(&result.spec_);
296
297 result.is_valid_ = url::ReplaceComponents( 276 result.is_valid_ = url::ReplaceComponents(
298 spec_.data(), static_cast<int>(spec_.length()), parsed_, replacements, 277 spec_.data(), static_cast<int>(spec_.length()), parsed_, replacements,
299 NULL, &output, &result.parsed_); 278 NULL, &output, &result.parsed_);
300 279
301 output.Complete(); 280 output.Complete();
302 if (result.is_valid_ && result.SchemeIsFileSystem()) { 281 if (result.is_valid_ && result.SchemeIsFileSystem()) {
303 result.inner_url_.reset(new GURL(result.spec_.data(), 282 result.inner_url_.reset(new GURL(result.spec_.data(),
304 result.parsed_.Length(), 283 result.parsed_.Length(),
305 *result.parsed_.inner_parsed(), true)); 284 *result.parsed_.inner_parsed(), true));
306 } 285 }
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 } 487 }
509 488
510 bool operator==(const GURL& x, const base::StringPiece& spec) { 489 bool operator==(const GURL& x, const base::StringPiece& spec) {
511 DCHECK_EQ(GURL(spec).possibly_invalid_spec(), spec); 490 DCHECK_EQ(GURL(spec).possibly_invalid_spec(), spec);
512 return x.possibly_invalid_spec() == spec; 491 return x.possibly_invalid_spec() == spec;
513 } 492 }
514 493
515 bool operator!=(const GURL& x, const base::StringPiece& spec) { 494 bool operator!=(const GURL& x, const base::StringPiece& spec) {
516 return !(x == spec); 495 return !(x == spec);
517 } 496 }
OLDNEW
« no previous file with comments | « no previous file | url/url_canon.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698