-
Hi. Setup:
Official server example: /* A quite detailed WebSockets example */
const uWS = require('uWebSockets.js')
const port = 9001;
const app = uWS./*SSL*/App({
key_file_name: 'misc/key.pem',
cert_file_name: 'misc/cert.pem',
passphrase: '1234'
}).ws('/*', {
/* Options */
compression: uWS.SHARED_COMPRESSOR,
maxPayloadLength: 16 * 1024 * 1024,
idleTimeout: 10,
/* Handlers */
upgrade: (res, req, context) => {
console.log('An Http connection wants to become WebSocket, URL: ' + req.getUrl() + '!');
// THIS DOESN'T WORK
res.writeHeader('test-header', 'header-value')
// THIS WORKS
// res.writeStatus("101 Switching Protocols\ntest-header: header-value")
/* This immediately calls open handler, you must not use res after this call */
res.upgrade({
url: req.getUrl()
},
/* Spell these correctly */
req.getHeader('sec-websocket-key'),
req.getHeader('sec-websocket-protocol'),
req.getHeader('sec-websocket-extensions'),
context);
},
open: (ws) => {
console.log('A WebSocket connected with URL: ' + ws.url);
},
message: (ws, message, isBinary) => {
/* Ok is false if backpressure was built up, wait for drain */
let ok = ws.send(message, isBinary);
},
drain: (ws) => {
console.log('WebSocket backpressure: ' + ws.getBufferedAmount());
},
close: (ws, code, message) => {
console.log('WebSocket closed');
}
}).any('/*', (res, req) => {
res.end('Nothing to see here!');
}).listen(port, (token) => {
if (token) {
console.log('Listening to port ' + port);
} else {
console.log('Failed to listen to port ' + port);
}
}); Client code: const WebSocket = require('ws')
const ws = new WebSocket('ws://127.0.0.1:9001/ws1')
ws.on('upgrade', (res) => {
console.log('upgrade event')
console.log(`test-header: ${res.headers['test-header']}`)
})
ws.on('open', () => {
console.log('upgrade event')
})
ws.on('error', (err) => {
console.log(err)
}) When I add in upgrade Error: Unexpected server response: 200
at ClientRequest.<anonymous> (/Users/user/Downloads/uws/node_modules/ws/lib/websocket.js:579:7)
at ClientRequest.emit (events.js:315:20)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:639:27)
at HTTPParser.parserOnHeadersComplete (_http_common.js:117:17)
at Socket.socketOnData (_http_client.js:507:22)
at Socket.emit (events.js:315:20)
at addChunk (_stream_readable.js:302:12)
at readableAddChunk (_stream_readable.js:278:9)
at Socket.Readable.push (_stream_readable.js:217:10)
at TCP.onStreamRead (internal/stream_base_commons.js:186:23) If I use ➜ node client.js
upgrade event
test-header: header-value
open event I know it's not correct way of using |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments
-
It should work if you do res.writeStatus("101 Switching Protocols").writeHeader("asdasd", "asdasda") before calling upgrade, right? |
Beta Was this translation helpful? Give feedback.
-
Yep, this |
Beta Was this translation helpful? Give feedback.
-
This could be documented better. What happens is, you have to call writeStatus before writeHeader but writeHeader will automatically call writeStatus(200 ok) otherwise. Headers are written in a linear buffer, not to a tree, so order matters |
Beta Was this translation helpful? Give feedback.
-
This is now covered in the docs |
Beta Was this translation helpful? Give feedback.
Yep, this
res.writeStatus("101 Switching Protocols").writeHeader("test-header", "header-value")
works fine.Anyway It's just not clear that
writeHeader
changes/resets status to200
.