-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
88 lines (72 loc) · 2.06 KB
/
Copy pathindex.js
File metadata and controls
88 lines (72 loc) · 2.06 KB
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
'use strict'
/**
* Module dependencies.
*/
const debug = require('debug')('koa-static')
const { resolve } = require('path')
const assert = require('assert')
const send = require('koa-send')
/**
* Expose `serve()`.
*/
module.exports = serve
/**
* Serve static files from `root`.
*
* @param {String} root
* @param {Object} [opts]
* @return {Function}
* @api public
*/
function serve (root, opts) {
function checkOutFacility(ctx){
if (!opts.facility) {
return true;
}
let userAgent = ctx.request.header['user-agent'].toLowerCase();
let pat_phone = /ipad|iphone os|ipod|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/;
let isMobile = pat_phone.test(userAgent);
const isMobileFacility = opts.facility === 'md';
const isPCFacility = opts.facility === 'pc';
const shouldSendData = (isMobileFacility && isMobile) || (isPCFacility && !isMobile);
return shouldSendData;
}
opts = Object.assign({}, opts)
assert(root, 'root directory is required to serve files')
// options
debug('static "%s" %j', root, opts)
opts.root = resolve(root)
if (opts.index !== false) opts.index = opts.index || 'index.html'
if (!opts.defer) {
return async function serve (ctx, next) {
let done = false
if (ctx.method === 'HEAD' || ctx.method === 'GET') {
try {
const shouldSendData = checkOutFacility(ctx);
done = shouldSendData ? await send(ctx, ctx.path, opts) : false;
} catch (err) {
if (err.status !== 404) {
throw err
}
}
}
if (!done) {
await next()
}
}
}
return async function serve (ctx, next) {
await next()
if (ctx.method !== 'HEAD' && ctx.method !== 'GET') return
// response is already handled
if (ctx.body != null || ctx.status !== 404) return // eslint-disable-line
try {
const shouldSendData = checkOutFacility(ctx);
return shouldSendData ? await send(ctx, ctx.path, opts) : false;
} catch (err) {
if (err.status !== 404) {
throw err
}
}
}
}