You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
127 lines
2.5 KiB
127 lines
2.5 KiB
/** |
|
* @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;
|
|
|