1 | /**
|
---|
2 | * @param {string} value
|
---|
3 | * @returns {RegExp}
|
---|
4 | * */
|
---|
5 |
|
---|
6 | /**
|
---|
7 | * @param {RegExp | string } re
|
---|
8 | * @returns {string}
|
---|
9 | */
|
---|
10 | function source(re) {
|
---|
11 | if (!re) return null;
|
---|
12 | if (typeof re === "string") return re;
|
---|
13 |
|
---|
14 | return re.source;
|
---|
15 | }
|
---|
16 |
|
---|
17 | /**
|
---|
18 | * @param {...(RegExp | string) } args
|
---|
19 | * @returns {string}
|
---|
20 | */
|
---|
21 | function concat(...args) {
|
---|
22 | const joined = args.map((x) => source(x)).join("");
|
---|
23 | return joined;
|
---|
24 | }
|
---|
25 |
|
---|
26 | /**
|
---|
27 | * Any of the passed expresssions may match
|
---|
28 | *
|
---|
29 | * Creates a huge this | this | that | that match
|
---|
30 | * @param {(RegExp | string)[] } args
|
---|
31 | * @returns {string}
|
---|
32 | */
|
---|
33 | function either(...args) {
|
---|
34 | const joined = '(' + args.map((x) => source(x)).join("|") + ")";
|
---|
35 | return joined;
|
---|
36 | }
|
---|
37 |
|
---|
38 | /*
|
---|
39 | Language: Apache Access Log
|
---|
40 | Author: Oleg Efimov <efimovov@gmail.com>
|
---|
41 | Description: Apache/Nginx Access Logs
|
---|
42 | Website: https://httpd.apache.org/docs/2.4/logs.html#accesslog
|
---|
43 | Audit: 2020
|
---|
44 | */
|
---|
45 |
|
---|
46 | /** @type LanguageFn */
|
---|
47 | function accesslog(_hljs) {
|
---|
48 | // https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
|
---|
49 | const HTTP_VERBS = [
|
---|
50 | "GET",
|
---|
51 | "POST",
|
---|
52 | "HEAD",
|
---|
53 | "PUT",
|
---|
54 | "DELETE",
|
---|
55 | "CONNECT",
|
---|
56 | "OPTIONS",
|
---|
57 | "PATCH",
|
---|
58 | "TRACE"
|
---|
59 | ];
|
---|
60 | return {
|
---|
61 | name: 'Apache Access Log',
|
---|
62 | contains: [
|
---|
63 | // IP
|
---|
64 | {
|
---|
65 | className: 'number',
|
---|
66 | begin: /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?\b/,
|
---|
67 | relevance: 5
|
---|
68 | },
|
---|
69 | // Other numbers
|
---|
70 | {
|
---|
71 | className: 'number',
|
---|
72 | begin: /\b\d+\b/,
|
---|
73 | relevance: 0
|
---|
74 | },
|
---|
75 | // Requests
|
---|
76 | {
|
---|
77 | className: 'string',
|
---|
78 | begin: concat(/"/, either(...HTTP_VERBS)),
|
---|
79 | end: /"/,
|
---|
80 | keywords: HTTP_VERBS,
|
---|
81 | illegal: /\n/,
|
---|
82 | relevance: 5,
|
---|
83 | contains: [
|
---|
84 | {
|
---|
85 | begin: /HTTP\/[12]\.\d'/,
|
---|
86 | relevance: 5
|
---|
87 | }
|
---|
88 | ]
|
---|
89 | },
|
---|
90 | // Dates
|
---|
91 | {
|
---|
92 | className: 'string',
|
---|
93 | // dates must have a certain length, this prevents matching
|
---|
94 | // simple array accesses a[123] and [] and other common patterns
|
---|
95 | // found in other languages
|
---|
96 | begin: /\[\d[^\]\n]{8,}\]/,
|
---|
97 | illegal: /\n/,
|
---|
98 | relevance: 1
|
---|
99 | },
|
---|
100 | {
|
---|
101 | className: 'string',
|
---|
102 | begin: /\[/,
|
---|
103 | end: /\]/,
|
---|
104 | illegal: /\n/,
|
---|
105 | relevance: 0
|
---|
106 | },
|
---|
107 | // User agent / relevance boost
|
---|
108 | {
|
---|
109 | className: 'string',
|
---|
110 | begin: /"Mozilla\/\d\.\d \(/,
|
---|
111 | end: /"/,
|
---|
112 | illegal: /\n/,
|
---|
113 | relevance: 3
|
---|
114 | },
|
---|
115 | // Strings
|
---|
116 | {
|
---|
117 | className: 'string',
|
---|
118 | begin: /"/,
|
---|
119 | end: /"/,
|
---|
120 | illegal: /\n/,
|
---|
121 | relevance: 0
|
---|
122 | }
|
---|
123 | ]
|
---|
124 | };
|
---|
125 | }
|
---|
126 |
|
---|
127 | module.exports = accesslog;
|
---|