favicon-server/api/router.js

117 lines
2.9 KiB
JavaScript
Raw Permalink Normal View History

2019-02-13 08:49:10 +00:00
const router = require('express').Router();
const grabber = require('./grabber');
const isDomainName = require('is-domain-name');
const normalizeUrl = require('normalize-url');
/**
* JSON in a pretty way
*/
router.all('/*', (req, res, next) => {
const indent = req.query.pretty === 'true' ? 2 : 0;
req.app.set('json spaces', indent);
return next();
});
router.param('domain', (req, res, next, domain) => {
const isCyrillic = /[а-я]+/i.test(domain);
if (isCyrillic || isDomainName(domain)) {
req.domain = domain;
return next();
} else {
return res.status(422).jsonp({
error: 'Invalid domain name.',
});
}
});
router.get('/grab/geticon', (req, res, next) => {
const options = {
normalizeUrl: req.query['normalize-url'] === void 0 ? true : req.query['normalize-url'] === 'true',
};
let url = req.query['url'] || ''
if (url.length === 0) {
return res.status(400).jsonp({
error: 'Unresolved domain name.',
});
}
url = decodeURIComponent(url)
url = normalizeUrl(url, {stripWWW: false})
grabber.allurl(url, options, (err, data) => {
if (err) {
switch (err.code) {
case 'ENOTFOUND':
return res.status(400).jsonp({
error: 'Unresolved domain name.',
});
case 'ETIMEDOUT':
case 'ESOCKETTIMEDOUT':
return res.status(400).jsonp({
error: 'The connection to a server of the domain timed out.',
});
case 'EINVAL':
return res.status(422).jsonp({
error: 'Invalid domain name.',
});
default:
return next(err);
}
}
res.status(200).jsonp(data);
});
});
router.get('/grab/:domain', (req, res, next) => {
const options = {
normalizeUrl: req.query['normalize-url'] === void 0 ? true : req.query['normalize-url'] === 'true',
};
grabber.default(req.domain, options, (err, data) => {
if (err) {
switch (err.code) {
case 'ENOTFOUND':
return res.status(400).jsonp({
error: 'Unresolved domain name.',
});
case 'ETIMEDOUT':
case 'ESOCKETTIMEDOUT':
return res.status(400).jsonp({
error: 'The connection to a server of the domain timed out.',
});
case 'EINVAL':
return res.status(422).jsonp({
error: 'Invalid domain name.',
});
default:
return next(err);
}
}
res.status(200).jsonp(data);
});
});
router.get('/status', (req, res) => {
res.status(200).jsonp({
status: 'OK',
});
});
router.use((req, res) => {
res.status(404).jsonp({
error: `Unknown API endpoint "${req.method} ${req.baseUrl}${req.url}".`,
});
});
router.use((err, req, res, next) => {
/* eslint no-unused-vars: off */
console.error(err);
res.status(500).jsonp({
error: 'General API error.',
});
});
module.exports = router;