1*6777b538SAndroid Build Coastguard Worker// Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker// found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker#import "net/base/apple/url_conversions.h" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker#import <Foundation/Foundation.h> 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker#include "base/strings/escape.h" 10*6777b538SAndroid Build Coastguard Worker#include "url/gurl.h" 11*6777b538SAndroid Build Coastguard Worker#include "url/url_canon.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Workernamespace net { 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard WorkerNSURL* NSURLWithGURL(const GURL& url) { 16*6777b538SAndroid Build Coastguard Worker if (!url.is_valid()) { 17*6777b538SAndroid Build Coastguard Worker return nil; 18*6777b538SAndroid Build Coastguard Worker } 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // NSURL strictly enforces RFC 1738 which requires that certain characters 21*6777b538SAndroid Build Coastguard Worker // are always encoded. These characters are: "<", ">", """, "#", "%", "{", 22*6777b538SAndroid Build Coastguard Worker // "}", "|", "\", "^", "~", "[", "]", and "`". 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // GURL leaves some of these characters unencoded in the path, query, and 25*6777b538SAndroid Build Coastguard Worker // ref. This function manually encodes those components, and then passes the 26*6777b538SAndroid Build Coastguard Worker // result to NSURL. 27*6777b538SAndroid Build Coastguard Worker GURL::Replacements replacements; 28*6777b538SAndroid Build Coastguard Worker std::string escaped_path = base::EscapeNSURLPrecursor(url.path()); 29*6777b538SAndroid Build Coastguard Worker std::string escaped_query = base::EscapeNSURLPrecursor(url.query()); 30*6777b538SAndroid Build Coastguard Worker std::string escaped_ref = base::EscapeNSURLPrecursor(url.ref()); 31*6777b538SAndroid Build Coastguard Worker if (!escaped_path.empty()) { 32*6777b538SAndroid Build Coastguard Worker replacements.SetPathStr(escaped_path); 33*6777b538SAndroid Build Coastguard Worker } 34*6777b538SAndroid Build Coastguard Worker if (!escaped_query.empty()) { 35*6777b538SAndroid Build Coastguard Worker replacements.SetQueryStr(escaped_query); 36*6777b538SAndroid Build Coastguard Worker } 37*6777b538SAndroid Build Coastguard Worker if (!escaped_ref.empty()) { 38*6777b538SAndroid Build Coastguard Worker replacements.SetRefStr(escaped_ref); 39*6777b538SAndroid Build Coastguard Worker } 40*6777b538SAndroid Build Coastguard Worker GURL escaped_url = url.ReplaceComponents(replacements); 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker NSString* escaped_url_string = 43*6777b538SAndroid Build Coastguard Worker [NSString stringWithUTF8String:escaped_url.spec().c_str()]; 44*6777b538SAndroid Build Coastguard Worker return [NSURL URLWithString:escaped_url_string]; 45*6777b538SAndroid Build Coastguard Worker} 46*6777b538SAndroid Build Coastguard Worker 47*6777b538SAndroid Build Coastguard WorkerGURL GURLWithNSURL(NSURL* url) { 48*6777b538SAndroid Build Coastguard Worker if (url) { 49*6777b538SAndroid Build Coastguard Worker return GURL(url.absoluteString.UTF8String); 50*6777b538SAndroid Build Coastguard Worker } 51*6777b538SAndroid Build Coastguard Worker return GURL(); 52*6777b538SAndroid Build Coastguard Worker} 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker} // namespace net 55