Skip to content

Instantly share code, notes, and snippets.

@arantes555
Created March 11, 2021 15:33
Show Gist options
  • Save arantes555/99f8976266d340bad42b2894cb50d7d5 to your computer and use it in GitHub Desktop.
Save arantes555/99f8976266d340bad42b2894cb50d7d5 to your computer and use it in GitHub Desktop.
electron-bug-headers-on-304
<!-- Empty -->
// Modules to control application life and create native browser window
const {app, BrowserWindow, net, session} = require('electron')
const http = require('http')
const {parse} = require('url')
class TestServer {
constructor ({port = 30001} = {}) {
this.server = http.createServer(this.router)
this.port = port
this.hostname = 'localhost'
this.server.on('error', err => console.log(err.stack))
this.server.on('connection', socket => socket.setTimeout(1500))
}
start () {
return new Promise((resolve, reject) => this.server.listen(this.port, '127.0.0.1', this.hostname, err => err ? reject(err) : resolve()))
}
stop () {
return new Promise((resolve, reject) => this.server.close(err => err ? reject(err) : resolve()))
}
router (req, res) {
let p = parse(req.url).pathname
if (p === '/hello') {
// console.log('SERVER:', req.headers)
if (req.headers['if-none-match'] === 'my-etag') {
console.log('Server responding with 304')
res.statusCode = 304
res.end()
} else {
console.log('Server responding with 200')
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.setHeader('ETag', 'my-etag')
res.end('world')
}
}
}
}
const doRequest = (path) => new Promise((resolve) => {
let done = false
setTimeout(() => {
if (done) return
console.error(`/!\\ Request to ${path} TIMEOUT\n`)
resolve()
}, 2000)
console.log(`Starting request to ${path}`)
const options = { url: `http://localhost:30001${path}`}
const request = net.request(options)
request.on('error', (err) => {
console.log(`Request to ${path} got error `, err)
done = true
resolve()
})
request.on('response', (response) => {
console.log('Got Response:', {
status: response.statusCode,
ContentType: response.headers['content-type'],
ContentLength: response.headers['content-length']
})
response.on('data', (chunk) => {
// console.log(`BODY: ${chunk}`)
})
response.on('end', () => {
// console.log(`Finished request to ${path}\n`)
done = true
resolve()
})
response.on('error', (err) => {
console.log(`Response from ${path} got error `, err, '\n')
done = true
resolve()
})
})
request.end()
})
app.whenReady().then(async () => {
session.defaultSession.webRequest.onHeadersReceived((details, callback) => {
console.log('onHeadersReceived got', {
status: details.statusCode,
ContentType: details.responseHeaders['Content-Type'],
ContentLength: details.responseHeaders['Content-Length']
})
callback({})
})
const server = new TestServer()
await server.start()
await doRequest('/hello')
await doRequest('/hello')
})
.finally(() => process.exit(0))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment