62 lines
1.7 KiB
JavaScript
62 lines
1.7 KiB
JavaScript
// Copyright 2012 Mark Cavage, Inc. All rights reserved.
|
|
|
|
'use strict';
|
|
|
|
var assert = require('assert-plus');
|
|
|
|
///--- API
|
|
|
|
/**
|
|
* This basically exists for `curl`. `curl` on `HEAD` requests usually
|
|
* just sits there and hangs, unless you explicitly set
|
|
* Connection:close. And in general, you probably want to set
|
|
* Connection: close to curl anyway.
|
|
*
|
|
* Also, because curl spits out an annoying message to stderr about
|
|
* remaining bytes if content-length is set, this plugin also drops
|
|
* the `content-length` header (some user agents handle it and want it,
|
|
* curl does not).
|
|
*
|
|
* To be slightly more generic, the options block takes a user
|
|
* agent regexp, however.
|
|
*
|
|
* @public
|
|
* @function userAgentConnection
|
|
* @param {Object} [options] - an options object
|
|
* @param {RegExp} [options.userAgentRegExp=/^curl.+/] - matching any
|
|
* user-agents applicable
|
|
* @returns {Function} Handler
|
|
*/
|
|
function userAgentConnection(options) {
|
|
var opts = options || {};
|
|
assert.optionalObject(opts, 'options');
|
|
assert.optionalObject(opts.userAgentRegExp, 'options.userAgentRegExp');
|
|
|
|
var re = opts.userAgentRegExp;
|
|
|
|
if (!re) {
|
|
re = /^curl.+/;
|
|
}
|
|
|
|
function handleUserAgent(req, res, next) {
|
|
var ua = req.headers['user-agent'];
|
|
|
|
if (ua && re.test(ua)) {
|
|
res.setHeader('Connection', 'close');
|
|
|
|
if (req.method === 'HEAD') {
|
|
res.once(
|
|
'header',
|
|
res.removeHeader.bind(res, 'content-length')
|
|
);
|
|
}
|
|
}
|
|
|
|
next();
|
|
}
|
|
|
|
return handleUserAgent;
|
|
}
|
|
|
|
module.exports = userAgentConnection;
|