OLD | NEW |
(Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // |
| 5 // VMOptions= |
| 6 // VMOptions=--short_socket_read |
| 7 // VMOptions=--short_socket_write |
| 8 // VMOptions=--short_socket_read --short_socket_write |
| 9 |
| 10 import "package:expect/expect.dart"; |
| 11 import 'dart:async'; |
| 12 import 'dart:io'; |
| 13 |
| 14 class FormField { |
| 15 final String name; |
| 16 final value; |
| 17 final String contentType; |
| 18 final String filename; |
| 19 |
| 20 FormField(String this.name, |
| 21 this.value, |
| 22 {String this.contentType, |
| 23 String this.filename}); |
| 24 |
| 25 bool operator==(other) { |
| 26 if (value.length != other.value.length) return false; |
| 27 for (int i = 0; i < value.length; i++) { |
| 28 if (value[i] != other.value[i]) { |
| 29 return false; |
| 30 } |
| 31 } |
| 32 return name == other.name && |
| 33 contentType == other.contentType && |
| 34 filename == other.filename; |
| 35 } |
| 36 |
| 37 String toString() { |
| 38 return "FormField('$name', '$value', '$contentType', '$filename')"; |
| 39 } |
| 40 } |
| 41 |
| 42 void postDataTest(List<int> message, |
| 43 String contentType, |
| 44 String boundary, |
| 45 List<FormField> expectedFields) { |
| 46 HttpServer.bind("127.0.0.1", 0).then((server) { |
| 47 server.listen((request) { |
| 48 String boundary = request.headers.contentType.parameters['boundary']; |
| 49 request |
| 50 .transform(new MimeMultipartTransformer(boundary)) |
| 51 .map(HttpMultipartFormData.parse) |
| 52 .map((multipart) { |
| 53 var future; |
| 54 if (multipart.isText) { |
| 55 future = multipart |
| 56 .fold(new StringBuffer(), (b, s) => b..write(s)) |
| 57 .then((b) => b.toString()); |
| 58 } else { |
| 59 future = multipart |
| 60 .fold([], (b, s) => b..addAll(s)); |
| 61 } |
| 62 return future |
| 63 .then((data) { |
| 64 String contentType; |
| 65 if (multipart.contentType != null) { |
| 66 contentType = multipart.contentType.mimeType; |
| 67 } |
| 68 return new FormField( |
| 69 multipart.contentDisposition.parameters['name'], |
| 70 data, |
| 71 contentType: contentType, |
| 72 filename: |
| 73 multipart.contentDisposition.parameters['filename']); |
| 74 }); |
| 75 }) |
| 76 .fold([], (l, f) => l..add(f)) |
| 77 .then(Future.wait) |
| 78 .then((fields) { |
| 79 Expect.listEquals(expectedFields, fields); |
| 80 request.response.close().then((_) => server.close()); |
| 81 }); |
| 82 }); |
| 83 var client = new HttpClient(); |
| 84 client.post('127.0.0.1', server.port, '/') |
| 85 .then((request) { |
| 86 request.headers.set('content-type', |
| 87 'multipart/form-data; boundary=$boundary'); |
| 88 request.add(message); |
| 89 return request.close(); |
| 90 }) |
| 91 .then((response) { |
| 92 client.close(); |
| 93 }); |
| 94 }); |
| 95 } |
| 96 |
| 97 void testPostData() { |
| 98 var message = ''' |
| 99 \r\n--AaB03x\r |
| 100 Content-Disposition: form-data; name="submit-name"\r |
| 101 \r |
| 102 Larry\r |
| 103 --AaB03x\r |
| 104 Content-Disposition: form-data; name="files"; filename="file1.txt"\r |
| 105 Content-Type: text/plain\r |
| 106 \r |
| 107 Content of file\r |
| 108 --AaB03x--\r\n'''; |
| 109 |
| 110 |
| 111 postDataTest(message.codeUnits, |
| 112 'multipart/form-data', |
| 113 'AaB03x', |
| 114 [new FormField('submit-name', 'Larry'), |
| 115 new FormField('files', |
| 116 'Content of file', |
| 117 contentType: 'text/plain', |
| 118 filename: 'file1.txt')]); |
| 119 |
| 120 // Similar test using Chrome posting. |
| 121 message = [ |
| 122 45, 45, 45, 45, 45, 45, 87, 101, 98, 75, 105, 116, 70, 111, 114, 109, 66, |
| 123 111, 117, 110, 100, 97, 114, 121, 81, 83, 113, 108, 56, 107, 68, 65, 76, |
| 124 77, 55, 116, 65, 107, 67, 49, 13, 10, 67, 111, 110, 116, 101, 110, 116, |
| 125 45, 68, 105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 58, 32, 102, |
| 126 111, 114, 109, 45, 100, 97, 116, 97, 59, 32, 110, 97, 109, 101, 61, 34, |
| 127 115, 117, 98, 109, 105, 116, 45, 110, 97, 109, 101, 34, 13, 10, 13, 10, |
| 128 84, 101, 115, 116, 13, 10, 45, 45, 45, 45, 45, 45, 87, 101, 98, 75, 105, |
| 129 116, 70, 111, 114, 109, 66, 111, 117, 110, 100, 97, 114, 121, 81, 83, 113, |
| 130 108, 56, 107, 68, 65, 76, 77, 55, 116, 65, 107, 67, 49, 13, 10, 67, 111, |
| 131 110, 116, 101, 110, 116, 45, 68, 105, 115, 112, 111, 115, 105, 116, 105, |
| 132 111, 110, 58, 32, 102, 111, 114, 109, 45, 100, 97, 116, 97, 59, 32, 110, |
| 133 97, 109, 101, 61, 34, 102, 105, 108, 101, 115, 34, 59, 32, 102, 105, 108, |
| 134 101, 110, 97, 109, 101, 61, 34, 86, 69, 82, 83, 73, 79, 78, 34, 13, 10, |
| 135 67, 111, 110, 116, 101, 110, 116, 45, 84, 121, 112, 101, 58, 32, 97, 112, |
| 136 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 111, 99, 116, 101, 116, 45, |
| 137 115, 116, 114, 101, 97, 109, 13, 10, 13, 10, 123, 32, 10, 32, 32, 34, 114, |
| 138 101, 118, 105, 115, 105, 111, 110, 34, 58, 32, 34, 50, 49, 56, 54, 48, 34, |
| 139 44, 10, 32, 32, 34, 118, 101, 114, 115, 105, 111, 110, 34, 32, 58, 32, 34, |
| 140 48, 46, 49, 46, 50, 46, 48, 95, 114, 50, 49, 56, 54, 48, 34, 44, 10, 32, |
| 141 32, 34, 100, 97, 116, 101, 34, 32, 32, 32, 32, 58, 32, 34, 50, 48, 49, 51, |
| 142 48, 52, 50, 51, 48, 48, 48, 52, 34, 10, 125, 13, 10, 45, 45, 45, 45, 45, |
| 143 45, 87, 101, 98, 75, 105, 116, 70, 111, 114, 109, 66, 111, 117, 110, 100, |
| 144 97, 114, 121, 81, 83, 113, 108, 56, 107, 68, 65, 76, 77, 55, 116, 65, 107, |
| 145 67, 49, 45, 45, 13, 10]; |
| 146 |
| 147 var data = [ |
| 148 123, 32, 10, 32, 32, 34, 114, 101, 118, 105, 115, 105, 111, 110, 34, 58, |
| 149 32, 34, 50, 49, 56, 54, 48, 34, 44, 10, 32, 32, 34, 118, 101, 114, 115, |
| 150 105, 111, 110, 34, 32, 58, 32, 34, 48, 46, 49, 46, 50, 46, 48, 95, 114, |
| 151 50, 49, 56, 54, 48, 34, 44, 10, 32, 32, 34, 100, 97, 116, 101, 34, 32, 32, |
| 152 32, 32, 58, 32, 34, 50, 48, 49, 51, 48, 52, 50, 51, 48, 48, 48, 52, 34, |
| 153 10, 125]; |
| 154 |
| 155 postDataTest(message, |
| 156 'multipart/form-data', |
| 157 '----WebKitFormBoundaryQSql8kDALM7tAkC1', |
| 158 [new FormField('submit-name', 'Test'), |
| 159 new FormField('files', |
| 160 data, |
| 161 contentType: 'application/octet-stream', |
| 162 filename: 'VERSION')]); |
| 163 |
| 164 message = [ |
| 165 45, 45, 45, 45, 45, 45, 87, 101, 98, 75, 105, 116, 70, 111, 114, 109, 66, |
| 166 111, 117, 110, 100, 97, 114, 121, 118, 65, 86, 122, 117, 103, 75, 77, 116, |
| 167 90, 98, 121, 87, 111, 66, 71, 13, 10, 67, 111, 110, 116, 101, 110, 116, |
| 168 45, 68, 105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 58, 32, 102, |
| 169 111, 114, 109, 45, 100, 97, 116, 97, 59, 32, 110, 97, 109, 101, 61, 34, |
| 170 110, 97, 109, 101, 34, 13, 10, 13, 10, 38, 35, 49, 50, 52, 48, 50, 59, 38, |
| 171 35, 49, 50, 52, 50, 53, 59, 38, 35, 49, 50, 51, 54, 52, 59, 38, 35, 49, |
| 172 50, 51, 57, 52, 59, 13, 10, 45, 45, 45, 45, 45, 45, 87, 101, 98, 75, 105, |
| 173 116, 70, 111, 114, 109, 66, 111, 117, 110, 100, 97, 114, 121, 118, 65, 86, |
| 174 122, 117, 103, 75, 77, 116, 90, 98, 121, 87, 111, 66, 71, 45, 45, 13, 10]; |
| 175 |
| 176 postDataTest(message, |
| 177 'multipart/form-data', |
| 178 '----WebKitFormBoundaryvAVzugKMtZbyWoBG', |
| 179 [new FormField('name', 'ひらがな')]); |
| 180 |
| 181 message = [ |
| 182 45, 45, 45, 45, 45, 45, 87, 101, 98, 75, 105, 116, 70, 111, 114, 109, 66, |
| 183 111, 117, 110, 100, 97, 114, 121, 102, 101, 48, 69, 122, 86, 49, 97, 78, |
| 184 121, 115, 68, 49, 98, 80, 104, 13, 10, 67, 111, 110, 116, 101, 110, 116, |
| 185 45, 68, 105, 115, 112, 111, 115, 105, 116, 105, 111, 110, 58, 32, 102, |
| 186 111, 114, 109, 45, 100, 97, 116, 97, 59, 32, 110, 97, 109, 101, 61, 34, |
| 187 110, 97, 109, 101, 34, 13, 10, 13, 10, 248, 118, 13, 10, 45, 45, 45, 45, |
| 188 45, 45, 87, 101, 98, 75, 105, 116, 70, 111, 114, 109, 66, 111, 117, 110, |
| 189 100, 97, 114, 121, 102, 101, 48, 69, 122, 86, 49, 97, 78, 121, 115, 68, |
| 190 49, 98, 80, 104, 45, 45, 13, 10]; |
| 191 |
| 192 postDataTest(message, |
| 193 'multipart/form-data', |
| 194 '----WebKitFormBoundaryfe0EzV1aNysD1bPh', |
| 195 [new FormField('name', 'øv')]); |
| 196 } |
| 197 |
| 198 |
| 199 void main() { |
| 200 testPostData(); |
| 201 } |
OLD | NEW |