3 # snapshot.cgi -- throttle snapshot requests
4 # Copyright (C) 2015 Kyle J. McKay. All rights reserved.
5 # License GPLv2+: GNU GPL version 2 or later.
6 # www.gnu.org/licenses/gpl-2.0.html
7 # This is free software: you are free to change and redistribute it.
8 # There is NO WARRANTY, to the extent permitted by law.
14 # Set to non-empty to throttle if the initial throttle service connect fails
15 throttle_on_connect_fail
=
17 # Supplemental message to be included in the throttle result
19 'Ravenous roving robots are probably greedily chowing down on our services
22 We are valiantly trying to fight them off to improve service availability.'
27 printf '%s\r\n' "Status: $1 $2"
28 printf '%s\r\n' "Expires: Fri, 01 Jan 1980 00:00:00 GMT"
29 printf '%s\r\n' "Pragma: no-cache"
30 printf '%s\r\n' "Cache-Control: no-cache,max-age=0,must-revalidate"
31 [ -z "$3" ] ||
printf '%s\r\n' "$3"
32 printf '%s\r\n' "Content-Type: $_ct"
38 errorhdrsct
'text/plain' "$@"
43 while [ $# -gt 0 ]; do
51 errorhdrs
405 "Method Not Allowed" "Allow: GET"
53 msglines
"Method Not Allowed"
62 errorhdrs
403 Forbidden
73 errorhdrs
404 "Not Found"
82 # Snapshots are too expensive to allow HEAD
83 [ "$REQUEST_METHOD" = "GET" ] || methodnotallowed
85 # The project must be valid
86 suffix
="${PATH_INFO#*.git/}"
87 project
="${PATH_INFO%/$suffix}"
88 project
="${project#/}"
89 [ -n "$project" ] || forbidden
90 case "$suffix" in snapshot|snapshot
/*) :;; *) forbidden
; esac
91 suffix
="${suffix#snapshot}"
94 # Perform some basic sanity checking
95 if [ -z "$suffix" ]; then
96 # Must have an "h=" argument
97 case "&$QUERY_STRING&" in *[\
&\
;]"h="[!\
&\
;]*) :;; *) forbidden
; esac
99 case "$suffix" in [!A-Za-z0-9_
]*) forbidden
; esac
100 case "/$project/" in *"/../"*|
*"/./"*|
*"/_"*|
*"//"*) forbidden
; esac
101 is_git_dir
"$cfg_reporoot/$project" || notfound
104 projname
="${project%.git}"
105 "$cfg_basedir/bin/throttle" ${throttle_on_connect_fail:+-t} -c snapshot \
106 -d "$projname" -m "$throttle_msg" "$cfg_cgiroot/gitweb.cgi"