128 lines
2.5 KiB
JavaScript
128 lines
2.5 KiB
JavaScript
|
/**
|
||
|
* @param {string} value
|
||
|
* @returns {RegExp}
|
||
|
* */
|
||
|
|
||
|
/**
|
||
|
* @param {RegExp | string } re
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
function source(re) {
|
||
|
if (!re) return null;
|
||
|
if (typeof re === "string") return re;
|
||
|
|
||
|
return re.source;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {...(RegExp | string) } args
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
function concat(...args) {
|
||
|
const joined = args.map((x) => source(x)).join("");
|
||
|
return joined;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Any of the passed expresssions may match
|
||
|
*
|
||
|
* Creates a huge this | this | that | that match
|
||
|
* @param {(RegExp | string)[] } args
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
function either(...args) {
|
||
|
const joined = '(' + args.map((x) => source(x)).join("|") + ")";
|
||
|
return joined;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
Language: Apache Access Log
|
||
|
Author: Oleg Efimov <efimovov@gmail.com>
|
||
|
Description: Apache/Nginx Access Logs
|
||
|
Website: https://httpd.apache.org/docs/2.4/logs.html#accesslog
|
||
|
Audit: 2020
|
||
|
*/
|
||
|
|
||
|
/** @type LanguageFn */
|
||
|
function accesslog(_hljs) {
|
||
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
||
|
const HTTP_VERBS = [
|
||
|
"GET",
|
||
|
"POST",
|
||
|
"HEAD",
|
||
|
"PUT",
|
||
|
"DELETE",
|
||
|
"CONNECT",
|
||
|
"OPTIONS",
|
||
|
"PATCH",
|
||
|
"TRACE"
|
||
|
];
|
||
|
return {
|
||
|
name: 'Apache Access Log',
|
||
|
contains: [
|
||
|
// IP
|
||
|
{
|
||
|
className: 'number',
|
||
|
begin: /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?\b/,
|
||
|
relevance: 5
|
||
|
},
|
||
|
// Other numbers
|
||
|
{
|
||
|
className: 'number',
|
||
|
begin: /\b\d+\b/,
|
||
|
relevance: 0
|
||
|
},
|
||
|
// Requests
|
||
|
{
|
||
|
className: 'string',
|
||
|
begin: concat(/"/, either(...HTTP_VERBS)),
|
||
|
end: /"/,
|
||
|
keywords: HTTP_VERBS,
|
||
|
illegal: /\n/,
|
||
|
relevance: 5,
|
||
|
contains: [
|
||
|
{
|
||
|
begin: /HTTP\/[12]\.\d'/,
|
||
|
relevance: 5
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
// Dates
|
||
|
{
|
||
|
className: 'string',
|
||
|
// dates must have a certain length, this prevents matching
|
||
|
// simple array accesses a[123] and [] and other common patterns
|
||
|
// found in other languages
|
||
|
begin: /\[\d[^\]\n]{8,}\]/,
|
||
|
illegal: /\n/,
|
||
|
relevance: 1
|
||
|
},
|
||
|
{
|
||
|
className: 'string',
|
||
|
begin: /\[/,
|
||
|
end: /\]/,
|
||
|
illegal: /\n/,
|
||
|
relevance: 0
|
||
|
},
|
||
|
// User agent / relevance boost
|
||
|
{
|
||
|
className: 'string',
|
||
|
begin: /"Mozilla\/\d\.\d \(/,
|
||
|
end: /"/,
|
||
|
illegal: /\n/,
|
||
|
relevance: 3
|
||
|
},
|
||
|
// Strings
|
||
|
{
|
||
|
className: 'string',
|
||
|
begin: /"/,
|
||
|
end: /"/,
|
||
|
illegal: /\n/,
|
||
|
relevance: 0
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = accesslog;
|