| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 import "dart:async"; | 5 import "dart:async"; |
| 6 import "dart:io"; | 6 import "dart:io"; |
| 7 import "dart:isolate"; | 7 import "dart:isolate"; |
| 8 | 8 |
| 9 void sendData(List<int> data, int port) { | 9 void sendData(List<int> data, int port) { |
| 10 Socket socket = new Socket("127.0.0.1", port); | 10 Socket.connect("127.0.0.1", port).then((socket) { |
| 11 socket.onConnect = () { | 11 socket.listen((data) { |
| 12 socket.onData = () { | 12 Expect.fail("No data response was expected"); |
| 13 Expect.fail("No data response was expected"); | 13 }); |
| 14 }; | 14 socket.add(data); |
| 15 socket.outputStream.onNoPendingWrites = () { | 15 socket.close(); |
| 16 socket.close(true); | 16 socket.done.then((_) { |
| 17 }; | 17 socket.destroy(); |
| 18 socket.outputStream.write(data); | 18 }); |
| 19 }; | 19 }); |
| 20 } | 20 } |
| 21 | 21 |
| 22 class EarlyCloseTest { | 22 class EarlyCloseTest { |
| 23 EarlyCloseTest(this.data, | 23 EarlyCloseTest(this.data, |
| 24 String this.exception, | 24 String this.exception, |
| 25 [bool this.expectRequest = false]); | 25 [bool this.expectRequest = false]); |
| 26 | 26 |
| 27 Future execute(HttpServer server) { | 27 Future execute(HttpServer server) { |
| 28 Completer c = new Completer(); | 28 Completer c = new Completer(); |
| 29 | 29 |
| 30 bool calledOnRequest = false; | 30 bool calledOnRequest = false; |
| 31 bool calledOnError = false; | 31 bool calledOnError = false; |
| 32 server.defaultRequestHandler = | 32 ReceivePort port = new ReceivePort(); |
| 33 (HttpRequest request, HttpResponse response) { | 33 server.listen( |
| 34 (request) { |
| 34 Expect.isTrue(expectRequest); | 35 Expect.isTrue(expectRequest); |
| 35 Expect.isFalse(calledOnError); | 36 Expect.isFalse(calledOnError); |
| 36 Expect.isFalse(calledOnRequest, "onRequest called multiple times"); | 37 Expect.isFalse(calledOnRequest, "onRequest called multiple times"); |
| 37 calledOnRequest = true; | 38 calledOnRequest = true; |
| 38 }; | 39 request.listen( |
| 39 ReceivePort port = new ReceivePort(); | 40 (_) {}, |
| 40 server.onError = (error) { | 41 onError: (e) { |
| 41 Expect.isFalse(calledOnError); | 42 Expect.isFalse(calledOnError); |
| 42 Expect.equals(exception, error.message); | 43 Expect.equals(exception, e.error.message); |
| 43 Expect.equals(expectRequest, calledOnRequest); | 44 calledOnError = true; |
| 44 calledOnError = true; | 45 port.close(); |
| 45 port.close(); | 46 c.complete(null); |
| 46 c.complete(null); | 47 }); |
| 47 }; | 48 }, |
| 49 onError: (e) { |
| 50 Expect.isFalse(calledOnError); |
| 51 Expect.equals(exception, e.error.message); |
| 52 Expect.equals(expectRequest, calledOnRequest); |
| 53 calledOnError = true; |
| 54 port.close(); |
| 55 c.complete(null); |
| 56 }); |
| 48 | 57 |
| 49 List<int> d; | 58 List<int> d; |
| 50 if (data is List<int>) d = data; | 59 if (data is List<int>) d = data; |
| 51 if (data is String) d = data.charCodes; | 60 if (data is String) d = data.charCodes; |
| 52 if (d == null) Expect.fail("Invalid data"); | 61 if (d == null) Expect.fail("Invalid data"); |
| 53 sendData(d, server.port); | 62 sendData(d, server.port); |
| 54 | 63 |
| 55 return c.future; | 64 return c.future; |
| 56 } | 65 } |
| 57 | 66 |
| 58 final data; | 67 final data; |
| 59 final String exception; | 68 final String exception; |
| 60 final bool expectRequest; | 69 final bool expectRequest; |
| 61 } | 70 } |
| 62 | 71 |
| 63 void testEarlyClose1() { | 72 void testEarlyClose1() { |
| 64 List<EarlyCloseTest> tests = new List<EarlyCloseTest>(); | 73 List<EarlyCloseTest> tests = new List<EarlyCloseTest>(); |
| 65 void add(Object data, String exception, {bool expectRequest: false}) { | 74 void add(Object data, String exception, {bool expectRequest: false}) { |
| 66 tests.add(new EarlyCloseTest(data, exception, expectRequest)); | 75 tests.add(new EarlyCloseTest(data, exception, expectRequest)); |
| 67 } | 76 } |
| 68 // The empty packet is valid. | 77 // The empty packet is valid. |
| 69 | 78 |
| 70 // Close while sending header | 79 // Close while sending header |
| 71 String message = "Connection closed before full request header was received"; | 80 String message = "Connection closed before full header was received"; |
| 72 add("G", message); | 81 add("G", message); |
| 73 add("GET /", message); | 82 add("GET /", message); |
| 74 add("GET / HTTP/1.1", message); | 83 add("GET / HTTP/1.1", message); |
| 75 add("GET / HTTP/1.1\r\n", message); | 84 add("GET / HTTP/1.1\r\n", message); |
| 76 | 85 |
| 77 // Close while sending content | 86 // Close while sending content |
| 78 add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n", | 87 add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n", |
| 79 "Connection closed before full request body was received", | 88 "Connection closed while receiving data", |
| 80 expectRequest: true); | 89 expectRequest: true); |
| 81 add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n1", | 90 add("GET / HTTP/1.1\r\nContent-Length: 100\r\n\r\n1", |
| 82 "Connection closed before full request body was received", | 91 "Connection closed while receiving data", |
| 83 expectRequest: true); | 92 expectRequest: true); |
| 84 | 93 |
| 85 | |
| 86 HttpServer server = new HttpServer(); | |
| 87 server.listen("127.0.0.1", 0); | |
| 88 void runTest(Iterator it) { | 94 void runTest(Iterator it) { |
| 89 if (it.moveNext()) { | 95 if (it.moveNext()) { |
| 90 it.current.execute(server).then((_) => runTest(it)); | 96 HttpServer.bind("127.0.0.1", 0).then((server) { |
| 91 } else { | 97 it.current.execute(server).then((_) { |
| 92 server.close(); | 98 runTest(it); |
| 99 server.close(); |
| 100 }); |
| 101 }); |
| 93 } | 102 } |
| 94 } | 103 } |
| 95 runTest(tests.iterator); | 104 runTest(tests.iterator); |
| 96 } | 105 } |
| 97 | 106 |
| 98 testEarlyClose2() { | 107 testEarlyClose2() { |
| 99 var server = new HttpServer(); | 108 HttpServer.bind("127.0.0.1", 0).then((server) { |
| 100 server.listen("127.0.0.1", 0); | 109 server.listen( |
| 101 server.onError = (e) { /* ignore */ }; | 110 (request) { |
| 102 server.defaultRequestHandler = (request, response) { | 111 String name = new Options().script; |
| 103 String name = new Options().script; | 112 new File(name).openRead().pipe(request.response); |
| 104 new File(name).openInputStream().pipe(response.outputStream); | 113 }, |
| 105 }; | 114 onError: (e) { /* ignore */ }); |
| 106 | 115 |
| 107 var count = 0; | 116 var count = 0; |
| 108 var makeRequest; | 117 makeRequest() { |
| 109 makeRequest = () { | 118 Socket.connect("127.0.0.1", server.port).then((socket) { |
| 110 Socket socket = new Socket("127.0.0.1", server.port); | 119 var data = "GET / HTTP/1.1\r\nContent-Length: 0\r\n\r\n".charCodes; |
| 111 socket.onConnect = () { | 120 socket.add(data); |
| 112 var data = "GET / HTTP/1.1\r\nContent-Length: 0\r\n\r\n".charCodes; | 121 socket.close(); |
| 113 socket.writeList(data, 0, data.length); | 122 socket.done.then((_) { |
| 114 socket.close(); | 123 socket.destroy(); |
| 115 if (++count < 10) { | 124 if (++count < 10) { |
| 116 makeRequest(); | 125 makeRequest(); |
| 117 } else { | 126 } else { |
| 118 server.close(); | 127 server.close(); |
| 119 } | 128 } |
| 120 }; | 129 }); |
| 121 }; | 130 }); |
| 122 | 131 } |
| 123 makeRequest(); | 132 makeRequest(); |
| 133 }); |
| 124 } | 134 } |
| 125 | 135 |
| 126 void main() { | 136 void main() { |
| 127 testEarlyClose1(); | 137 testEarlyClose1(); |
| 128 testEarlyClose2(); | 138 // testEarlyClose2(); |
| 129 } | 139 } |
| OLD | NEW |