"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Omar Polo <op@omarpolo.com>
Subject:
gotd.conf: adds time suffixes to timeouts
To:
gameoftrees@openbsd.org
Date:
Tue, 03 Jan 2023 10:48:01 +0100

Download raw body.

Thread
I had something like this lying around in a private parse.y, would it
be useful for gotd too?  It just allows for a slightly more nice
timeout definition, which is quite niche.

diff 40b85cca5d86ebef3a353efd464af989c3ebf18b 0428eb4f1414af686a05fa3569b6639a47880b53
commit - 40b85cca5d86ebef3a353efd464af989c3ebf18b
commit + 0428eb4f1414af686a05fa3569b6639a47880b53
blob - ba00f127e7a704c7c95a42f2210fd109af6de5a3
blob + a45eb65170386548a9b8a2b7812f7309eebdc6f6
--- gotd/gotd.conf.5
+++ gotd/gotd.conf.5
@@ -55,7 +55,19 @@ The default timeout is 3600 seconds (1 hour).
 If this timeout is exceeded while a Git protocol request is being processed,
 the request will be aborted and the connection will be terminated.
 .Pp
-The default timeout is 3600 seconds (1 hour).
+The timeout value may also have a suffix indicating its unit of measure.
+Supported suffixes are:
+.Pp
+.Bl -tag -compact -width tenletters
+.It Ar s No or Ar S
+seconds
+.It Ar m No or Ar M
+minutes
+.It Ar h No or Ar H
+hours
+.El
+.Pp
+The default timeout is 1h (3600 seconds, one hour).
 This should only be changed if legitimate requests are exceeding the default
 timeout for some reason, such as the server spending an extraordinary
 amount of time generating a pack file.
@@ -205,7 +217,7 @@ connection request timeout 7200  # 2 hours
 }
 
 # Use a larger request timeout value:
-connection request timeout 7200  # 2 hours
+connection request timeout 2h
 
 # Some users are granted a higher concurrent connection limit:
 connection {
blob - 580f43381ccf163eac2c738800e7efd25c7562e4
blob + a19acba378f3c3be18670a3ec12ad2b20ee61fdf
--- gotd/parse.y
+++ gotd/parse.y
@@ -147,6 +147,57 @@ timeout		: NUMBER {
 			$$.tv_sec = $1;
 			$$.tv_usec = 0;
 		}
+		| STRING {
+			const char	*errstr;
+			const char	*type = "seconds";
+			size_t		 len;
+			int		 mul = 1;
+
+			if (*$1 == '\0') {
+				yyerror("invalid number of seconds: %s", $1);
+				free($1);
+				YYERROR;
+			}
+
+			len = strlen($1);
+			switch ($1[len - 1]) {
+			case 'S':
+			case 's':
+				$1[len - 1] = '\0';
+				break;
+			case 'M':
+			case 'm':
+				type = "minutes";
+				mul = 60;
+				$1[len - 1] = '\0';
+				break;
+			case 'H':
+			case 'h':
+				type = "hours";
+				mul = 60 * 60;
+				$1[len - 1] = '\0';
+				break;
+			}
+
+			$$.tv_usec = 0;
+			$$.tv_sec = strtonum($1, 0, INT_MAX, &errstr);
+			if (errstr) {
+				yyerror("number of %s is %s: %s", type,
+				    errstr, $1);
+				free($1);
+				YYERROR;
+			}
+
+			if ($$.tv_sec > INT_MAX / mul) {
+				yyerror("number of %s is too too large: %s",
+				    type, $1);
+				free($1);
+				YYERROR;
+			}
+
+			$$.tv_sec *= mul;
+			free($1);
+		}
 		;
 
 main		: UNIX_SOCKET STRING {