代码片段一:
demo.js
var http = require("http"), url = require("url"), path = require("path"), fs = require("fs"), utoken = require("./utoken");//require this module var handle = {} handle["/utoken"] = utokenHandler; /** * server */ http.createServer(function (req, res) { var pathname=url.parse(req.url).pathname; if(typeof handle[pathname] === "function"){ handle[pathname](res, req) } else { pathname=__dirname+url.parse(req.url).pathname; if (path.extname(pathname)=="") { pathname+="/"; } if (pathname.charAt(pathname.length-1)=="/"){ pathname+="index.html"; } fs.exists(pathname,function(exists){ if(exists){ fs.readFile(pathname,function (err,data){ res.end(data); }) } else { res.writeHead(404, '404 Not Found', {'Content-Type': 'text/html'}) res.end('<h1>404 Not Found</h1>') } }) } }).listen(8080, "0.0.0.0"); console.log("Server running at http://0.0.0.0:8080/"); /** * define a handler */ function utokenHandler(res, req){//get token from server //1, get client ip var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress //2, get upload host and token for the client utoken.getHostTokenTs(ip, function(ret){ //3, show result res.writeHead(200) res.write(ret) res.end() }) }
utoken.js
var http = require("http"), qs = require('qs'), crypto = require("crypto"); /** * Configure */ var Appid = "xxxxx" var Appsecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" var Appname = "xxxxx" /** * Module */ exports.getHostTokenTs = function(clientIp, callback_func){ var host, tsecret, ts this.uri = { host: "api.dbank.com", port: 80, path: "/rest.php", method: "POST", headers: { 'Content-Type': 'application/x-www-form-urlencoded', } } var dt = { client_ip : clientIp, nsp_app : Appid, nsp_fmt : "JSON", nsp_svc : "nsp.ping.getupsrvip", nsp_ts : Date.parse(new Date()), nsp_ver : "1.0" } this.processRequest = function(res) { //console.log('STATUS: ' + res.statusCode); //console.log('HEADERS: ' + JSON.stringify(res.headers)); var body = '' res.on("data",function(chunk){ body += chunk }); res.on("end",function(){ try{ var ret = JSON.parse(body) }catch(e){ body = e.message } if(ret && ret.ip){ var ts = Date.parse(new Date()) var tmpsecret = crypto.createHmac('sha1', Appsecret).update(ts+"").digest('hex') callback_func(ret.ip + " " + tmpsecret + " " + ts) } callback_func(body) }); res.on("error",function(e){ console.log("err"+e.message) }); } this.result = function(){ var md5str = Appsecret for (var key in dt) {md5str+=key+dt[key]} var hash = crypto.createHash("md5") dt.nsp_key = hash.update(md5str+"").digest('hex').toUpperCase() var postdata = qs.stringify(dt) this.uri.headers["Content-Length"] = Buffer.byteLength(postdata) var req = http.request(this.uri, this.processRequest) req.write(postdata) req.end() } this.result(); }
详见:https://github.com/ciaos/node-demo
代码片段二:
var http = require("http"), url = require("url"), path = require("path"); var express = require('express') /* NP */ var np = express() np.get(/^(\/file)\/(.*)/, function(req, res){ var options = { host: '127.0.0.1', port: 8081, path: req.url, method: 'GET' }; var mproxy = function(mres){ var body = '' mres.on('data', function(chunk) { body += chunk }); mres.on('end',function() { if(mres.statusCode == 302){ var url = mres.headers.location.substring(7) //trim http:// var server = url.substring(0,url.indexOf('/')) var serverinfo = server.split(":") var host = serverinfo[0] var port = 80 if(serverinfo.length > 1){ port = serverinfo[1] } var path = url.substring(server.length).replace(/[\r\n]/g, "") options = { host: host, port: port, path: path }; var dreq = http.request(options, dproxy) dreq.on('error', function(e) { res.send(502) }) dreq.end() } else { res.send(dres.statusCode); } }); mres.on('error',function() { res.send(mres.statusCode); }); } var dproxy = function(dres){ if(dres.statusCode == 206 || dres.statusCode == 200){ dres.on('data', function(chunk) { res.write(chunk) }); dres.on('end',function() { res.end() }); dres.on('error',function() { res.send(dres.statusCode) }); } else { res.send(dres.statusCode) } } var mreq = http.request(options, mproxy) mreq.on('error', function(e) { res.send(502) }) mreq.end() }) np.listen(8080); console.log('NP Listening on port 8080'); /* MN */ var mn = express() mn.get(/^(\/file)\/(.*)/, function(req, res){ res.set("location", "http://127.0.0.1:8082/test.dat") res.send(302) }) mn.listen(8081) console.log('MN Listening on port 8081'); /* DN */ var dn = express() dn.use(express.static(__dirname + '/')); dn.listen(8082) console.log('DN Listening on port 8082');
代码三
var http = require("http"), url = require("url"), fs = require("fs"), path = require("path") var express = require('express') var logFile = fs.createWriteStream('./access.log', { "flags": "a" }) /* NP */ var np = express() np.configure(function(){ np.use(express.logger({stream: logFile})) }) np.get(/^\/(file|dl|pl|TDS)\/(.*)/, function(req, res){ var filesize = 0 var reqsize = 0 var start = 0 var end = 0 var header_sent = 0 var finish = 0 req.on("close",function(){ finish = 1 res.end() }) if(req.headers["range"] != null){ var reqrange = req.headers["range"].replace("bytes=","") var rangeinfo = reqrange.split("-") start = rangeinfo[0] end = rangeinfo[1] res.status(206) } var endrequest = function(statuscode) { if(header_sent == 0) { res.send(statuscode) } else { res.end() } } var moptions = { host: '10.6.2.26', port: 80, path: req.url, method: 'GET', headers: {} } if(req.headers['nsp-auth'] != null){ moptions.headers["nsp-auth"] = req.headers['nsp-auth'] } if(req.headers.range != null){ moptions.headers.range = req.headers.range } if(req.headers["user-agent"] != null){ moptions.headers["user-agent"] = req.headers["user-agent"] } if(req.headers["host"] != null){ moptions.headers["host"] = req.headers["host"] } if(req.headers["x-is-https"] != null){ moptions.headers["x-is-https"] = req.headers["x-is-https"] } if(req.headers["x-forwarded-for"] != null){ moptions.headers["x-forwarded-for"] = req.headers["x-forwarded-for"] } var mproxy = function(mres){ var body_locs = [] var loc_id = 0 var body = '' var dproxy = function(dres){ if(dres.statusCode == 206 || dres.statusCode == 200){ header_sent = 1 dres.on('data', function(chunk) { res.write(chunk) start = parseInt(start) + chunk.length }) dres.on('end',function() { if(start + 1 >= reqsize){ finish = 1 res.end() } else { moptions.headers["range"] = "bytes="+start+"-" if(finish == 0){ var mreq = http.request(moptions, mproxy) mreq.on('error', function(e) { endrequest(502) }) mreq.end() } else{ res.end() } } }) dres.on('error',function() { if(finish == 0 && loc_id < body_locs.length - 1) { loc_id += 1 mdone() } else { endrequest(dres.statusCode) } }) } else { if(finish == 0 && loc_id < body_locs.length - 1) { loc_id += 1 mdone() } else { endrequest(dres.statusCode) } } } var mdone = function(){ if(mres.statusCode == 302){ var url = "" var range = "" if(mres.headers.location != null){ url = mres.headers.location.substring(7) //trim http:// if(mres.headers.x-np-range != null){ range = mres.headers["x-np-range"].split(":")[1] } } else { body_locs = body.split("\n") url = body_locs[loc_id].substring(body.indexOf("http://")).substring(7) range = body_locs[loc_id].split(":")[1] } var server = url.substring(0,url.indexOf('/')) var serverinfo = server.split(":") var host = serverinfo[0] var port = 80 if(serverinfo.length > 1){ port = serverinfo[1] } var path = url.substring(server.length).replace(/[\r\n]/g, "") var doptions = { host: host, port: port, path: path, headers: { "Range": "bytes="+range , "Connection": "close" } } if(mres.headers["x-np-file-size"] == null) { doptions.headers["NSP-NP"] = "req_file" } else if(header_sent == 0) { filesize = reqsize = mres.headers["x-np-file-size"] if(start == "" && end != ""){ start = reqsize - end } if(end == ""){ end = reqsize - 1 } reqsize = end - start + 1 if(req.headers["range"] != null){ res.setHeader("Content-Range", "bytes "+start+"-"+end+"/"+filesize) } } if(header_sent == 0){ if(mres.headers["content-disposition"] != null) { res.setHeader("Content-Disposition", mres.headers["content-disposition"]) } if(mres.headers["net-report-url"] != null) { res.setHeader("net-report-url", mres.headers["net-report-url"]) } if(mres.headers["nsp-auth"] != null) { res.setHeader("NSP-Auth", mres.headers["nsp-auth"]) } if(mres.headers["content-md5"] != null) { res.setHeader("Content-MD5", mres.headers["content-md5"]) } if(mres.headers["connection"] != null) { // res.setHeader("Connection", mres.headers["connection"]) res.setHeader("Connection", "keep-alive") } if(mres.headers["content-type"] != null) { res.setHeader("Content-Type", mres.headers["content-type"]) } if(mres.headers["etag"] != null) { res.setHeader("Etag", mres.headers["etag"]) } if(mres.headers["last-modified"] != null) { res.setHeader("Last-Modified", mres.headers["last-modified"]) } if(mres.headers["expires"] != null) { // res.setHeader("Expires", mres.headers["expires"]) } if(mres.headers["x-np-file-size"] != null) { res.setHeader("Content-Length", reqsize) } res.setHeader("Accept-Ranges","bytes") } if(finish == 0){ var dreq = http.request(doptions, dproxy) dreq.on('error', function(e) { endrequest(502) }) dreq.end() } else { res.end() } } else { if(mres.statusCode == 401 && header_sent == 0) { if(mres.headers["nsp-auth"] != null) { res.setHeader("nsp-auth", mres.headers["nsp-auth"]) } } endrequest(mres.statusCode) } } mres.on('data', function(chunk) { body += chunk }) mres.on('end', mdone) mres.on('error',function() { endrequest(mres.statusCode) }) } var mreq = http.request(moptions, mproxy) mreq.on('error', function(e) { endrequest(502) }) mreq.end() }) np.use(express.static('/usr/local/nspnp/html/')) np.listen(80) console.log('NP Listening on port 80')
相关推荐
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...
Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的...