UNPKG

6.71 kBJavaScriptView Raw
1/**
2 * @file 内建资源处理方法集合
3 * @author otakustay[otakustay@live.com],
4 * errorrik[errorrik@gmail.com],
5 * ostream[ostream.song@gmail.com],
6 * firede[firede@firede.us],
7 * junmer[junmer@foxmail.com],
8 * leeight[leeight@gmail.com]
9 */
10var path = require('path');
11var zlib = require('zlib');
12
13var mimeType = require('./mime-types');
14
15exports.write = function () {
16 return function (context) {
17 var response = context.response;
18 var request = context.request;
19 var header = context.header;
20 var extname = path.extname(request.pathname).slice(1);
21
22 var headers = Object.keys(header).map(function (s) {
23 return s.toLowerCase();
24 });
25
26 if (context.status === 200
27 && headers.indexOf('content-type') < 0) {
28 header['content-type'] = mimeType[extname] || mimeType.html;
29 }
30
31 // 这里要先设置header的content-type和content-encoding,connect的compress才会起作用
32 var preSetHeaders = ['content-encoding', 'content-type'];
33 preSetHeaders.forEach(function(name) {
34 if (header[name]) {
35 response.setHeader(name, header[name]);
36 }
37 });
38
39 // 如果headerSents不为空,表示response已经结束了
40 if (!response.headerSents) {
41 var encoding = response.getHeader('content-encoding') || 'identity';
42 if (encoding === 'identity') {
43 var match = /\b(gzip|deflate)\b/i.exec(request.headers['accept-encoding'] || '');
44 encoding = match ? match[1].toLowerCase() : null;
45 if (zlib[encoding]) {
46 // encoding == gzip || deflate
47 zlib[encoding](context.content, function(err, ziped) {
48 context.header['content-encoding'] = encoding;
49 context.header['content-length'] = ziped.length;
50
51 response.writeHead(context.status, context.header);
52 response.write(ziped);
53 context.end();
54 });
55 return;
56 }
57 }
58
59 if (context.content) {
60 context.header['content-length'] = context.content.length;
61 }
62 response.removeHeader('Transfer-Encoding');
63 response.writeHead(context.status, context.header);
64 context.content && response.write(context.content);
65 context.end();
66 }
67 };
68};
69
70
71exports.addRequestHeader = require('./handlers/add-request-header');
72exports.listDirectory = require('./handlers/list-directory');
73exports.file = require('./handlers/file');
74exports.home = require('./handlers/home');
75
76/**
77 * 设置content-type头
78 *
79 * @param {string=} contentType contentType
80 * @return {Function} .
81 */
82exports.contentType = function (contentType) {
83 return function (context) {
84 if (contentType) {
85 context.header['content-type'] = contentType;
86 }
87 };
88};
89
90/**
91 * 设置头
92 *
93 * @param {Object} header response头
94 * @return {Function} .
95 */
96exports.header = function (header) {
97 return function (context) {
98 context.header = require('./util/mix')(context.header, header);
99 };
100};
101
102/**
103 * 输出json
104 *
105 * @param {JSON} data json数据
106 * @return {Function} .
107 */
108exports.json = function (data) {
109 return function (context) {
110 context.header['content-type'] = mimeType.json;
111 if (data) {
112 context.content = JSON.stringify(data);
113 }
114 };
115};
116
117/**
118 * 输出jsonp
119 *
120 * @param {JSON} data json数据
121 * @param {string} callbackKey 回调函数的参数名
122 * @return {Function} .
123 */
124exports.jsonp = function (data, callbackKey) {
125 callbackKey = callbackKey || 'callback';
126
127 return function (context) {
128 var qs = require('querystring');
129 var query = qs.parse(context.request.search);
130
131 context.header['content-type'] = mimeType.js;
132 var fnName = query[callbackKey];
133 var content = data ? JSON.stringify(data) : context.content;
134 context.content = fnName + '(' + content + ');';
135 };
136};
137
138/**
139 * 输出请求信息
140 *
141 * @return {Function} .
142 */
143exports.dumpRequest = function() {
144 return function (context) {
145 var request = context.request;
146 var result = {
147 url: request.url,
148 method: request.method,
149 httpVersion: request.httpVersion,
150 protocol: request.protocol,
151 host: request.host,
152 auth: request.auth,
153 hostname: request.hostname,
154 port: request.port,
155 search: request.search,
156 hash: request.hash,
157 headers: request.headers,
158 query: request.query,
159 body: request.bodyBuffer.toString('utf8')
160 };
161
162 context.header['content-type'] = mimeType.json;
163 context.content = JSON.stringify(result, null, ' ');
164 };
165};
166
167/**
168 * 推迟输出
169 *
170 * @param {number} time 推迟输出时间,单位ms
171 * @return {Function} .
172 */
173exports.delay = function (time) {
174 return function (context) {
175 context.stop();
176 setTimeout(
177 function() {
178 context.start();
179 },
180 time
181 );
182 };
183};
184
185/**
186 * 输出内容
187 *
188 * @param {string} content 要输出的内容
189 * @return {Function} .
190 */
191exports.content = function (content) {
192 return function (context) {
193 context.content = content;
194 };
195};
196
197/**
198 * 输出重定向
199 *
200 * @param {string} location 重定向地址
201 * @param {boolean} permanent 是否永久重定向
202 * @return {Function} .
203 */
204exports.redirect = function (location, permanent) {
205 return function (context) {
206 context.status = permanent ? 301 : 302;
207 context.header.location = location;
208 };
209};
210
211/**
212 * 输出空内容
213 *
214 * @return {Function} .
215 */
216exports.empty = function () {
217 return exports.content('');
218};
219
220exports.php = require('./handlers/php');
221
222exports.less = require('./handlers/less');
223exports.autoless = require('./handlers/autoless');
224
225exports.coffee = require('./handlers/coffee');
226exports.autocoffee = require('./handlers/autocoffee');
227
228exports.proxyNoneExists = require('./handlers/proxy-none-exists');
229exports.proxy = require('./handlers/proxy');
230
231exports.html2js = require('./handlers/html2js');
232
233exports.autocss = require('./handlers/autocss');
234
235exports.stylus = require('./handlers/stylus');
236exports.autostylus = require('./handlers/autostylus');
237
238exports.livereload = require('./handlers/livereload');
239
240exports.markdown = require('./handlers/markdown');
241
242exports.babel = require('./handlers/babel');