-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathresmodules.coffee
100 lines (77 loc) · 3 KB
/
resmodules.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
util = require('util')
fs = require('fs')
querystring = require('querystring')
QueryStringUtil = require('./querystringutil')
ZlibUtil = require('./zlibutil')
CUtil = require('./cutil')
logger = require('./loggerutil')
class ResModules
constructor: (@config) ->
@use = @config.res_modules.use || false
@modules = []
if @use
@modules.push(new HtmlModify(@config))
@modules.push(new JsonSave(@config))
@modules.push(new JsonMock(@config))
@modules.push(new Othons(@config))
pipeAll: (options, p_res, buffer, res, callback) ->
if @modules[0]?
return if @modules[0].pipe(options, p_res, buffer, res, callback)
@modules.splice(0, 1)
@pipeAll(options, p_res, buffer, res, callback)
else
return
class Othons
constructor: (@config) ->
pipe: (options, p_res, buffer, res, callback) ->
CUtil.forward(p_res, buffer, res)
class Mock
constructor: () ->
init: (p_res) ->
@headers = p_res.headers
@statusCode = p_res.statusCode
@content_encoding = @headers["content-encoding"] || ""
@content_type = @headers["content-type"] || ""
class JsonMock extends Mock
constructor: (@config) ->
@rules = require(@config.res_modules.jsonmock || './conf/jsonmock') || []
pipe: (options, p_res, buffer, res, callback) =>
@init(p_res)
if !(@statusCode == 200) #|| !@content_type? || !@content_type.match(/.*(application\/json).*/)
return false
for rule in @rules
if options.href.match(".*(#{rule['path']}).*") && QueryStringUtil.queryStringDiff(options.search, rule['search'])
str = fs.readFileSync("#{rule['file']}")
buf = new Buffer(str)
p_res.headers['content-length'] = buf.length
CUtil.forward(p_res, buf, res)
return true
return false
class JsonSave extends Mock
constructor: (@config) ->
@rules = require(@config.res_modules.jsonmock || './conf/jsonsave') || []
pipe: (options, p_res, buffer, res, callback) =>
@init(p_res)
if !(@statusCode == 200) || !@content_type? || !@content_type.match(/.*(application\/json).*/)
return false
for rule in @rules
if options.href.match(".*(#{rule['path']}).*") && QueryStringUtil.queryStringDiff(options.search, rule['search'])
fs.writeFile "#{rule['path']}_#{rule['search']}_#{(new data()).getTime()}", buffer, (err) ->
return true
return false
class HtmlModify extends Mock
constructor: (@config) ->
@rules = require(@config.res_modules.htmlmodify || './conf/htmlmodify') || []
pipe: (options, p_res, buffer, res, callback) ->
@init(p_res)
if !(@statusCode == 200) || !@content_type? || !@content_type.match(/.*(text\/html).*/)
return false
for rule in @rules
if options.href.match(".*(#{rule['path']}).*") && QueryStringUtil.queryStringDiff(options.search, rule['search'])
ZlibUtil.decompress @content_type, @content_encoding, buffer, (str) =>
str = str.replace("#{rule['content']}", "#{rule['replace']}")
ZlibUtil.compress @content_type, @content_encoding, str, (cbuf) =>
CUtil.forward(p_res, cbuf, res)
return true
return false
module.exports = ResModules