| 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.io; | 5 part of dart.io; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Parser for MIME multipart types of data as described in RFC 2046 | 8 * Parser for MIME multipart types of data as described in RFC 2046 |
| 9 * section 5.1.1. The data to parse is supplied through the [:update:] | 9 * section 5.1.1. The data to parse is supplied through the [:update:] |
| 10 * method. As the data is parsed the following callbacks are called: | 10 * method. As the data is parsed the following callbacks are called: |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 partEnd(false); | 156 partEnd(false); |
| 157 } | 157 } |
| 158 _state = _HEADER_START; | 158 _state = _HEADER_START; |
| 159 break; | 159 break; |
| 160 | 160 |
| 161 case _HEADER_START: | 161 case _HEADER_START: |
| 162 if (byte == _CharCode.CR) { | 162 if (byte == _CharCode.CR) { |
| 163 _state = _HEADER_ENDING; | 163 _state = _HEADER_ENDING; |
| 164 } else { | 164 } else { |
| 165 // Start of new header field. | 165 // Start of new header field. |
| 166 _headerField.addCharCode(_toLowerCase(byte)); | 166 _headerField.writeCharCode(_toLowerCase(byte)); |
| 167 _state = _HEADER_FIELD; | 167 _state = _HEADER_FIELD; |
| 168 } | 168 } |
| 169 break; | 169 break; |
| 170 | 170 |
| 171 case _HEADER_FIELD: | 171 case _HEADER_FIELD: |
| 172 if (byte == _CharCode.COLON) { | 172 if (byte == _CharCode.COLON) { |
| 173 _state = _HEADER_VALUE_START; | 173 _state = _HEADER_VALUE_START; |
| 174 } else { | 174 } else { |
| 175 if (!_isTokenChar(byte)) { | 175 if (!_isTokenChar(byte)) { |
| 176 throw new MimeParserException("Invalid header field name"); | 176 throw new MimeParserException("Invalid header field name"); |
| 177 } | 177 } |
| 178 _headerField.addCharCode(_toLowerCase(byte)); | 178 _headerField.writeCharCode(_toLowerCase(byte)); |
| 179 } | 179 } |
| 180 break; | 180 break; |
| 181 | 181 |
| 182 case _HEADER_VALUE_START: | 182 case _HEADER_VALUE_START: |
| 183 if (byte == _CharCode.CR) { | 183 if (byte == _CharCode.CR) { |
| 184 _state = _HEADER_VALUE_FOLDING_OR_ENDING; | 184 _state = _HEADER_VALUE_FOLDING_OR_ENDING; |
| 185 } else if (byte != _CharCode.SP && byte != _CharCode.HT) { | 185 } else if (byte != _CharCode.SP && byte != _CharCode.HT) { |
| 186 // Start of new header value. | 186 // Start of new header value. |
| 187 _headerValue.addCharCode(byte); | 187 _headerValue.writeCharCode(byte); |
| 188 _state = _HEADER_VALUE; | 188 _state = _HEADER_VALUE; |
| 189 } | 189 } |
| 190 break; | 190 break; |
| 191 | 191 |
| 192 case _HEADER_VALUE: | 192 case _HEADER_VALUE: |
| 193 if (byte == _CharCode.CR) { | 193 if (byte == _CharCode.CR) { |
| 194 _state = _HEADER_VALUE_FOLDING_OR_ENDING; | 194 _state = _HEADER_VALUE_FOLDING_OR_ENDING; |
| 195 } else { | 195 } else { |
| 196 _headerValue.addCharCode(byte); | 196 _headerValue.writeCharCode(byte); |
| 197 } | 197 } |
| 198 break; | 198 break; |
| 199 | 199 |
| 200 case _HEADER_VALUE_FOLDING_OR_ENDING: | 200 case _HEADER_VALUE_FOLDING_OR_ENDING: |
| 201 _expect(byte, _CharCode.LF); | 201 _expect(byte, _CharCode.LF); |
| 202 _state = _HEADER_VALUE_FOLD_OR_END; | 202 _state = _HEADER_VALUE_FOLD_OR_END; |
| 203 break; | 203 break; |
| 204 | 204 |
| 205 case _HEADER_VALUE_FOLD_OR_END: | 205 case _HEADER_VALUE_FOLD_OR_END: |
| 206 if (byte == _CharCode.SP || byte == _CharCode.HT) { | 206 if (byte == _CharCode.SP || byte == _CharCode.HT) { |
| 207 _state = _HEADER_VALUE_START; | 207 _state = _HEADER_VALUE_START; |
| 208 } else { | 208 } else { |
| 209 String headerField = _headerField.toString(); | 209 String headerField = _headerField.toString(); |
| 210 String headerValue =_headerValue.toString(); | 210 String headerValue =_headerValue.toString(); |
| 211 if (headerReceived != null) { | 211 if (headerReceived != null) { |
| 212 headerReceived(headerField, headerValue); | 212 headerReceived(headerField, headerValue); |
| 213 } | 213 } |
| 214 _headerField.clear(); | 214 _headerField = new StringBuffer(); |
| 215 _headerValue.clear(); | 215 _headerValue = new StringBuffer(); |
| 216 if (byte == _CharCode.CR) { | 216 if (byte == _CharCode.CR) { |
| 217 _state = _HEADER_ENDING; | 217 _state = _HEADER_ENDING; |
| 218 } else { | 218 } else { |
| 219 // Start of new header field. | 219 // Start of new header field. |
| 220 _headerField.addCharCode(_toLowerCase(byte)); | 220 _headerField.writeCharCode(_toLowerCase(byte)); |
| 221 _state = _HEADER_FIELD; | 221 _state = _HEADER_FIELD; |
| 222 } | 222 } |
| 223 } | 223 } |
| 224 break; | 224 break; |
| 225 | 225 |
| 226 case _HEADER_ENDING: | 226 case _HEADER_ENDING: |
| 227 _expect(byte, _CharCode.LF); | 227 _expect(byte, _CharCode.LF); |
| 228 if (headersComplete != null) headersComplete(); | 228 if (headersComplete != null) headersComplete(); |
| 229 _state = _CONTENT; | 229 _state = _CONTENT; |
| 230 contentStartIndex = index + 1; | 230 contentStartIndex = index + 1; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 Function partDataReceived; | 324 Function partDataReceived; |
| 325 Function partEnd; | 325 Function partEnd; |
| 326 } | 326 } |
| 327 | 327 |
| 328 | 328 |
| 329 class MimeParserException implements Exception { | 329 class MimeParserException implements Exception { |
| 330 const MimeParserException([String this.message = ""]); | 330 const MimeParserException([String this.message = ""]); |
| 331 String toString() => "MimeParserException: $message"; | 331 String toString() => "MimeParserException: $message"; |
| 332 final String message; | 332 final String message; |
| 333 } | 333 } |
| OLD | NEW |