| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project 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 "src/uri.h" | 5 #include "src/uri.h" |
| 6 | 6 |
| 7 #include "src/char-predicates-inl.h" | 7 #include "src/char-predicates-inl.h" |
| 8 #include "src/handles.h" | 8 #include "src/handles.h" |
| 9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 #include "src/list.h" | 10 #include "src/list.h" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 } else { | 85 } else { |
| 86 buffer->Add(decoded); | 86 buffer->Add(decoded); |
| 87 } | 87 } |
| 88 } | 88 } |
| 89 | 89 |
| 90 bool IntoTwoByte(int index, bool is_uri, int uri_length, | 90 bool IntoTwoByte(int index, bool is_uri, int uri_length, |
| 91 String::FlatContent* uri_content, List<uc16>* buffer) { | 91 String::FlatContent* uri_content, List<uc16>* buffer) { |
| 92 for (int k = index; k < uri_length; k++) { | 92 for (int k = index; k < uri_length; k++) { |
| 93 uc16 code = uri_content->Get(k); | 93 uc16 code = uri_content->Get(k); |
| 94 if (code == '%') { | 94 if (code == '%') { |
| 95 uc16 decoded; | 95 int two_digits; |
| 96 if (k + 2 >= uri_length || | 96 if (k + 2 >= uri_length || |
| 97 (decoded = TwoDigitHex(uri_content->Get(k + 1), | 97 (two_digits = TwoDigitHex(uri_content->Get(k + 1), |
| 98 uri_content->Get(k + 2))) < 0) { | 98 uri_content->Get(k + 2))) < 0) { |
| 99 return false; | 99 return false; |
| 100 } | 100 } |
| 101 k += 2; | 101 k += 2; |
| 102 uc16 decoded = static_cast<uc16>(two_digits); |
| 102 if (decoded > unibrow::Utf8::kMaxOneByteChar) { | 103 if (decoded > unibrow::Utf8::kMaxOneByteChar) { |
| 103 uint8_t octets[unibrow::Utf8::kMaxEncodedSize]; | 104 uint8_t octets[unibrow::Utf8::kMaxEncodedSize]; |
| 104 octets[0] = decoded; | 105 octets[0] = decoded; |
| 105 | 106 |
| 106 int number_of_continuation_bytes = 0; | 107 int number_of_continuation_bytes = 0; |
| 107 while ((decoded << ++number_of_continuation_bytes) & 0x80) { | 108 while ((decoded << ++number_of_continuation_bytes) & 0x80) { |
| 108 if (number_of_continuation_bytes > 3 || k + 3 >= uri_length) { | 109 if (number_of_continuation_bytes > 3 || k + 3 >= uri_length) { |
| 109 return false; | 110 return false; |
| 110 } | 111 } |
| 111 | |
| 112 uc16 continuation_byte; | |
| 113 | |
| 114 if (uri_content->Get(++k) != '%' || | 112 if (uri_content->Get(++k) != '%' || |
| 115 (continuation_byte = TwoDigitHex(uri_content->Get(k + 1), | 113 (two_digits = TwoDigitHex(uri_content->Get(k + 1), |
| 116 uri_content->Get(k + 2))) < 0) { | 114 uri_content->Get(k + 2))) < 0) { |
| 117 return false; | 115 return false; |
| 118 } | 116 } |
| 119 k += 2; | 117 k += 2; |
| 118 uc16 continuation_byte = static_cast<uc16>(two_digits); |
| 120 octets[number_of_continuation_bytes] = continuation_byte; | 119 octets[number_of_continuation_bytes] = continuation_byte; |
| 121 } | 120 } |
| 122 | 121 |
| 123 if (!DecodeOctets(octets, number_of_continuation_bytes, buffer)) { | 122 if (!DecodeOctets(octets, number_of_continuation_bytes, buffer)) { |
| 124 return false; | 123 return false; |
| 125 } | 124 } |
| 126 } else { | 125 } else { |
| 127 AddToBuffer(decoded, uri_content, k - 2, is_uri, buffer); | 126 AddToBuffer(decoded, uri_content, k - 2, is_uri, buffer); |
| 128 } | 127 } |
| 129 } else { | 128 } else { |
| 130 buffer->Add(code); | 129 buffer->Add(code); |
| 131 } | 130 } |
| 132 } | 131 } |
| 133 return true; | 132 return true; |
| 134 } | 133 } |
| 135 | 134 |
| 136 bool IntoOneAndTwoByte(Handle<String> uri, bool is_uri, | 135 bool IntoOneAndTwoByte(Handle<String> uri, bool is_uri, |
| 137 List<uint8_t>* one_byte_buffer, | 136 List<uint8_t>* one_byte_buffer, |
| 138 List<uc16>* two_byte_buffer) { | 137 List<uc16>* two_byte_buffer) { |
| 139 DisallowHeapAllocation no_gc; | 138 DisallowHeapAllocation no_gc; |
| 140 String::FlatContent uri_content = uri->GetFlatContent(); | 139 String::FlatContent uri_content = uri->GetFlatContent(); |
| 141 | 140 |
| 142 int uri_length = uri->length(); | 141 int uri_length = uri->length(); |
| 143 for (int k = 0; k < uri_length; k++) { | 142 for (int k = 0; k < uri_length; k++) { |
| 144 uc16 code = uri_content.Get(k); | 143 uc16 code = uri_content.Get(k); |
| 145 if (code == '%') { | 144 if (code == '%') { |
| 146 uc16 decoded; | 145 int two_digits; |
| 147 if (k + 2 >= uri_length || | 146 if (k + 2 >= uri_length || |
| 148 (decoded = TwoDigitHex(uri_content.Get(k + 1), | 147 (two_digits = TwoDigitHex(uri_content.Get(k + 1), |
| 149 uri_content.Get(k + 2))) < 0) { | 148 uri_content.Get(k + 2))) < 0) { |
| 150 return false; | 149 return false; |
| 151 } | 150 } |
| 152 | 151 |
| 152 uc16 decoded = static_cast<uc16>(two_digits); |
| 153 if (decoded > unibrow::Utf8::kMaxOneByteChar) { | 153 if (decoded > unibrow::Utf8::kMaxOneByteChar) { |
| 154 return IntoTwoByte(k, is_uri, uri_length, &uri_content, | 154 return IntoTwoByte(k, is_uri, uri_length, &uri_content, |
| 155 two_byte_buffer); | 155 two_byte_buffer); |
| 156 } | 156 } |
| 157 | 157 |
| 158 AddToBuffer(decoded, &uri_content, k, is_uri, one_byte_buffer); | 158 AddToBuffer(decoded, &uri_content, k, is_uri, one_byte_buffer); |
| 159 k += 2; | 159 k += 2; |
| 160 } else { | 160 } else { |
| 161 if (code > unibrow::Utf8::kMaxOneByteChar) { | 161 if (code > unibrow::Utf8::kMaxOneByteChar) { |
| 162 return IntoTwoByte(k, is_uri, uri_length, &uri_content, | 162 return IntoTwoByte(k, is_uri, uri_length, &uri_content, |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 MaybeHandle<String> Uri::Unescape(Isolate* isolate, Handle<String> string) { | 496 MaybeHandle<String> Uri::Unescape(Isolate* isolate, Handle<String> string) { |
| 497 Handle<String> result; | 497 Handle<String> result; |
| 498 string = String::Flatten(string); | 498 string = String::Flatten(string); |
| 499 return string->IsOneByteRepresentationUnderneath() | 499 return string->IsOneByteRepresentationUnderneath() |
| 500 ? UnescapePrivate<uint8_t>(isolate, string) | 500 ? UnescapePrivate<uint8_t>(isolate, string) |
| 501 : UnescapePrivate<uc16>(isolate, string); | 501 : UnescapePrivate<uc16>(isolate, string); |
| 502 } | 502 } |
| 503 | 503 |
| 504 } // namespace internal | 504 } // namespace internal |
| 505 } // namespace v8 | 505 } // namespace v8 |
| OLD | NEW |