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

Side by Side Diff: dart/client/util/Uri.dart

Issue 9295043: Create a URI class in utils/ (based on client/util/). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address review comments and *add* the new test suite Created 8 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | dart/client/util/utilslib.dart » ('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 (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * A parsed URI, inspired by: 6 * A parsed URI, inspired by:
7 * http://closure-library.googlecode.com/svn/docs/class_goog_Uri.html 7 * http://closure-library.googlecode.com/svn/docs/class_goog_Uri.html
8 */ 8 */
9 class Uri { 9 class Uri extends uri.Uri {
10 /** 10 /**
11 * Parses a URL query string into a map. Because you can have multiple values 11 * Parses a URL query string into a map. Because you can have multiple values
12 * for the same parameter name, each parameter name maps to a list of 12 * for the same parameter name, each parameter name maps to a list of
13 * values. For example, '?a=b&c=d&a=e' would be parsed as 13 * values. For example, '?a=b&c=d&a=e' would be parsed as
14 * [{'a':['b','e'],'c':['d']}]. 14 * [{'a':['b','e'],'c':['d']}].
15 */ 15 */
16 // TODO(jmesserly): consolidate with new Uri.fromString(...) 16 // TODO(jmesserly): consolidate with new Uri.fromString(...)
17 static Map<String, List<String>> parseQuery(String queryString) { 17 static Map<String, List<String>> parseQuery(String queryString) {
18 final queryParams = new Map<String, List<String>>(); 18 final queryParams = new Map<String, List<String>>();
19 if (queryString.startsWith('?')) { 19 if (queryString.startsWith('?')) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 if (component == null) return component; 66 if (component == null) return component;
67 67
68 return component.replaceAll('%3A', ':') 68 return component.replaceAll('%3A', ':')
69 .replaceAll('%2F', '/') 69 .replaceAll('%2F', '/')
70 .replaceAll('%3F', '?') 70 .replaceAll('%3F', '?')
71 .replaceAll('%3D', '=') 71 .replaceAll('%3D', '=')
72 .replaceAll('%26', '&') 72 .replaceAll('%26', '&')
73 .replaceAll('%20', ' '); 73 .replaceAll('%20', ' ');
74 } 74 }
75 75
76 String scheme; 76 Uri.fromString(String uri) : super.fromString(uri);
77 String userInfo;
78 String domain;
79 int port;
80 String path;
81 String query;
82 String fragment;
83
84 Uri.fromString(String uri) {
85 final m = _splitRe.firstMatch(uri);
86
87 scheme = _decodeOrEmpty(m[_COMPONENT_SCHEME]);
88 userInfo = _decodeOrEmpty(m[_COMPONENT_USER_INFO]);
89 domain = _decodeOrEmpty(m[_COMPONENT_DOMAIN]);
90 port = _parseIntOrZero(m[_COMPONENT_PORT]);
91 path = _decodeOrEmpty(m[_COMPONENT_PATH]);
92 query = _decodeOrEmpty(m[_COMPONENT_QUERY_DATA]);
93 fragment = _decodeOrEmpty(m[_COMPONENT_FRAGMENT]);
94 }
95
96 static String _decodeOrEmpty(String val) {
97 // TODO(jmesserly): use Uri.decodeComponent when available
98 //return val ? Uri.decodeComponent(val) : '';
99 return val != null ? val : '';
100 }
101
102 static int _parseIntOrZero(String val) {
103 if (val !== null && val != '') {
104 return Math.parseInt(val);
105 } else {
106 return 0;
107 }
108 }
109
110 // NOTE: This code was ported from: closure-library/closure/goog/uri/utils.js
111 static RegExp _splitReLazy;
112
113 static RegExp get _splitRe() {
114 if (_splitReLazy == null) {
115 _splitReLazy = new RegExp(
116 '^' +
117 '(?:' +
118 '([^:/?#.]+)' + // scheme - ignore special characters
119 // used by other URL parts such as :,
120 // ?, /, #, and .
121 ':)?' +
122 '(?://' +
123 '(?:([^/?#]*)@)?' + // userInfo
124 '([\\w\\d\\-\\u0100-\\uffff.%]*)' +
125 // domain - restrict to letters,
126 // digits, dashes, dots, percent
127 // escapes, and unicode characters.
128 '(?::([0-9]+))?' + // port
129 ')?' +
130 '([^?#]+)?' + // path
131 '(?:\\?([^#]*))?' + // query
132 '(?:#(.*))?' + // fragment
133 '\$');
134 }
135 return _splitReLazy;
136 }
137
138 static final _COMPONENT_SCHEME = 1;
139 static final _COMPONENT_USER_INFO = 2;
140 static final _COMPONENT_DOMAIN = 3;
141 static final _COMPONENT_PORT = 4;
142 static final _COMPONENT_PATH = 5;
143 static final _COMPONENT_QUERY_DATA = 6;
144 static final _COMPONENT_FRAGMENT = 7;
145 } 77 }
OLDNEW
« no previous file with comments | « no previous file | dart/client/util/utilslib.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698