@@ -26,6 +26,8 @@ var resolve = require('path').resolve;
26
26
var once = require ( 'once' )
27
27
var Router = require ( 'router' ) ;
28
28
var setPrototypeOf = require ( 'setprototypeof' )
29
+ var resProto = require ( './response' )
30
+ var reqProto = require ( './request' )
29
31
30
32
/**
31
33
* Module variables.
@@ -48,6 +50,35 @@ var app = exports = module.exports = {};
48
50
49
51
var trustProxyDefaultSymbol = '@@symbol:trust_proxy_default' ;
50
52
53
+ function setPrototypeUntil ( obj , proto , until ) {
54
+ var currentProto = proto ;
55
+ until = until || proto ;
56
+ var last = Object . getPrototypeOf ( until ) ;
57
+ while ( currentProto && currentProto !== last ) {
58
+ Object . keys ( currentProto ) . forEach ( ( key ) => {
59
+ setPrototypeKey ( obj , proto , key , until )
60
+ } ) ;
61
+ currentProto = Object . getPrototypeOf ( currentProto )
62
+ }
63
+ }
64
+
65
+ function setPrototypeKey ( obj , proto , key , until ) {
66
+ Object . defineProperty ( obj , key , {
67
+ configurable : true ,
68
+ enumerable : proto . propertyIsEnumerable ( key ) ,
69
+ get : ( ) => {
70
+ var desc = Object . getOwnPropertyDescriptor ( until , key )
71
+ if ( desc && typeof desc . get === 'function' ) {
72
+ // property defined with defineGetter, we need to change the `this` of the getter accordingly
73
+ return desc . get . call ( obj )
74
+ }
75
+ return proto [ key ]
76
+ } ,
77
+ set : ( v ) => {
78
+ proto [ key ] = v
79
+ }
80
+ } )
81
+ }
51
82
/**
52
83
* Initialize the server.
53
84
*
@@ -168,8 +199,8 @@ app.handle = function handle(req, res, callback) {
168
199
res . req = req ;
169
200
170
201
// alter the prototypes
171
- setPrototypeOf ( req , this . request )
172
- setPrototypeOf ( res , this . response )
202
+ setPrototypeUntil ( req , this . request , reqProto )
203
+ setPrototypeUntil ( res , this . response , resProto )
173
204
174
205
// setup locals
175
206
if ( ! res . locals ) {
@@ -232,8 +263,8 @@ app.use = function use(fn) {
232
263
router . use ( path , function mounted_app ( req , res , next ) {
233
264
var orig = req . app ;
234
265
fn . handle ( req , res , function ( err ) {
235
- setPrototypeOf ( req , orig . request )
236
- setPrototypeOf ( res , orig . response )
266
+ setPrototypeUntil ( req , orig . request )
267
+ setPrototypeUntil ( res , orig . response )
237
268
next ( err ) ;
238
269
} ) ;
239
270
} ) ;
0 commit comments