fix parse query error when pathname has encode chars

This commit is contained in:
lichengyin 2015-12-17 10:13:32 +08:00
parent 521c979eb2
commit 24c8db4b1c
5 changed files with 70 additions and 4 deletions

View File

@ -138,7 +138,9 @@ export default class extends EventEmitter {
this.hostname = pos === -1 ? this.host : this.host.slice(0, pos);
}else{
let urlInfo = url.parse('//' + this.headers.host + this.req.url, true, true);
let pathname = decodeURIComponent(urlInfo.pathname);
//can not use decodeURIComponent, pathname may be has encode / chars
//decodeURIComponent value after parse route
let pathname = urlInfo.pathname;
this.pathname = this.normalizePathname(pathname);
this.query = urlInfo.query;
this.hostname = urlInfo.hostname;

View File

@ -13,7 +13,7 @@ export default class extends think.middleware.base {
if (!think.RESOURCE_PATH || !this.config('resource_on') || !this.http.pathname) {
return false;
}
let pathname = this.http.pathname;
let pathname = decodeURIComponent(this.http.pathname);
let reg = this.config('resource_reg');
if (!reg.test(pathname)) {
return false;

View File

@ -167,7 +167,7 @@ export default class extends think.middleware.base {
for(let i = 0, name, length = Math.ceil(paths.length) / 2; i < length; i++){
name = paths[i * 2];
if(name){
this.http._get[name] = paths[i * 2 + 1] || '';
this.http._get[name] = decodeURIComponent(paths[i * 2 + 1] || '');
}
}
}

View File

@ -99,6 +99,22 @@ describe('core/http.js', function() {
think.config('timeout', 10);
});
it('parse pathname', function(done) {
var defaultHttp = getDefaultHttp('/index/index/name/w%2Fww');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.deepEqual(http.pathname, 'index/index/name/w%2Fww');
done();
});
});
it('parse pathname 1', function(done) {
var defaultHttp = getDefaultHttp('/index/w%2Fww');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.deepEqual(http.pathname, 'index/w%2Fww');
done();
});
});
it('GET, query', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&1');
var instance = new Http(defaultHttp.req, defaultHttp.res);

View File

@ -448,6 +448,54 @@ describe('middleware/parse_route', function(){
done();
})
})
it('route_on on, has rules, has method, post, has extra pathname', function(done){
muk(think, 'module', ['dddd'])
muk(think, 'route', function(){
return [
[/^welefen/, {
get: '/dddd/welefen/get',
post: '/dddd/welefen/post'
}]
];
})
execMiddleware('parse_route', {
route_on: true
}, {
pathname: 'welefen/name/suredy/value/2222',
method: 'POST'
}).then(function(http){
assert.equal(http.module, 'dddd');
assert.equal(http.controller, 'welefen');
assert.equal(http.action, 'post');
assert.deepEqual(http._get, { test: 'welefen', value: '2222', name: 'suredy' });
muk.restore();
done();
})
})
it('route_on on, has rules, has method, post, has extra pathname, decode', function(done){
muk(think, 'module', ['dddd'])
muk(think, 'route', function(){
return [
[/^welefen/, {
get: '/dddd/welefen/get',
post: '/dddd/welefen/post'
}]
];
})
execMiddleware('parse_route', {
route_on: true
}, {
pathname: 'welefen/name/suredy/value/w%2Fww',
method: 'POST'
}).then(function(http){
assert.equal(http.module, 'dddd');
assert.equal(http.controller, 'welefen');
assert.equal(http.action, 'post');
assert.deepEqual(http._get, { test: 'welefen', value: 'w/ww', name: 'suredy' });
muk.restore();
done();
})
})
it('route_on on, has rules, has method, delete', function(done){
muk(think, 'module', ['welefen']);
muk(think, 'mode', think.mode_module);
@ -525,7 +573,7 @@ describe('middleware/parse_route', function(){
done();
})
})
it('route_on on, rules is object, has reg 2', function(done){
it('route_on on, rules is object, has reg 2', function(done){
muk(think, 'module', ['test']);
muk(think, 'mode', think.mode_module);
muk(think, 'route', function(){