summaryrefslogtreecommitdiffstats
path: root/htgen
blob: 659576fff3b23ffae2609b67021748fd036c9ed3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#! /bin/sh
# vim:set fdm=marker:
set -euf

Server='htgen-plain/1.0'

## htgen --serve {{{
case $# in
  (1)
    case "$1" in
      (--serve)
        HTGEN_HOST="${HTGEN_HOST-0.0.0.0}"
        HTGEN_PORT="${HTGEN_PORT-42380}"
        TCPSERVER_OPTS='-c 423 -t 2 -D'
        echo "#### $Server $HTGEN_HOST:$HTGEN_PORT" >&2
        exec tcpserver $TCPSERVER_OPTS "$HTGEN_HOST" "$HTGEN_PORT" "$0"
        ## this should not happen...
        exit 23
    esac
esac
## }}}

## reply_404 {{{
reply_404() {
  cat<<EOF
HTTP/1.0 404 Not Found
Content-Type: text/plain; charset=UTF-8
Server: $Server
Connection: close
Content-Length: 0

EOF
}
## }}}

## date. {{{
#date=`date --rfc-3339=ns`
date="`date '+%Y-%m-%d %H:%M:%S'`"
cat>&2<<EOF

# ${TCPREMOTEHOST-}[$TCPREMOTEIP]:$TCPREMOTEPORT connected at $date over $PROTO
EOF
## }}}
## Parse Request-Line. {{{
read Request_Line
eval "$(echo "$Request_Line" | sed -rn '
  s^([a-zA-Z]+) ([a-zA-Z0-9?&+*/.-]+) HTTP/([0-9]+\.[0-9]+)\r$\
     Request_Line="&"\
     Method="\1"\
     Request_URI="\2"\
     HTTP_Version="\3"\
   p;t;i\
     Request_Line= # invalid request
')"
#echo "Request-Line: $Request_Line" >&2
# cat>&2<<EOF
# Request_Line='$Request_Line'
# Method='$Method'
# Request_URI='$Request_URI'
# HTTP_Version='$HTTP_Version'
# EOF

## debug
cat>&2<<EOF
$Method $Request_URI HTTP/$HTTP_Version
EOF
## }}}
## Parse HTTP-Headers. {{{
HTTP_Headers="`sed -rn 's/
$//;/^$/q;p'`"

## debug
echo "$HTTP_Headers" | sed -r 's/.*/^&$/' >&2

## Parse HTTP_Headers into Variables.
eval "$(
echo "$HTTP_Headers" | sed -r '
  ## TODO concatenate lines
  /^[^:]+-[^:]+:/s/^([a-zA-Z-]+):[[:space:]]*([^'\'']*)*$/\
    x=`echo \1 | tr - _`; \
    echo $x=\\'\'''\''\2'\''\\'\''\\;;\
    echo HTTP_Header_Variables=\\\${HTTP_Header_Variables+\\\$HTTP_Header_Variables:}$x\\;;\
  /;t
  s/^([a-zA-Z]+):[[:space:]]*([^'\'']*)*$/\
    echo \1=\\'\'''\''\2'\''\\'\''\\;;\
    echo HTTP_Header_Variables=\\\${HTTP_Header_Variables+\\\$HTTP_Header_Variables:}\1\\;;\
  /;t
  s/^.*/# &/
  '| sh)" >&2

echo >&2
## }}}

reply_404
exit