| |
| |
| |
| |
| |
|
|
|
|
| 'use strict';
|
|
|
| |
| |
| |
|
|
|
|
| var { METHODS } = require('node:http');
|
| var contentType = require('content-type');
|
| var etag = require('etag');
|
| var mime = require('mime-types')
|
| var proxyaddr = require('proxy-addr');
|
| var qs = require('qs');
|
| var querystring = require('node:querystring');
|
| const { Buffer } = require('node:buffer');
|
|
|
|
|
| |
| |
| |
|
|
| exports.methods = METHODS.map((method) => method.toLowerCase());
|
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.etag = createETagGenerator({ weak: false })
|
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.wetag = createETagGenerator({ weak: true })
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.normalizeType = function(type){
|
| return ~type.indexOf('/')
|
| ? acceptParams(type)
|
| : { value: (mime.lookup(type) || 'application/octet-stream'), params: {} }
|
| };
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.normalizeTypes = function(types) {
|
| return types.map(exports.normalizeType);
|
| };
|
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| function acceptParams (str) {
|
| var length = str.length;
|
| var colonIndex = str.indexOf(';');
|
| var index = colonIndex === -1 ? length : colonIndex;
|
| var ret = { value: str.slice(0, index).trim(), quality: 1, params: {} };
|
|
|
| while (index < length) {
|
| var splitIndex = str.indexOf('=', index);
|
| if (splitIndex === -1) break;
|
|
|
| var colonIndex = str.indexOf(';', index);
|
| var endIndex = colonIndex === -1 ? length : colonIndex;
|
|
|
| if (splitIndex > endIndex) {
|
| index = str.lastIndexOf(';', splitIndex - 1) + 1;
|
| continue;
|
| }
|
|
|
| var key = str.slice(index, splitIndex).trim();
|
| var value = str.slice(splitIndex + 1, endIndex).trim();
|
|
|
| if (key === 'q') {
|
| ret.quality = parseFloat(value);
|
| } else {
|
| ret.params[key] = value;
|
| }
|
|
|
| index = endIndex + 1;
|
| }
|
|
|
| return ret;
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.compileETag = function(val) {
|
| var fn;
|
|
|
| if (typeof val === 'function') {
|
| return val;
|
| }
|
|
|
| switch (val) {
|
| case true:
|
| case 'weak':
|
| fn = exports.wetag;
|
| break;
|
| case false:
|
| break;
|
| case 'strong':
|
| fn = exports.etag;
|
| break;
|
| default:
|
| throw new TypeError('unknown value for etag function: ' + val);
|
| }
|
|
|
| return fn;
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.compileQueryParser = function compileQueryParser(val) {
|
| var fn;
|
|
|
| if (typeof val === 'function') {
|
| return val;
|
| }
|
|
|
| switch (val) {
|
| case true:
|
| case 'simple':
|
| fn = querystring.parse;
|
| break;
|
| case false:
|
| break;
|
| case 'extended':
|
| fn = parseExtendedQueryString;
|
| break;
|
| default:
|
| throw new TypeError('unknown value for query parser function: ' + val);
|
| }
|
|
|
| return fn;
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.compileTrust = function(val) {
|
| if (typeof val === 'function') return val;
|
|
|
| if (val === true) {
|
|
|
| return function(){ return true };
|
| }
|
|
|
| if (typeof val === 'number') {
|
|
|
| return function(a, i){ return i < val };
|
| }
|
|
|
| if (typeof val === 'string') {
|
|
|
| val = val.split(',')
|
| .map(function (v) { return v.trim() })
|
| }
|
|
|
| return proxyaddr.compile(val || []);
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| exports.setCharset = function setCharset(type, charset) {
|
| if (!type || !charset) {
|
| return type;
|
| }
|
|
|
|
|
| var parsed = contentType.parse(type);
|
|
|
|
|
| parsed.parameters.charset = charset;
|
|
|
|
|
| return contentType.format(parsed);
|
| };
|
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| function createETagGenerator (options) {
|
| return function generateETag (body, encoding) {
|
| var buf = !Buffer.isBuffer(body)
|
| ? Buffer.from(body, encoding)
|
| : body
|
|
|
| return etag(buf, options)
|
| }
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| function parseExtendedQueryString(str) {
|
| return qs.parse(str, {
|
| allowPrototypes: true
|
| });
|
| }
|
|
|