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;
 |