| OLD | NEW |
| 1 // Copyright (c) 2012, 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 part of dart.uri; | 5 part of dart.uri; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Javascript-like URI encode/decode functions. | 8 * Javascript-like URI encode/decode functions. |
| 9 * The documentation here borrows heavily from the original Javascript | 9 * The documentation here borrows heavily from the original Javascript |
| 10 * doumentation on MDN at: | 10 * doumentation on MDN at: |
| 11 * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects | 11 * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects |
| 12 */ | 12 */ |
| 13 | 13 |
| 14 /** | 14 /** |
| 15 * A JavaScript-like URI encoder. Encodes Uniform Resource Identifier [uri] | 15 * A JavaScript-like URI encoder. Encodes Uniform Resource Identifier [uri] |
| 16 * by replacing each instance of certain characters by one, two, three, or four | 16 * by replacing each instance of certain characters by one, two, three, or four |
| 17 * escape sequences representing the UTF-8 encoding of the character (will | 17 * escape sequences representing the UTF-8 encoding of the character (will |
| 18 * only be four escape sequences for characters composed of two "surrogate" | 18 * only be four escape sequences for characters composed of two "surrogate" |
| 19 * characters). This assumes that [uri] is a complete URI, so does not encode | 19 * characters). This assumes that [uri] is a complete URI, so does not encode |
| 20 * reserved characters that have special meaning in the URI: [:#;,/?:@&=+\$:] | 20 * reserved characters that have special meaning in the URI: [:#;,/?:@&=+\$:] |
| 21 * It returns the escaped URI. | 21 * It returns the escaped URI. |
| 22 */ | 22 */ |
| 23 String encodeUri(String uri) { | 23 String encodeUri(String uri) { |
| 24 return _uriEncode( | 24 return _uriEncode( |
| 25 "-_.!~*'()#;,/?:@&=+\$0123456789" | 25 "-_.!~*'()#;,/?:@&=\$0123456789" |
| 26 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", uri); | 26 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", uri); |
| 27 } | 27 } |
| 28 | 28 |
| 29 /** | 29 /** |
| 30 * An implementation of JavaScript's decodeURIComponent function. | 30 * An implementation of JavaScript's decodeURIComponent function. |
| 31 * Decodes a Uniform Resource Identifier [uri] previously created by | 31 * Decodes a Uniform Resource Identifier [uri] previously created by |
| 32 * encodeURI or by a similar routine. It replaces each escape sequence | 32 * encodeURI or by a similar routine. It replaces each escape sequence |
| 33 * in [uri] with the character that it represents. It does not decode | 33 * in [uri] with the character that it represents. It does not decode |
| 34 * escape sequences that could not have been introduced by encodeURI. | 34 * escape sequences that could not have been introduced by encodeURI. |
| 35 * It returns the unescaped URI. | 35 * It returns the unescaped URI. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 * It encodes all characters in the string [text] except for those | 75 * It encodes all characters in the string [text] except for those |
| 76 * that appear in [canonical], and returns the escaped string. | 76 * that appear in [canonical], and returns the escaped string. |
| 77 */ | 77 */ |
| 78 String _uriEncode(String canonical, String text) { | 78 String _uriEncode(String canonical, String text) { |
| 79 final String hex = '0123456789ABCDEF'; | 79 final String hex = '0123456789ABCDEF'; |
| 80 var byteToHex = (int v) => '%${hex[v >> 4]}${hex[v&0xf]}'; | 80 var byteToHex = (int v) => '%${hex[v >> 4]}${hex[v&0xf]}'; |
| 81 StringBuffer result = new StringBuffer(); | 81 StringBuffer result = new StringBuffer(); |
| 82 for (int i = 0; i < text.length; i++) { | 82 for (int i = 0; i < text.length; i++) { |
| 83 if (canonical.indexOf(text[i]) >= 0) { | 83 if (canonical.indexOf(text[i]) >= 0) { |
| 84 result.add(text[i]); | 84 result.add(text[i]); |
| 85 } else if (text[i] == " ") { |
| 86 result.add("+"); |
| 85 } else { | 87 } else { |
| 86 int ch = text.charCodeAt(i); | 88 int ch = text.charCodeAt(i); |
| 87 if (ch >= 0xD800 && ch < 0xDC00) { | 89 if (ch >= 0xD800 && ch < 0xDC00) { |
| 88 // Low surrogate. We expect a next char high surrogate. | 90 // Low surrogate. We expect a next char high surrogate. |
| 89 ++i; | 91 ++i; |
| 90 int nextCh = text.length == i ? 0 : text.charCodeAt(i); | 92 int nextCh = text.length == i ? 0 : text.charCodeAt(i); |
| 91 if (nextCh >= 0xDC00 && nextCh < 0xE000) { | 93 if (nextCh >= 0xDC00 && nextCh < 0xE000) { |
| 92 // convert the pair to a U+10000 codepoint | 94 // convert the pair to a U+10000 codepoint |
| 93 ch = 0x10000 + ((ch-0xD800) << 10) + (nextCh - 0xDC00); | 95 ch = 0x10000 + ((ch-0xD800) << 10) + (nextCh - 0xDC00); |
| 94 } else { | 96 } else { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 /** | 132 /** |
| 131 * A JavaScript-like decodeURI function. It unescapes the string [text] and | 133 * A JavaScript-like decodeURI function. It unescapes the string [text] and |
| 132 * returns the unescaped string. | 134 * returns the unescaped string. |
| 133 */ | 135 */ |
| 134 String _uriDecode(String text) { | 136 String _uriDecode(String text) { |
| 135 StringBuffer result = new StringBuffer(); | 137 StringBuffer result = new StringBuffer(); |
| 136 List<int> codepoints = new List<int>(); | 138 List<int> codepoints = new List<int>(); |
| 137 for (int i = 0; i < text.length;) { | 139 for (int i = 0; i < text.length;) { |
| 138 String ch = text[i]; | 140 String ch = text[i]; |
| 139 if (ch != '%') { | 141 if (ch != '%') { |
| 140 result.add(ch); | 142 if (ch == '+') { |
| 143 result.add(" "); |
| 144 } else { |
| 145 result.add(ch); |
| 146 } |
| 141 i++; | 147 i++; |
| 142 } else { | 148 } else { |
| 143 codepoints.clear(); | 149 codepoints.clear(); |
| 144 while (ch == '%') { | 150 while (ch == '%') { |
| 145 if (++i > text.length - 2) { | 151 if (++i > text.length - 2) { |
| 146 throw new ArgumentError('Truncated URI'); | 152 throw new ArgumentError('Truncated URI'); |
| 147 } | 153 } |
| 148 codepoints.add(_hexCharPairToByte(text, i)); | 154 codepoints.add(_hexCharPairToByte(text, i)); |
| 149 i += 2; | 155 i += 2; |
| 150 if (i == text.length) | 156 if (i == text.length) |
| 151 break; | 157 break; |
| 152 ch = text[i]; | 158 ch = text[i]; |
| 153 } | 159 } |
| 154 result.add(decodeUtf8(codepoints)); | 160 result.add(decodeUtf8(codepoints)); |
| 155 } | 161 } |
| 156 } | 162 } |
| 157 return result.toString(); | 163 return result.toString(); |
| 158 } | 164 } |
| 159 | 165 |
| OLD | NEW |