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.'
28 printf '%s: %s\r\n' "$_kw" "$*"
34 printf '%s\r\n' "Status: $1 $2"
35 printf '%s\r\n' "Expires: Fri, 01 Jan 1980 00:00:00 GMT"
36 printf '%s\r\n' "Pragma: no-cache"
37 printf '%s\r\n' "Cache-Control: no-cache,max-age=0,must-revalidate"
38 [ -z "$3" ] ||
printf '%s\r\n' "$3"
39 printf '%s\r\n' "Content-Type: $_ct"
45 errorhdrsct
'text/plain' "$@"
50 while [ $# -gt 0 ]; do
58 errorhdrs
405 "Method Not Allowed" "Allow: GET"
60 msglines
"Method Not Allowed"
69 errorhdrs
403 Forbidden
80 errorhdrs
404 "Not Found"
89 # Snapshots are too expensive to allow HEAD
90 [ "$REQUEST_METHOD" = "GET" ] || methodnotallowed
92 # The project must be valid
93 suffix
="${PATH_INFO#*.git/}"
94 project
="${PATH_INFO%/"$suffix"}"
95 project
="${project#/}"
96 [ -n "$project" ] || forbidden
97 case "$suffix" in snapshot|snapshot
/*) :;; *) forbidden
; esac
98 suffix
="${suffix#snapshot}"
101 # Perform some basic sanity checking
102 if [ -z "$suffix" ]; then
103 # Must have an "h=" argument
104 case "&$QUERY_STRING&" in *[\
&\
;]"h="[!\
&\
;]*) :;; *) forbidden
; esac
106 case "$suffix" in [!A-Za-z0-9_
]*) forbidden
; esac
107 case "/$project/" in *"/../"*|
*"/./"*|
*"/_"*|
*"//"*) forbidden
; esac
108 is_git_dir
"$cfg_reporoot/$project" || notfound
110 # Give the 'bots indigestion
113 # Attempt to trigger a SIGPIPE if the connection has already been closed
114 hdrout
"X-Project" "${project%.git}"
116 hdrout
"X-Snapshot" "${suffix:-$QUERY_STRING}"
120 projname
="${project%.git}"
121 "$cfg_basedir/bin/throttle" ${throttle_on_connect_fail:+-t} -c snapshot \
122 -d "$projname" -m "$throttle_msg" "$cfg_cgiroot/gitweb.cgi"