docs: function callee(method, href, params, opt, cb, userData){
  		cb = cb || ((err)=>{
  			if (err) console.error(method, href, params, opt, userData, err)
  		})
  		if (!href) return cb('url not defined')
  		opt=opt||{}
  
  		const urlobj = url.parse(href)
  		let protocol
  
  		switch(urlobj.protocol){
  		case 'http:': protocol=http; break
  		case 'https:': protocol=https; break
  		default:
  			if (opt.socketPath){
  				protocol=http
  				urlobj.protocol = 'http:'
  				urlobj.socketPath = opt.socketPath
  				break
  			}
  			fs.readFile(href, 'utf8', (err, data)=>{
  				cb(err, 4, data, userData)
  			}); return
  		}
  
  		const isGet = 'GET' === (urlobj.method = method.toUpperCase())
  		let body = Array.isArray(params) ? pObj.extends({}, params, {tidy:1, mergeArr:1}) : params || ''
  
  		if (isGet){
  			urlobj.path += body ? '?' + qs.stringify(body) : body
  			urlobj.headers = opt.headers||{}
  		}else{
  			urlobj.headers = Object.assign({
  				'Content-Type': 'application/x-www-form-urlencoded'
  			},opt.headers||{})
  			switch(urlobj.headers['Content-Type']){
  			case 'application/json': body = JSON.stringify(body); break
  			case 'plain/text': body = body.toString(); break
  			default: body = qs.stringify(body); break
  			}
  		}
  
  		const req = protocol.request(urlobj, res => {
  			const st=res.statusCode
  			const loc=res.headers.location
  			if (st>=300 && st<400 && loc) return callee(method,loc,params,opt,cb,userData)
  			res.setEncoding('utf8')
  			const err=(300>st || !st) ? null : {error:res.statusMessage,code:st,params:arguments}
  			cb(err, 2, null, userData)
  			let data = ''
  			res.on('data', (chunk)=>{
  				data += chunk
  				cb(err, 3, data, userData)
  			})
  			res.on('end', ()=>{
  				cb(err, 4, data, userData)
  			})
  		})
  
  		req.setTimeout(opt.timeout||0, err => {
  			cb({error:err.message,code:599,src:err,params:arguments}, 4, null, userData)
  		})
  		req.on('error', err => {
  			cb({error:err.message,code:500,src:err,params:arguments}, 4, null, userData)
  		})
  
  		if (isGet) req.end()
  		else req.end(body)
  		return req
  	}