this.writable to check if the socket is writable

because node sucks haha
This commit is contained in:
Jonathan Ong 2014-02-15 02:06:08 -08:00
parent e56f442222
commit cb532b7bef
4 changed files with 28 additions and 2 deletions

View file

@ -152,7 +152,7 @@ function *respond(next){
if (false === this.respond) return; if (false === this.respond) return;
var res = this.res; var res = this.res;
if (res.headersSent || !res.socket.writable) return; if (res.headersSent || !this.writable) return;
var body = this.body; var body = this.body;
var status = this.status = this.status || 404; var status = this.status = this.status || 404;

View file

@ -106,7 +106,7 @@ var proto = module.exports = {
// nothing we can do here other // nothing we can do here other
// than delegate to the app-level // than delegate to the app-level
// handler and log. // handler and log.
if (this.headerSent || !this.socket.writable) { if (this.headerSent || !this.writable) {
err.headerSent = true; err.headerSent = true;
this.app.emit('error', err, this); this.app.emit('error', err, this);
return; return;
@ -153,6 +153,7 @@ delegate(proto, 'response')
.access('type') .access('type')
.access('charset') .access('charset')
.getter('headerSent') .getter('headerSent')
.getter('writable')
.setter('lastModified') .setter('lastModified')
.setter('etag'); .setter('etag');

View file

@ -434,6 +434,21 @@ module.exports = {
this.set(field, list.join(', ')); this.set(field, list.join(', '));
}, },
/**
* Checks if the request is writable.
* Tests for the existence of the socket
* as node sometimes does not set it.
*
* @return {Boolean}
* @api private
*/
get writable() {
var socket = this.res.socket;
if (!socket) return false;
return socket.writable;
},
/** /**
* Inspect implementation. * Inspect implementation.
* *

10
test/context/writable.js Normal file
View file

@ -0,0 +1,10 @@
var context = require('../context');
describe('ctx.writable', function(){
it('should not crash when the socket does not exist', function(){
var ctx = context();
ctx.socket = null;
ctx.writable.should.equal(false);
})
})