thinkjs/test/core/http.js
2017-09-14 10:01:20 +08:00

1574 lines
49 KiB
JavaScript

'use strict';
var assert = require('assert');
var path = require('path');
var fs = require('fs');
var querystring = require('querystring');
var EventEmitter = require('events').EventEmitter;
var Socket = require('net').Socket;
var IncomingMessage = require('http').IncomingMessage;
var muk = require('muk');
var thinkjs = require('../../lib/index.js');
new thinkjs().load();
var Http = think.safeRequire(path.resolve(__dirname, '../../lib/core/http.js'));
var localeIp = '127.0.0.1';
function noop(data) {
return data;
}
function getDefaultHttp(data) {
data = data || {};
if (think.isString(data)) {
if (data[0] === '{') {
data = JSON.parse(data);
} else if (/^[\w]+\=/.test(data)) {
data = querystring.parse(data);
} else {
data = {
url: data
};
}
}
var url = data.url || '';
if (url.indexOf('/') !== 0) {
url = '/' + url;
}
var req = {
httpVersion: '1.1',
method: (data.method || 'GET').toUpperCase(),
url: url,
headers: think.extend({
host: data.host || localeIp
}, data.headers),
connection: {
remoteAddress: data.ip || localeIp
}
};
var res = {
end: data.end || data.close || noop,
write: data.write || data.send || noop,
headers: {},
setHeader: function(name, value) {
this.headers[name] = value;
},
setTimeout: noop,
connection: {
remoteAddress: data.ip || localeIp
}
};
if (data.params) {
req.params = data.params;
}
return {
req: req,
res: res
};
}
think.APP_PATH = path.dirname(path.dirname(__dirname)) + think.sep + 'testApp';
describe('core/http.js', function() {
it('is EventEmitter instance, false', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&48');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http instanceof EventEmitter, false);
done();
});
});
it('response timeout', function(done) {
var timeoutHttp = getDefaultHttp('/index/index?k=timeout');
think.config('timeout', 0.01);
muk(think, 'log', function(){})
timeoutHttp.res.setTimeout = function(delay, fn) {
done();
setTimeout(fn, delay);
};
var instance = new Http(timeoutHttp.req, timeoutHttp.res);
instance.run();
think.config('timeout', 10);
});
it('response timeout false', function(done) {
var timeoutHttp = getDefaultHttp('/index/index?k=timeout');
think.config('timeout', 0);
muk(think, 'log', function(){});
var flag = false;
timeoutHttp.res.setTimeout = function(delay, fn) {
flag = true;
setTimeout(fn, delay);
};
var instance = new Http(timeoutHttp.req, timeoutHttp.res);
instance.run().then(function(){
assert.equal(flag, false)
done();
});
think.config('timeout', 10);
});
it('parse pathname /', function(done) {
var defaultHttp = getDefaultHttp('/');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.deepEqual(http.pathname, '/');
done();
});
});
it('parse pathname /', function(done) {
var defaultHttp = getDefaultHttp({
url: '/',
headers: {
host: 'test.com:1234'
}
});
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.deepEqual(http.pathname, '/');
assert.deepEqual(http.hostname, 'test.com')
done();
});
});
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('hasPayload', function() {
var defaultHttp = getDefaultHttp({
url: '/',
headers: {
}
});
var instance = new Http(defaultHttp.req, defaultHttp.res);
var data = instance.hasPayload();
assert.equal(data, false)
});
it('hasPayload transfer-encoding', function() {
var defaultHttp = getDefaultHttp({
url: '/',
headers: {
'transfer-encoding': 'gzip'
}
});
var instance = new Http(defaultHttp.req, defaultHttp.res);
var data = instance.hasPayload();
assert.equal(data, true)
});
it('hasPayload content-length', function() {
var defaultHttp = getDefaultHttp({
url: '/',
headers: {
'content-length': 100
}
});
var instance = new Http(defaultHttp.req, defaultHttp.res);
var data = instance.hasPayload();
assert.equal(data, true)
});
it('GET, query', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&1');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.deepEqual(http.get(), { name: 'maxzhang', '1': '' });
done();
});
});
it('GET, set', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&2');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.get({ name: 'thinkjs' });
assert.equal(http.get('name'), 'thinkjs');
done();
});
});
it('GET, get multi', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&2');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.get({ name: 'thinkjs', test: 'aaa', dd: 'www' });
assert.deepEqual(http.get('name,test'), {name: 'thinkjs', test: 'aaa'});
done();
});
});
it('param', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&3');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.param('name'), 'maxzhang');
done();
});
});
it('get headers', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&4');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.deepEqual(http.header(), { host: '127.0.0.1' });
done();
});
});
it('get special header', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&5');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.header('user-agent'), '');
done();
});
});
it('get type', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&6');
var req = think.extend({}, defaultHttp.req, {
headers: {
'content-type': 'application/json'
}
})
var instance = new Http(req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.type(), 'application/json');
done();
}).catch(function(err) {
console.log(err.stack)
});
});
it('get type, _contentTypeIsSend', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&7');
var req = think.extend({}, defaultHttp.req, {
headers: {
'content-type': 'text/html'
}
})
var instance = new Http(req, defaultHttp.res);
instance.run().then(function(http) {
http._contentTypeIsSend = true;
http.type('application/json');
assert.equal(http.type(), 'text/html');
done();
}).catch(function(err){
console.log(err.stack)
});
});
it('set type', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&8');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req.headers = {
'content-type': 'text/html'
};
instance.run().then(function(http) {
http.type('application/json');
assert.equal(http.res.headers['Content-Type'].indexOf('application/json') !== -1, true);
done();
});
});
it('set type, lookup mimetype', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&9');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req.headers = {
'content-type': 'text/html'
};
instance.run().then(function(http) {
http.type('json');
assert.equal(http.res.headers['Content-Type'].indexOf('application/json') !== -1, true);
done();
});
});
it('get referrer', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&10');
var req = think.extend({}, defaultHttp.req, {
headers: {
'referrer': 'http://www.thinkjs.org/index?name=maxzhang'
}
})
var instance = new Http(req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.referrer('www.thinkjs.org'), 'www.thinkjs.org');
done();
});
});
it('isAjax 1', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&11');
var req = think.extend({}, defaultHttp.req, {
headers: {
'x-requested-with': 'XMLHttpRequest'
}
})
var instance = new Http(req, defaultHttp.res);
instance.req.method = 'POST';
instance.run().then(function(http) {
assert.equal(http.isAjax(), true);
done();
});
});
it('isAjax 2', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&12');
var req = think.extend({}, defaultHttp.req, {
headers: {
'x-requested-with': 'XMLHttpRequest'
},
method: 'POST'
})
var instance = new Http(req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.isAjax('GET'), false);
done();
});
});
it('ip', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&13');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.host = '127.0.0.1:8360';
instance.run().then(function(http) {
assert.equal(http.ip(), '127.0.0.1');
done();
});
});
it('ip with socket', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&14');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.host = '127.0.0.1:8360';
http.req.socket = {
remoteAddress: '10.0.0.1'
};
assert.equal(http.ip(), '10.0.0.1');
done();
});
});
it('ip with connection', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&15');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.host = '127.0.0.1:8360';
http.req.connection = {
remoteAddress: '10.0.0.1'
};
assert.equal(http.ip(), '10.0.0.1');
done();
});
});
it('ip with ::', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&16');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.host = '127.0.0.1:8360';
http.req.connection = {
remoteAddress: '::ff:10.0.0.1'
};
assert.equal(http.ip(), '10.0.0.1');
done();
});
});
it('ip with x-real-ip', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&17');
var req = think.extend({}, defaultHttp.req, {
headers: {
'x-real-ip': '10.0.0.1'
}
})
var instance = new Http(req, defaultHttp.res);
think.config('proxy_on', true);
instance.run().then(function(http) {
assert.equal(http.ip(), '10.0.0.1');
think.config('proxy_on', false);
done();
}).catch(function(err){
console.log(err.stack)
});
});
it('ip with x-forwarded-for', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&18');
var req = think.extend({}, defaultHttp.req, {
headers: {
'x-forwarded-for': '10.0.0.1'
}
})
var instance = new Http(req, defaultHttp.res);
think.config('proxy_on', true);
instance.req.headers = {
'x-forwarded-for': '10.0.0.1'
};
instance.run().then(function(http) {
assert.equal(http.ip(true), '10.0.0.1');
think.config('proxy_on', false);
done();
});
});
it('ip, is not ip', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&19');
var instance = new Http(defaultHttp.req, defaultHttp.res);
var fn = think.isIP;
think.isIP = function() { return false; };
instance.run().then(function(http) {
http.host = '127.0.0.1:8360';
http.req.connection = {
remoteAddress: '10.0.0.1'
};
assert.equal(http.ip(), '127.0.0.1');
think.isIP = fn;
done();
});
});
it('set header', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&20');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.setHeader;
http.res.headersSent = false;
http.res.setHeader = function(name, value) {
assert.equal(name, 'name');
assert.equal(value, 'maxzhang');
http.res.setHeader = fn;
done();
};
http.header('name', 'maxzhang');
});
});
it('set header, headersSent', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&21');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.res.headersSent = true;
http.header('name', 'maxzhang');
done();
});
});
it('set header, _contentTypeIsSend', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&22');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req.headers = {
'content-type': 'text/html'
};
instance.run().then(function(http) {
http.res.headersSent = false;
http.header('Content-Type', 'application/json');
http.header('Content-Type', 'text/html');
assert.equal(http.res.headers['Content-Type'].indexOf('application/json') !== -1, true);
done();
});
});
it('set status', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&23');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.res.headersSent = false;
http.status(302);
assert.equal(http.res.statusCode, 302);
done();
});
});
it('set status return', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&23');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.res.headersSent = false;
var data = http.status(302);
assert.equal(http.res.statusCode, 302);
assert.equal(data, http);
done();
});
});
it('set status default', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&24');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.res.headersSent = false;
http.status();
assert.equal(http.res.statusCode, 200);
done();
});
});
it('get file 1', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&24');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._file = {image: {name: 'welefen'}}
var data = http.file('image');
assert.deepEqual(data, {name: 'welefen'})
done();
});
});
it('get file 2', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&24');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._file = {image: {name: 'welefen'}}
var data = http.file('image');
data.name = 'suredy';
assert.deepEqual(http._file, {image: {name: 'welefen'}})
done();
});
});
it('get user agent', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang');
var req = think.extend({}, defaultHttp.req, {
headers: {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2478.0 Safari/537.36'
}
})
var instance = new Http(req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.userAgent(), 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2478.0 Safari/537.36');
done();
})
});
it('get empty user agent', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&25');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.userAgent(), '');
done();
});
});
it('set cookie', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&26');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie('name', 'maxzhang');
assert.deepEqual(http._sendCookie, {
'name': {
'path': '/',
'domain': '',
'httponly': false,
'secure': false,
'timeout': 0,
'name': 'name',
'value': 'maxzhang'
}
});
done();
});
});
it('set cookie with timeout', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&27');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie('name', 'maxzhang', 10000);
assert.equal(http._sendCookie.name.expires !== undefined, true);
assert.equal(http._sendCookie.name.expires instanceof Date, true);
done();
});
});
it('set cookie with timeout 1', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&28');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var opts = {
timeout: 20000
};
http.cookie('name', 'maxzhang', opts);
http.cookie('name', 'maxzhang', opts);
assert.equal(http._sendCookie.name.expires !== undefined, true);
assert.equal(http._sendCookie.name.timeout, 20000);
assert.equal(http._sendCookie.name.expires instanceof Date, true);
done();
});
});
it('set cookie, remove cookie', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&29');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie('name', null);
assert.equal(http._sendCookie.name.expires !== undefined, true);
assert.equal(http._sendCookie.name.expires instanceof Date, true);
done();
});
});
it('set cookie, with options', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&30');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie('name', 'maxzhang', {
'path': '/xxx/',
'domain': 'thinkjs.org'
});
assert.deepEqual(http._sendCookie, {
'name': {
'path': '/xxx/',
'domain': 'thinkjs.org',
'httponly': false,
'secure': false,
'timeout': 0,
'name': 'name',
'value': 'maxzhang'
}
});
done();
});
});
it('send cookie', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&31');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie('name', 'maxzhang', {
'path': '/xxx/',
'domain': 'thinkjs.org'
});
var fn = http.res.setHeader;
http.res.headersSent = false;
http.res.setHeader = function(name, value) {
assert.equal(name, 'Set-Cookie');
assert.deepEqual(value, ['name=maxzhang; Domain=thinkjs.org; Path=/xxx/']);
assert.deepEqual(http._sendCookie, {
'name': {
'path': '/xxx/',
'domain': 'thinkjs.org',
'httponly': false,
'secure': false,
'timeout': 0,
'name': 'name',
'value': 'maxzhang'
}
});
http.res.setHeader = fn;
done();
};
http.cookie(true);
});
});
it('send cookie empty', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&32');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie(true);
done();
});
});
it('send cookie multi', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&33');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie('name', 'maxzhang', {
'path': '/xxx/',
'domain': 'thinkjs.org'
});
http.cookie('value', 'suredy');
var fn = http.res.setHeader;
http.res.headersSent = false;
http.res.setHeader = function(name, value) {
assert.equal(name, 'Set-Cookie');
assert.deepEqual(value, ['name=maxzhang; Domain=thinkjs.org; Path=/xxx/', 'value=suredy; Path=/']);
assert.deepEqual(http._sendCookie, {
'name': {
'path': '/xxx/',
'domain': 'thinkjs.org',
'httponly': false,
'secure': false,
'timeout': 0,
'name': 'name',
'value': 'maxzhang'
},
'value': {
'path': '/',
'domain': '',
'httponly': false,
'secure': false,
'timeout': 0,
'name': 'value',
'value': 'suredy'
}
});
http.res.setHeader = fn;
done();
};
http.cookie(true);
});
});
it('redirect empty', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&34');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.setHeader;
muk(think, 'log', function(){})
http.res.setHeader = function(name, value) {
assert.equal(name, 'Location');
assert.equal(value, '/');
http.res.setHeader = fn;
};
var fn1 = http.res.end;
http.res.end = function() {
http.res.end = fn1;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.redirect();
assert.equal(http.res.statusCode, 302);
});
});
it('redirect url', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&35');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.setHeader;
http.res.setHeader = function(name, value) {
assert.equal(name, 'Location');
assert.equal(value, 'http://www.thinkjs.org');
http.res.setHeader = fn;
};
var fn1 = http.res.end;
muk(think, 'log', function(){})
http.res.end = function() {
http.res.end = fn1;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.redirect('http://www.thinkjs.org', 301);
assert.equal(http.res.statusCode, 301);
});
});
it('sendTime empty', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&36');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.setHeader;
http.res.setHeader = function(name) {
assert.equal(name, 'X-EXEC-TIME');
http.res.setHeader = fn;
done();
};
http.sendTime();
});
});
it('sendTime name', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.setHeader;
http.res.setHeader = function(name) {
assert.equal(name, 'X-TEST');
http.res.setHeader = fn;
done();
};
http.sendTime('TEST');
});
});
it('get post data, all', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {};
var data = http.post();
assert.deepEqual(data, {});
done();
});
});
it('get post data, all 2', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {a: ['EXP', 2]};
var data = http.post();
assert.deepEqual(data, {
a: ['EXP ', 2]
});
http._post = {};
done();
});
});
it('get post data, all 3', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {a: {EXP: 2}};
var data = http.post();
assert.deepEqual(data, {
a: {'EXP ': 2}
});
http._post = {};
done();
});
});
it('get get data, all 2', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._get = {a: ['EXP', 2]};
var data = http.get();
assert.deepEqual(data, {
a: ['EXP ', 2]
});
http._get = {};
done();
});
});
it('get get data, all 3', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._get = {a: {EXP: 2}};
var data = http.get();
assert.deepEqual(data, {
a: {'EXP ': 2}
});
http._get = {};
done();
});
});
it('get post data, name', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {name: 'test'};
var data = http.post('name');
assert.deepEqual(data, 'test');
done();
});
});
it('get post data, name, multi', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {name: 'test', aaa: 'b'};
var data = http.post('name,aaa');
assert.deepEqual(data, {name: 'test', 'aaa': 'b'});
done();
});
});
it('get post data, 0', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {name: 0};
var data = http.post('name');
assert.deepEqual(data, 0);
done();
});
});
it('get post data, false', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {name: false};
var data = http.post('name');
assert.deepEqual(data, false);
done();
});
});
it('get post data, undefined', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&37');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http._post = {name: 0};
var data = http.post('name111');
assert.deepEqual(data, '');
done();
});
});
it('write empty', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&38');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
assert.equal(http.write(), undefined);
done();
});
});
it('write array', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&39');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, '[1,2,3]');
http.res.write = fn;
done();
};
http.write([1, 2, 3]);
});
});
it('write obj', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&40');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, '{"name":"maxzhang"}');
http.res.write = fn;
done();
};
http.write({
name: 'maxzhang'
});
});
});
it('write str', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&41');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, 'maxzhang');
http.res.write = fn;
done();
};
http.write('maxzhang');
});
});
it('write str', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&42');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
var buffer = new Buffer(10);
http.res.write = function(content) {
assert.equal(content, buffer);
http.res.write = fn;
done();
};
http.write(buffer);
});
});
it('write true', function(done) {
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&43');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, 'true');
http.res.write = fn;
done();
};
http.write(true);
});
});
it('write no encoding', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, 'true');
http.res.write = fn;
done();
};
http.write(true);
});
});
it('success', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&44');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, '{"errno":0,"errmsg":"success","data":{"name":"thinkjs"}}');
http.res.write = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.success({ 'name': 'thinkjs' }, 'success');
});
});
it('fail', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index&method=post&2');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, '{"errno":500,"errmsg":"error","data":{"name":"thinkjs"}}');
http.res.write = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.fail(500, 'error', { 'name': 'thinkjs' });
});
});
it('fail with object', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&45');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, '{"errno":500,"errmsg":"error","data":{"name":"thinkjs"}}');
http.res.write = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.fail({
errno: 500,
errmsg: 'error',
data: { 'name': 'thinkjs' }
});
});
});
it('jsonp', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index&method=post&3');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.get('callback', 'callback1');
http.res.write = function(content) {
assert.equal(content, 'callback1({"name":"thinkjs"})');
http.res.write = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.jsonp({ 'name': 'thinkjs' });
});
});
it('jsonp without callback', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&46');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.res.write = function(content) {
assert.equal(content, '{"name":"thinkjs"}');
http.res.write = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.jsonp({ 'name': 'thinkjs' });
});
});
it('jsonp, empty data', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&47');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
var fn = http.res.write;
http.get('callback', 'callback1');
http.res.write = function(content) {
assert.equal(content, 'callback1()');
http.res.write = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
http.jsonp();
});
});
it('get cookie from set', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index?name=maxzhang&47');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.run().then(function(http) {
http.cookie('wwwwww', 'sss');
var value = http.cookie('wwwwww');
assert.equal(value, 'sss');
done();
});
});
/*
describe('HTTP POST', function() {
it('hasPostData false', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&4');
var instance = new Http(defaultHttp.req, defaultHttp.res);
assert.equal(instance.hasPostData(), false);
done();
});
it('hasPostData true', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&5');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.http.req.headers['transfer-encoding'] = 'gzip';
instance.run().then(function() {
assert.equal(instance.hasPostData(), true);
done();
});
});
it('hasPostData true', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&6');
var instance = new Http(defaultHttp.req, defaultHttp.res);
delete instance.http.req.headers['transfer-encoding'];
instance.http.req.headers['content-length'] = 100;
assert.equal(instance.hasPostData(), true);
done();
});
it('common post, no data', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&7');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage();
instance.req.url = defaultHttp.req.url;
instance.req.method = 'POST';
instance.run().then(function() {
done();
});
});
it('common post, set POST data', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&8');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.method = 'POST';
instance.run().then(function(http) {
http.post({ name: 'maxzhang' });
assert.deepEqual(http.post(), {
name: 'maxzhang'
});
done();
});
});
it('common post with data', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&9');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.req.emit('data', new Buffer('name=maxzhang'));
instance.req.emit('end');
});
instance.run().then(function(http) {
assert.deepEqual(http.post(), {
name: 'maxzhang'
});
done();
});
});
it('common post with data1', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&10');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.req.emit('data', new Buffer('name=maxzhang&value=suredy'));
instance.req.emit('end');
});
instance.run().then(function(http) {
assert.deepEqual(http.post(), {
name: 'maxzhang',
value: 'suredy'
});
done();
});
});
it('common post with json data', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&11');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip',
'content-type': 'application/json'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.req.emit('data', new Buffer('{"name":"maxzhang"}'));
instance.req.emit('end');
});
instance.run().then(function(http) {
assert.deepEqual(http.post(), {
name: 'maxzhang'
});
done();
});
});
it('common post, parse querystring error', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index&method=post&12');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.req.emit('data', new Buffer('name=maxzhang'));
instance.req.emit('end');
});
var fn = querystring.parse;
querystring.parse = function() {
throw new Error('test');
};
instance.res.end = function() {
assert.equal(instance.res.statusCode, 400);
querystring.parse = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
instance.run();
});
it('common post error', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index&method=post&13');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip'
};
instance.req.method = 'POST';
instance.res.statusCode = 200;
process.nextTick(function() {
instance.req.emit('error', new Error('test'));
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
instance.run();
instance.res.end = function() {
assert.equal(instance.res.statusCode, 400);
setTimeout(function(){
muk.restore();
done();
}, 20)
};
});
it('common post.max_fields', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index&method=post&14');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip'
};
instance.req.method = 'POST';
process.nextTick(function() {
var arr = [];
for (var i = 0; i < 100; i++) {
arr.push(Math.random() + '=' + Date.now());
}
instance.req.emit('data', new Buffer(arr.join('&')));
instance.req.emit('end');
});
think.config('post.max_fields', 50);
var fn = instance.res.end;
instance.res.statusCode = 200;
instance.res.end = function() {
assert.equal(instance.res.statusCode, 400);
instance.res.end = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
instance.run();
});
it('common post.max_fields_size', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index&method=post&15');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip'
};
instance.req.method = 'POST';
process.nextTick(function() {
var arr = [];
for (var i = 0; i < 40; i++) {
arr.push(Math.random() + '=' + (new Array(1000).join(Math.random() + '')));
}
instance.req.emit('data', new Buffer(arr.join('&')));
instance.req.emit('end');
});
think.config('post.max_fields', 50);
think.config('post.max_fields_size', 1000);
var fn = instance.res.end;
instance.res.statusCode = 200;
instance.res.end = function() {
assert.equal(instance.res.statusCode, 400);
instance.res.end = fn;
setTimeout(function(){
muk.restore();
done();
}, 20)
};
instance.run();
});
it('file upload', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&16');
var instance = new Http(defaultHttp.req, defaultHttp.res);
var log = think.log;
think.log = function(){};
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip',
'content-type': 'multipart/form-data; boundary=maxzhang'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.form.emit('file', 'image', 'maxzhang');
instance.form.emit('close');
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
instance.run().then(function(http) {
assert.deepEqual(http.file(), {
image: 'maxzhang'
});
think.log = log;
done();
});
});
it('file upload, same name files', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&17');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip',
'content-type': 'multipart/form-data; boundary=maxzhang'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.form.emit('file', 'image', 'maxzhang1');
instance.form.emit('file', 'image', 'maxzhang2');
instance.form.emit('close');
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
instance.run().then(function(http) {
assert.deepEqual(http.file(), {
image: ['maxzhang1', 'maxzhang2']
});
done();
});
});
it('file upload, field', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&18');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip',
'content-type': 'multipart/form-data; boundary=maxzhang'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.form.emit('field', 'image', 'maxzhang');
instance.form.emit('close');
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
instance.run().then(function(http) {
assert.deepEqual(http.post(), {
image: 'maxzhang'
});
done();
});
});
it('file upload, error', function(done) {
muk(think, 'log', function(){})
var defaultHttp = getDefaultHttp('/index/index&method=post&19');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip',
'content-type': 'multipart/form-data; boundary=maxzhang'
};
instance.req.method = 'POST';
instance.res.statusCode = 200;
process.nextTick(function() {
instance.form.emit('error', new Error('test'));
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
instance.run();
instance.res.end = function() {
assert.equal(instance.res.statusCode, 400);
setTimeout(function(){
muk.restore();
done();
}, 30)
};
});
it('file upload, clear tmp file', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&20');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
var log = think.log;
think.log = function(){};
instance.req.headers = {
'transfer-encoding': 'gzip',
'content-type': 'multipart/form-data; boundary=maxzhang'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.form.emit('file', 'image', 'maxzhang');
instance.form.emit('close');
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
var fn = fs.unlink;
var fn1 = think.isFile;
think.isFile = function() { return true; };
fs.unlink = function(filepath) {
fs.unlink = fn;
think.isFile = fn1;
think.log = log;
done();
};
instance.run().then(function(http) {
http._end();
});
});
it('ajax file upload', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post&21');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip',
'x-filename': '1.js'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.req.emit('data', new Buffer('maxzhang'));
instance.req.emit('end');
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
instance.run().then(function(http) {
var file = http.file().file;
assert.equal(file.originalFilename, '1.js');
assert.equal(file.size, 8);
assert.equal(file.path.indexOf('.js') > -1, true);
done();
});
});
/*
it('ajax file upload error', function(done) {
var defaultHttp = getDefaultHttp('/index/index&method=post');
var instance = new Http(defaultHttp.req, defaultHttp.res);
instance.req = new IncomingMessage(new Socket());
instance.req.url = defaultHttp.req.url;
instance.req.headers = {
'transfer-encoding': 'gzip',
'x-filename': '1.js'
};
instance.req.method = 'POST';
process.nextTick(function() {
instance.req.emit('error', new Error('test'));
});
think.config('post.max_fields', 150);
think.config('post.max_fields_size', 1000);
instance.run();
instance.res.end = function() {
assert.equal(instance.res.statusCode, 400);
done();
};
});
*/
//});
});