227 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var assert = require('assert');
 | |
| var net = require('net');
 | |
| var http = require('http');
 | |
| var streamPair = require('stream-pair');
 | |
| var thing = require('handle-thing');
 | |
| 
 | |
| var httpDeceiver = require('../');
 | |
| 
 | |
| describe('HTTP Deceiver', function() {
 | |
|   var handle;
 | |
|   var pair;
 | |
|   var socket;
 | |
|   var deceiver;
 | |
| 
 | |
|   beforeEach(function() {
 | |
|     pair = streamPair.create();
 | |
|     handle = thing.create(pair.other);
 | |
|     socket = new net.Socket({ handle: handle });
 | |
| 
 | |
|     // For v0.8
 | |
|     socket.readable = true;
 | |
|     socket.writable = true;
 | |
| 
 | |
|     deceiver = httpDeceiver.create(socket);
 | |
|   });
 | |
| 
 | |
|   it('should emit request', function(done) {
 | |
|     var server = http.createServer();
 | |
|     server.emit('connection', socket);
 | |
| 
 | |
|     server.on('request', function(req, res) {
 | |
|       assert.equal(req.method, 'PUT');
 | |
|       assert.equal(req.url, '/hello');
 | |
|       assert.deepEqual(req.headers, { a: 'b' });
 | |
| 
 | |
|       done();
 | |
|     });
 | |
| 
 | |
|     deceiver.emitRequest({
 | |
|       method: 'PUT',
 | |
|       path: '/hello',
 | |
|       headers: {
 | |
|         a: 'b'
 | |
|       }
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should emit response', function(done) {
 | |
|     var agent = new http.Agent();
 | |
|     agent.createConnection = function createConnection() {
 | |
|       return socket;
 | |
|     };
 | |
|     var client = http.request({
 | |
|       method: 'POST',
 | |
|       path: '/ok',
 | |
|       agent: agent
 | |
|     }, function(res) {
 | |
|       assert.equal(res.statusCode, 421);
 | |
|       assert.deepEqual(res.headers, { a: 'b' });
 | |
| 
 | |
|       done();
 | |
|     });
 | |
| 
 | |
|     process.nextTick(function() {
 | |
|       deceiver.emitResponse({
 | |
|         status: 421,
 | |
|         reason: 'F',
 | |
|         headers: {
 | |
|           a: 'b'
 | |
|         }
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should override .execute and .finish', function(done) {
 | |
|     var server = http.createServer();
 | |
|     server.emit('connection', socket);
 | |
| 
 | |
|     server.on('request', function(req, res) {
 | |
|       assert.equal(req.method, 'PUT');
 | |
|       assert.equal(req.url, '/hello');
 | |
|       assert.deepEqual(req.headers, { a: 'b' });
 | |
| 
 | |
|       var actual = '';
 | |
|       req.on('data', function(chunk) {
 | |
|         actual += chunk;
 | |
|       });
 | |
|       req.once('end', function() {
 | |
|         assert.equal(actual, 'hello world');
 | |
|         done();
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     deceiver.emitRequest({
 | |
|       method: 'PUT',
 | |
|       path: '/hello',
 | |
|       headers: {
 | |
|         a: 'b'
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     pair.write('hello');
 | |
|     pair.end(' world');
 | |
|   });
 | |
| 
 | |
|   it('should work with reusing parser', function(done) {
 | |
|     var server = http.createServer();
 | |
|     server.emit('connection', socket);
 | |
| 
 | |
|     function secondRequest() {
 | |
|       pair = streamPair.create();
 | |
|       handle = thing.create(pair.other);
 | |
|       socket = new net.Socket({ handle: handle });
 | |
| 
 | |
|       // For v0.8
 | |
|       socket.readable = true;
 | |
|       socket.writable = true;
 | |
| 
 | |
|       server.emit('connection', socket);
 | |
| 
 | |
|       pair.end('PUT /second HTTP/1.1\r\nContent-Length:11\r\n\r\nhello world');
 | |
|     }
 | |
| 
 | |
|     server.on('request', function(req, res) {
 | |
|       var actual = '';
 | |
|       req.on('data', function(chunk) {
 | |
|         actual += chunk;
 | |
|       });
 | |
|       req.once('end', function() {
 | |
|         assert.equal(actual, 'hello world');
 | |
| 
 | |
|         if (req.url === '/first')
 | |
|           secondRequest();
 | |
|         else
 | |
|           done();
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     deceiver.emitRequest({
 | |
|       method: 'PUT',
 | |
|       path: '/first',
 | |
|       headers: {
 | |
|         a: 'b'
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     pair.write('hello');
 | |
|     pair.end(' world');
 | |
|   });
 | |
| 
 | |
|   it('should emit CONNECT request', function(done) {
 | |
|     var server = http.createServer();
 | |
|     server.emit('connection', socket);
 | |
| 
 | |
|     server.on('connect', function(req, socket, bodyHead) {
 | |
|       assert.equal(req.method, 'CONNECT');
 | |
|       assert.equal(req.url, '/hello');
 | |
| 
 | |
|       done();
 | |
|     });
 | |
| 
 | |
|     deceiver.emitRequest({
 | |
|       method: 'CONNECT',
 | |
|       path: '/hello',
 | |
|       headers: {
 | |
|       }
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should emit Upgrade request', function(done) {
 | |
|     var server = http.createServer();
 | |
|     server.emit('connection', socket);
 | |
| 
 | |
|     server.on('upgrade', function(req, socket, bodyHead) {
 | |
|       assert.equal(req.method, 'POST');
 | |
|       assert.equal(req.url, '/hello');
 | |
| 
 | |
|       socket.on('data', function(chunk) {
 | |
|         assert.equal(chunk + '', 'hm');
 | |
|         done();
 | |
|       });
 | |
|     });
 | |
| 
 | |
|     deceiver.emitRequest({
 | |
|       method: 'POST',
 | |
|       path: '/hello',
 | |
|       headers: {
 | |
|         'upgrade': 'websocket'
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     pair.write('hm');
 | |
|   });
 | |
| 
 | |
|   it('should emit Upgrade response', function(done) {
 | |
|     var agent = new http.Agent();
 | |
|     agent.createConnection = function createConnection() {
 | |
|       return socket;
 | |
|     };
 | |
|     var client = http.request({
 | |
|       method: 'POST',
 | |
|       path: '/ok',
 | |
|       headers: {
 | |
|         connection: 'upgrade',
 | |
|         upgrade: 'websocket'
 | |
|       },
 | |
|       agent: agent
 | |
|     }, function(res) {
 | |
|       assert(false);
 | |
|     });
 | |
|     client.on('upgrade', function(res, socket) {
 | |
|       assert.equal(res.statusCode, 421);
 | |
|       done();
 | |
|     });
 | |
| 
 | |
|     process.nextTick(function() {
 | |
|       deceiver.emitResponse({
 | |
|         status: 421,
 | |
|         reason: 'F',
 | |
|         headers: {
 | |
|           upgrade: 'websocket'
 | |
|         }
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| });
 |