Skip to content

Commit 41dae76

Browse files
committed
Fix property read in initServer hook.
Add a _testInitServer hook so we can verify that this works in the http.js tests.
1 parent f7c7a62 commit 41dae76

File tree

3 files changed

+36
-8
lines changed

3 files changed

+36
-8
lines changed

lib/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,10 @@ exports.request = function(options, cb) {
287287
for (var f in serverVars) {
288288
server[f] = serverVars[f];
289289
}
290+
// This hook is for test purposes only.
291+
if (options._testInitServer) {
292+
options._testInitServer(server);
293+
}
290294
cb();
291295
};
292296
return request(source, stream, args, serverVars, initServer).tap(function() {

src/node_php_jsserver_class.cc

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@ ZEND_END_ARG_INFO()
9090

9191
PHP_METHOD(JsServer, __get) {
9292
TRACE(">");
93-
#if 0 // XXX disabled, since it seems to be corrupting memory.
9493
zval *member;
9594
PARSE_PARAMS(__get, "z/", &member);
9695
convert_to_string(member);
@@ -101,13 +100,11 @@ PHP_METHOD(JsServer, __get) {
101100
zend_symtable_find(Z_ARRVAL_P(obj->track_vars_array),
102101
Z_STRVAL_P(member), Z_STRLEN_P(member) + 1,
103102
reinterpret_cast<void**>(&retval))) {
104-
*return_value_ptr = EG(uninitialized_zval_ptr);
103+
*return_value_ptr = return_value = EG(uninitialized_zval_ptr);
105104
} else {
106-
*return_value_ptr = *retval;
105+
*return_value_ptr = return_value = *retval;
107106
}
108-
#else
109-
RETVAL_BOOL(true);
110-
#endif
107+
Z_ADDREF_P(return_value);
111108
TRACE("<");
112109
}
113110

test/http.js

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,18 @@ describe('Feeding POST data from JS to PHP', function() {
5050
]);
5151
};
5252
it('should handle a basic GET request', function() {
53+
var serverOk = false;
5354
return makeServer({
5455
path: '/index.html?abc=def&foo=bar+bat',
5556
}, {
56-
source: 'var_dump($_GET)',
57+
// We have to dereference $_SERVER in order to trigger the
58+
// _testInitServer method.
59+
source: 'var_dump($_SERVER["CONTEXT"] ? $_GET : $_GET)',
60+
_testInitServer: function(server) {
61+
serverOk = (server.REQUEST_METHOD === 'GET' &&
62+
server.REQUEST_URI === '/index.html?abc=def&foo=bar+bat' &&
63+
server.QUERY_STRING === 'abc=def&foo=bar+bat');
64+
},
5765
}).spread(function(phpvalue, output, response) {
5866
should(phpvalue).be.null();
5967
output.should.be.equal([
@@ -68,9 +76,11 @@ describe('Feeding POST data from JS to PHP', function() {
6876
response.should.be.html();
6977
response.should.have.status(200);
7078
response.should.have.header('x-powered-by');
79+
serverOk.should.be.true();
7180
});
7281
});
7382
it('should handle a basic POST request', function() {
83+
var serverOk = false;
7484
var postData = querystring.stringify({
7585
msg: 'Hello World!',
7686
foo: 'bar bat',
@@ -83,7 +93,14 @@ describe('Feeding POST data from JS to PHP', function() {
8393
'Content-Length': postData.length,
8494
},
8595
}, {
86-
source: 'var_dump($_POST)',
96+
// We have to dereference $_SERVER in order to trigger the
97+
// _testInitServer method.
98+
source: 'var_dump($_SERVER["CONTEXT"] ? $_POST : $_POST)',
99+
_testInitServer: function(server) {
100+
serverOk = (server.REQUEST_METHOD === 'POST' &&
101+
server.REQUEST_URI === '/post' &&
102+
server.QUERY_STRING === '');
103+
},
87104
}, function(request) {
88105
request.write(postData);
89106
}).spread(function(phpvalue, output, response) {
@@ -100,9 +117,11 @@ describe('Feeding POST data from JS to PHP', function() {
100117
response.should.be.html();
101118
response.should.have.status(200);
102119
response.should.have.header('x-powered-by');
120+
serverOk.should.be.true();
103121
});
104122
});
105123
it('should handle cookies', function() {
124+
var serverOk = false;
106125
return makeServer({
107126
path: '/cookie/test',
108127
headers: {
@@ -116,13 +135,20 @@ describe('Feeding POST data from JS to PHP', function() {
116135
}, {
117136
source: [
118137
'call_user_func(function() {',
138+
' # ensure that _testInitServer is triggered',
139+
' $_SERVER["CONTEXT"];',
119140
' # ensure we handle duplicate headers sent from PHP',
120141
' setcookie("a", "b");',
121142
' setcookie("c", "d", 0, "/");',
122143
' var_dump($_COOKIE);',
123144
' return 1;',
124145
'})',
125146
].join('\n'),
147+
_testInitServer: function(server) {
148+
serverOk = (server.REQUEST_METHOD === 'GET' &&
149+
server.REQUEST_URI === '/cookie/test' &&
150+
server.QUERY_STRING === '');
151+
},
126152
}).spread(function(phpvalue, output, response) {
127153
should(phpvalue).be.equal(1);
128154
output.should.be.equal([
@@ -142,6 +168,7 @@ describe('Feeding POST data from JS to PHP', function() {
142168
'a=b',
143169
'c=d; path=/',
144170
]);
171+
serverOk.should.be.true();
145172
});
146173
});
147174
});

0 commit comments

Comments
 (0)