Roman Reiss | f29762f | 2015-05-19 11:00:06 | [diff] [blame] | 1 | 'use strict'; |
Ryan Dahl | a0159b4 | 2010-12-04 23:20:34 | [diff] [blame] | 2 | var common = require('../common'); |
| 3 | var assert = require('assert'); |
| 4 | var net = require('net'); |
| 5 | var http = require('http'); |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 6 | var url = require('url'); |
| 7 | var qs = require('querystring'); |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 8 | |
Ryan | 8b49cef | 2009-06-08 17:10:23 | [diff] [blame] | 9 | var request_number = 0; |
| 10 | var requests_sent = 0; |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 11 | var server_response = ''; |
Ryan | 8b49cef | 2009-06-08 17:10:23 | [diff] [blame] | 12 | var client_got_eof = false; |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 13 | |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 14 | var server = http.createServer(function(req, res) { |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 15 | res.id = request_number; |
| 16 | req.id = request_number++; |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 17 | |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 18 | if (req.id == 0) { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 19 | assert.equal('GET', req.method); |
| 20 | assert.equal('/hello', url.parse(req.url).pathname); |
| 21 | assert.equal('world', qs.parse(url.parse(req.url).query).hello); |
| 22 | assert.equal('b==ar', qs.parse(url.parse(req.url).query).foo); |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 23 | } |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 24 | |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 25 | if (req.id == 1) { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 26 | common.error('req 1'); |
| 27 | assert.equal('POST', req.method); |
| 28 | assert.equal('/quit', url.parse(req.url).pathname); |
Michaeljohn Clement | 485823f | 2009-12-02 05:38:42 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | if (req.id == 2) { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 32 | common.error('req 2'); |
| 33 | assert.equal('foo', req.headers['x-x']); |
Michaeljohn Clement | 485823f | 2009-12-02 05:38:42 | [diff] [blame] | 34 | } |
| 35 | |
| 36 | if (req.id == 3) { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 37 | common.error('req 3'); |
| 38 | assert.equal('bar', req.headers['x-x']); |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 39 | this.close(); |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 40 | common.error('server closed'); |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 41 | } |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 42 | |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 43 | setTimeout(function() { |
| 44 | res.writeHead(200, {'Content-Type': 'text/plain'}); |
Ryan Dahl | ae85d9a | 2010-02-17 06:16:29 | [diff] [blame] | 45 | res.write(url.parse(req.url).pathname); |
Ryan Dahl | 50c70ac | 2010-04-08 17:44:22 | [diff] [blame] | 46 | res.end(); |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 47 | }, 1); |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 48 | |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 49 | }); |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 50 | server.listen(common.PORT); |
Ryan | 8047b91 | 2009-06-30 11:56:52 | [diff] [blame] | 51 | |
Ryan Dahl | 4733d0b | 2011-02-04 23:14:58 | [diff] [blame] | 52 | server.httpAllowHalfOpen = true; |
| 53 | |
Ben Noordhuis | 018e110 | 2011-10-14 23:08:36 | [diff] [blame] | 54 | server.on('listening', function() { |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 55 | var c = net.createConnection(common.PORT); |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 56 | |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 57 | c.setEncoding('utf8'); |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 58 | |
Ben Noordhuis | 018e110 | 2011-10-14 23:08:36 | [diff] [blame] | 59 | c.on('connect', function() { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 60 | c.write('GET /hello?hello=world&foo=b==ar HTTP/1.1\r\n\r\n'); |
Ryan | 8b49cef | 2009-06-08 17:10:23 | [diff] [blame] | 61 | requests_sent += 1; |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 62 | }); |
Michaeljohn Clement | 485823f | 2009-12-02 05:38:42 | [diff] [blame] | 63 | |
Ben Noordhuis | 018e110 | 2011-10-14 23:08:36 | [diff] [blame] | 64 | c.on('data', function(chunk) { |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 65 | server_response += chunk; |
Michaeljohn Clement | 485823f | 2009-12-02 05:38:42 | [diff] [blame] | 66 | |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 67 | if (requests_sent == 1) { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 68 | c.write('POST /quit HTTP/1.1\r\n\r\n'); |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 69 | requests_sent += 1; |
| 70 | } |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 71 | |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 72 | if (requests_sent == 2) { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 73 | c.write('GET / HTTP/1.1\r\nX-X: foo\r\n\r\n' + |
| 74 | 'GET / HTTP/1.1\r\nX-X: bar\r\n\r\n'); |
Ryan Dahl | 4733d0b | 2011-02-04 23:14:58 | [diff] [blame] | 75 | // Note: we are making the connection half-closed here |
| 76 | // before we've gotten the response from the server. This |
| 77 | // is a pretty bad thing to do and not really supported |
| 78 | // by many http servers. Node supports it optionally if |
| 79 | // you set server.httpAllowHalfOpen=true, which we've done |
| 80 | // above. |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 81 | c.end(); |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 82 | assert.equal(c.readyState, 'readOnly'); |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 83 | requests_sent += 2; |
| 84 | } |
Ryan | 536ecea | 2009-05-19 12:49:28 | [diff] [blame] | 85 | |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 86 | }); |
| 87 | |
Ben Noordhuis | 018e110 | 2011-10-14 23:08:36 | [diff] [blame] | 88 | c.on('end', function() { |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 89 | client_got_eof = true; |
| 90 | }); |
| 91 | |
Ben Noordhuis | 018e110 | 2011-10-14 23:08:36 | [diff] [blame] | 92 | c.on('close', function() { |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 93 | assert.equal(c.readyState, 'closed'); |
Bert Belder | 7059be1 | 2010-08-11 23:38:42 | [diff] [blame] | 94 | }); |
Ryan | 31265be | 2009-08-26 16:22:00 | [diff] [blame] | 95 | }); |
Ryan | 8b49cef | 2009-06-08 17:10:23 | [diff] [blame] | 96 | |
Ben Noordhuis | 018e110 | 2011-10-14 23:08:36 | [diff] [blame] | 97 | process.on('exit', function() { |
Felix Geisendörfer | 530328f | 2009-11-28 17:26:59 | [diff] [blame] | 98 | assert.equal(4, request_number); |
| 99 | assert.equal(4, requests_sent); |
Ryan | 8b49cef | 2009-06-08 17:10:23 | [diff] [blame] | 100 | |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 101 | var hello = new RegExp('/hello'); |
Felix Geisendörfer | 530328f | 2009-11-28 17:26:59 | [diff] [blame] | 102 | assert.equal(true, hello.exec(server_response) != null); |
Ryan | 8b49cef | 2009-06-08 17:10:23 | [diff] [blame] | 103 | |
Oleg Efimov | 093dfaf | 2010-12-05 22:33:52 | [diff] [blame] | 104 | var quit = new RegExp('/quit'); |
Felix Geisendörfer | 530328f | 2009-11-28 17:26:59 | [diff] [blame] | 105 | assert.equal(true, quit.exec(server_response) != null); |
Ryan | 8b49cef | 2009-06-08 17:10:23 | [diff] [blame] | 106 | |
Felix Geisendörfer | 530328f | 2009-11-28 17:26:59 | [diff] [blame] | 107 | assert.equal(true, client_got_eof); |
Ryan | 723c7d9 | 2009-08-26 16:51:04 | [diff] [blame] | 108 | }); |