Projekt

Obecné

Profil

Stáhnout (4.86 KB) Statistiky
| Větev: | Revize:
1 3a515b92 cagy
var assert = require('assert');
2
var net = require('net');
3
var http = require('http');
4
var streamPair = require('stream-pair');
5
var thing = require('handle-thing');
6
7
var httpDeceiver = require('../');
8
9
describe('HTTP Deceiver', function() {
10
  var handle;
11
  var pair;
12
  var socket;
13
  var deceiver;
14
15
  beforeEach(function() {
16
    pair = streamPair.create();
17
    handle = thing.create(pair.other);
18
    socket = new net.Socket({ handle: handle });
19
20
    // For v0.8
21
    socket.readable = true;
22
    socket.writable = true;
23
24
    deceiver = httpDeceiver.create(socket);
25
  });
26
27
  it('should emit request', function(done) {
28
    var server = http.createServer();
29
    server.emit('connection', socket);
30
31
    server.on('request', function(req, res) {
32
      assert.equal(req.method, 'PUT');
33
      assert.equal(req.url, '/hello');
34
      assert.deepEqual(req.headers, { a: 'b' });
35
36
      done();
37
    });
38
39
    deceiver.emitRequest({
40
      method: 'PUT',
41
      path: '/hello',
42
      headers: {
43
        a: 'b'
44
      }
45
    });
46
  });
47
48
  it('should emit response', function(done) {
49
    var agent = new http.Agent();
50
    agent.createConnection = function createConnection() {
51
      return socket;
52
    };
53
    var client = http.request({
54
      method: 'POST',
55
      path: '/ok',
56
      agent: agent
57
    }, function(res) {
58
      assert.equal(res.statusCode, 421);
59
      assert.deepEqual(res.headers, { a: 'b' });
60
61
      done();
62
    });
63
64
    process.nextTick(function() {
65
      deceiver.emitResponse({
66
        status: 421,
67
        reason: 'F',
68
        headers: {
69
          a: 'b'
70
        }
71
      });
72
    });
73
  });
74
75
  it('should override .execute and .finish', function(done) {
76
    var server = http.createServer();
77
    server.emit('connection', socket);
78
79
    server.on('request', function(req, res) {
80
      assert.equal(req.method, 'PUT');
81
      assert.equal(req.url, '/hello');
82
      assert.deepEqual(req.headers, { a: 'b' });
83
84
      var actual = '';
85
      req.on('data', function(chunk) {
86
        actual += chunk;
87
      });
88
      req.once('end', function() {
89
        assert.equal(actual, 'hello world');
90
        done();
91
      });
92
    });
93
94
    deceiver.emitRequest({
95
      method: 'PUT',
96
      path: '/hello',
97
      headers: {
98
        a: 'b'
99
      }
100
    });
101
102
    pair.write('hello');
103
    pair.end(' world');
104
  });
105
106
  it('should work with reusing parser', function(done) {
107
    var server = http.createServer();
108
    server.emit('connection', socket);
109
110
    function secondRequest() {
111
      pair = streamPair.create();
112
      handle = thing.create(pair.other);
113
      socket = new net.Socket({ handle: handle });
114
115
      // For v0.8
116
      socket.readable = true;
117
      socket.writable = true;
118
119
      server.emit('connection', socket);
120
121
      pair.end('PUT /second HTTP/1.1\r\nContent-Length:11\r\n\r\nhello world');
122
    }
123
124
    server.on('request', function(req, res) {
125
      var actual = '';
126
      req.on('data', function(chunk) {
127
        actual += chunk;
128
      });
129
      req.once('end', function() {
130
        assert.equal(actual, 'hello world');
131
132
        if (req.url === '/first')
133
          secondRequest();
134
        else
135
          done();
136
      });
137
    });
138
139
    deceiver.emitRequest({
140
      method: 'PUT',
141
      path: '/first',
142
      headers: {
143
        a: 'b'
144
      }
145
    });
146
147
    pair.write('hello');
148
    pair.end(' world');
149
  });
150
151
  it('should emit CONNECT request', function(done) {
152
    var server = http.createServer();
153
    server.emit('connection', socket);
154
155
    server.on('connect', function(req, socket, bodyHead) {
156
      assert.equal(req.method, 'CONNECT');
157
      assert.equal(req.url, '/hello');
158
159
      done();
160
    });
161
162
    deceiver.emitRequest({
163
      method: 'CONNECT',
164
      path: '/hello',
165
      headers: {
166
      }
167
    });
168
  });
169
170
  it('should emit Upgrade request', function(done) {
171
    var server = http.createServer();
172
    server.emit('connection', socket);
173
174
    server.on('upgrade', function(req, socket, bodyHead) {
175
      assert.equal(req.method, 'POST');
176
      assert.equal(req.url, '/hello');
177
178
      socket.on('data', function(chunk) {
179
        assert.equal(chunk + '', 'hm');
180
        done();
181
      });
182
    });
183
184
    deceiver.emitRequest({
185
      method: 'POST',
186
      path: '/hello',
187
      headers: {
188
        'upgrade': 'websocket'
189
      }
190
    });
191
192
    pair.write('hm');
193
  });
194
195
  it('should emit Upgrade response', function(done) {
196
    var agent = new http.Agent();
197
    agent.createConnection = function createConnection() {
198
      return socket;
199
    };
200
    var client = http.request({
201
      method: 'POST',
202
      path: '/ok',
203
      headers: {
204
        connection: 'upgrade',
205
        upgrade: 'websocket'
206
      },
207
      agent: agent
208
    }, function(res) {
209
      assert(false);
210
    });
211
    client.on('upgrade', function(res, socket) {
212
      assert.equal(res.statusCode, 421);
213
      done();
214
    });
215
216
    process.nextTick(function() {
217
      deceiver.emitResponse({
218
        status: 421,
219
        reason: 'F',
220
        headers: {
221
          upgrade: 'websocket'
222
        }
223
      });
224
    });
225
  });
226
});