node anyproxy ssi简易支持
在项目中,ssi include是一个比较常用的功能,这样我们就可以通过web服务器的支持,将公用的html提取出来,改一个文件就会修改全部内容
但是这也带来了问题,在开发的时候没办法的刷新查看,需要提交测试服务器才可以,当然也可以通过在本地通过nginx服务器做到这些。
现在我们有了nodejs,github上面也有很多好的本地代理项目,anyproxy,whistle,livepool...
平时主要用 whistle 操作配置上面都很简单,通过简单配置也可以实现很多功能
livepool,装了下,看着想fiddler,操作起来主要感觉主要是界面操作,就没怎么用
anyproxy,这个是需要自己写js,定义规则的,灵活性好些,但是写代码总归麻烦的
今天通过对比,感觉anyproxy实现node ssi功能比较简单些,其实也很简单,详见代码 时间有限,都是通过同步api写的,略有遗憾
/*
read the following wiki before using rule file
https://github.com/alibaba/anyproxy/wiki/What-is-rule-file-and-how-to-write-one
*/
"use strict";
const fs = require('fs');
const url = require("url");
const path = require("path");
var _getNewFPath = function (newUrl) {
var urlObject = url.parse(newUrl, true);
return path.join(this.hostFilePath, urlObject.pathname);
}
const config = [
{
urlInclude: 'http://mall.snail.com/pickCard/',
hostFilePath: 'D:/snailshop/mall-snail-com/mall',
ssi: true,
getNewFPath: function (newUrl) {
var urlObject = url.parse(newUrl, true);
if (newUrl.indexOf('http://mall.snail.com/includes/') != -1) {
return path.join('D:/snailshop/mall-snail-com/', urlObject.pathname);
}
return path.join(this.hostFilePath, urlObject.pathname);
}
},
{
urlInclude: 'http://static.snail.com/',
hostFilePath: 'D:/snailshop/mall-snail-com/public',
getNewFPath: _getNewFPath
}
]; var map = {};
var ssiReadFile = function (reqUrl, ssiOpt) {
map = {};
return _ssiReadFile(reqUrl, ssiOpt, [])
};
var _ssiReadFile = function (reqUrl, ssiOpt, accessPath) {
var readFPath = ssiOpt.getNewFPath(reqUrl);
console.log('_ssiReadFile1', readFPath)
var stat = fs.statSync(readFPath);
var content;
if (stat && stat.isFile()) {
content = fs.readFileSync(readFPath, {encoding: 'utf8'});
var match = content.match(/<!--#\s*include\s+file=(["']).+?\1\s*-->/g);
console.log('_ssiReadFile2', match);
if (match) {
match.forEach((m) => {
var fileStr = m.match(/<!--#\s*include\s+file=(["'])(.+?)\1\s*-->/)[2];
var newUrl = url.resolve(reqUrl, fileStr);
if (accessPath.indexOf(newUrl) != -1) {//存在循环
map[newUrl] = "loop " + newUrl +' in [ '+ accessPath.join() + ']';
} else if (!map[newUrl]) {
var _access = accessPath.slice(0);
_access.push(newUrl);
map[newUrl] = _ssiReadFile(newUrl, ssiOpt, _access);
}
})
content = content.replace(/<!--#\s*include\s+file=(["'])(.+?)\1\s*-->/g, function (a, b, fileStr) {
var newUrl = url.resolve(reqUrl, fileStr);
return map[newUrl];
});
}
} else {
content = 'not find file ' + readFPath;
}
return content;
} module.exports = {
summary: function(){
return "mall 项目";
},
replaceRequestOption : function(req, option){
var host = option.headers.host;
if(host == "mall.snail.com" || host == "static.snail.com" || host == "m.mall.snail.com"){
option.hostname = "10.13.0.206";
option.port = "80";
} else if (host == "mobile.snail.com" || host == "m.mobile.snail.com"){
option.hostname = "10.13.0.205";
option.port = "80";
} else if (host == "cmsv3.snailsite.com"){
option.hostname = "10.110.1.3";
option.port = "80";
} return option;
},
shouldInterceptHttpsReq :function(req){
return false;
},
shouldUseLocalResponse : function(req, reqBody){
var reqUrl = req.url;
var urlObject = url.parse(reqUrl, true);
for (var i = 0, len = config.length; i < len ; i++) {
let opt = config[i];
if (reqUrl.indexOf(opt.urlInclude) != -1) {
let newPath = path.join(opt.hostFilePath, urlObject.pathname);
let stat = fs.statSync(newPath);
if (stat && stat.isFile()) {
console.log('shouldUseLocalResponse', newPath)
req.ssi = opt.ssi || false;
req.ssiOpt = opt;
return true;
}
}
}
return false;
}, dealLocalResponse : function(req, reqBody, callback){
console.log('dealLocalResponse', req.ssi);
if (req.ssi) {
callback(200, {"content-type": "text/html"}, ssiReadFile(req.url, req.ssiOpt));
} else {
callback(200, {}, fs.readFileSync(req.ssiOpt.getNewFPath(req.url)));
}
delete req.ssiOpt;
delete req.ssi;
}
};
node anyproxy ssi简易支持的更多相关文章
- 使用Node.js实现简易MVC框架
在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...
- [转] 使用Node.js实现简易MVC框架
在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...
- node.js 开发简易的小爬虫
node.js 开发简易的小爬虫 最近公司开发一款医药类的软件,所以需要一些药品的基础数据,所以本人就用node.js写一个简易的小爬虫,并写记录这个Demo以供大家参考. 一.开发前的准备: 1, ...
- 在Apache下开启SSI配置支持include shtml html和快速配置服务器
作为前端开发,使用Apache快速搭建服务器极为方便. 1.找到apach安装目录,找到conf目录下 的httpd.conf 使用SSI(Server Side Include)的html文件扩展名 ...
- 《基于Node.js实现简易聊天室系列之详细设计》
一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次 ...
- Node 7.6默认支持Async/Await
Node.js 7.6正式默认支持async/await功能,并能够使低内存设备获得更出色的性能. Node 7.6对async/await的支持来自于将V8(Chromium JavaScript引 ...
- 利用es-checker检测当前node对ES6的支持情况
ode.js发展非常快,对es6特性的支持也越来越良心,但node.js版本很多,各版本对es6的支持度都不一样,为了能清晰的了解各版本对es6特性的支持,需要有一个工具能提供比较清晰的支持说明,甚至 ...
- node.js + mssql 简易封装操作
时间吧,总是这么凑巧,在我学习[node.js]还没几天,我的 Microsoft SQL Server Management Studio 18 就歇菜了,至于怎么歇菜的吧....它可能的意思就是想 ...
- Node.js搭建简易用户登录
根据学习笔记一的知识点搭建的简易用户注册登录模块,用户数据暂用json保存. HTML: <!DOCTYPE html> <html lang="en" dir= ...
随机推荐
- myeclipse中自己手动配置maven
第一步,配置myeclipse的jdk,因为myeclipse默认的是运行在jre之上,而maven是在jdk之上 第二步,配置maven:
- Linux系统的简介及Linux系统的安装
一.写在前面 本文仅仅对Linux系统进行简要的概述已经对Linux系统的安装进行简要的介绍 二.完成目标 1.Linux操作系统的基本概念 2.Linux系统的安装 三.基本概念 1.什么是操作系 ...
- (三)Android中Intent概念及应用
一.显示Intent startActivity(new Intent(MainActivity.this,BAty.class)); 显示Intent直接指定要启动的Intent类 注意自己通过创建 ...
- 【视图】实时库存【SSKC】
select A.pluno,A.pluname,A.qty,CASE WHEN b.QTY IS NULL THEN 0 ELSE B.QTY END AS XSQTY ,case when ...
- windows 安装paramiko模块
首先需要安装pycrypto这个模块,这个下源码编译安装的不能用报错warning: GMP or MPIR library not found; Not building这个用编译好的模块安装已编译 ...
- Your build settings specify a provisioning profile with the UUID, no such provisioning profile was found的解决方案
在Archive项目时,出现了“Your build settings specify a provisioning profile with the UUID “”, however, no suc ...
- 初学DIV+CSS要记住的
初学DIV+CSS?有六个问题需要您关注一下!作为DIV+CSS初学者,如果在动手写代码之前对网页整体结构由一个清晰认识的话,写起来会事半功倍!但是,写的过程中总是有这样那样的问题,使得我们不得不停下 ...
- 基于TcpDump和pcap文件分析的Android平台网络抓包程序设计与实现【随便】
一.考虑使用Tcpdump,将抓到的包保存到cap文件中,然后手动分析.参考资料:1. http://www.cnblogs.com/tt-0411/archive/2012/09/23/269936 ...
- action接收到来自jsp页面的请求时出现中文乱码问题处理方法
写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了.由于在JSP中使用了GBK作用页面的编码,那么提交的中文信息自然也会被按着GBK进行编码,为%xx格式的GBK ...
- JavaScript基本概念(对象)
1.对象的分类 内置对象:由ECMAScript规范定义的对象或类 宿主对线:由浏览器定义的对象 自定义对象:由运行中的Javascript代码创建的对象 2.属性的分类 自有属性:直接在对象中定义的 ...