/
trans-xhr.coffee
88 lines (73 loc) · 2.74 KB
/
trans-xhr.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# ***** BEGIN LICENSE BLOCK *****
# Copyright (c) 2011-2012 VMware, Inc.
#
# For the license see COPYING.
# ***** END LICENSE BLOCK *****
transport = require('./transport')
utils = require('./utils')
class XhrStreamingReceiver extends transport.ResponseReceiver
protocol: "xhr-streaming"
doSendFrame: (payload) ->
return super(payload + '\n')
class XhrPollingReceiver extends XhrStreamingReceiver
protocol: "xhr-polling"
max_response_size: 1
exports.app =
xhr_options: (req, res) ->
res.statusCode = 204 # No content
res.setHeader('Access-Control-Allow-Methods', 'OPTIONS, POST')
res.setHeader('Access-Control-Max-Age', res.cache_for)
return ''
xhr_send: (req, res, data) ->
if not data
throw {
status: 500
message: 'Payload expected.'
}
try
d = JSON.parse(data)
catch x
throw {
status: 500
message: 'Broken JSON encoding.'
}
if not d or d.__proto__.constructor isnt Array
throw {
status: 500
message: 'Payload expected.'
}
jsonp = transport.Session.bySessionId(req.session)
if not jsonp
throw {status: 404}
for message in d
jsonp.didMessage(message)
# FF assumes that the response is XML.
res.setHeader('Content-Type', 'text/plain; charset=UTF-8')
res.writeHead(204)
res.end()
return true
xhr_cors: (req, res, content) ->
if !req.headers['origin']
origin = '*'
else
origin = req.headers['origin']
res.setHeader('Access-Control-Allow-Credentials', 'true')
res.setHeader('Access-Control-Allow-Origin', origin)
res.setHeader('Vary', 'Origin')
headers = req.headers['access-control-request-headers']
if headers
res.setHeader('Access-Control-Allow-Headers', headers)
return content
xhr_poll: (req, res, _, next_filter) ->
res.setHeader('Content-Type', 'application/javascript; charset=UTF-8')
res.writeHead(200)
transport.register(req, @, new XhrPollingReceiver(req, res, @options))
return true
xhr_streaming: (req, res, _, next_filter) ->
res.setHeader('Content-Type', 'application/javascript; charset=UTF-8')
res.writeHead(200)
# IE requires 2KB prefix:
# http://blogs.msdn.com/b/ieinternals/archive/2010/04/06/comet-streaming-in-internet-explorer-with-xmlhttprequest-and-xdomainrequest.aspx
res.write(Array(2049).join('h') + '\n')
transport.register(req, @, new XhrStreamingReceiver(req, res, @options) )
return true