Documentation Source Text

Hex Artifact Content
Login

Artifact a1daaeb745f7c9e770f780e46644a70300d788e46ecf58b58123cf7648dfbc83:


0000: 2f 2a 0a 2a 2a 20 41 20 73 6d 61 6c 6c 2c 20 73  /*.** A small, s
0010: 69 6d 70 6c 65 20 48 54 54 50 20 73 65 72 76 65  imple HTTP serve
0020: 72 2e 0a 2a 2a 0a 2a 2a 20 46 65 61 74 75 72 65  r..**.** Feature
0030: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4c  s:.**.**     * L
0040: 61 75 6e 63 68 65 64 20 66 72 6f 6d 20 69 6e 65  aunched from ine
0050: 74 64 2f 78 69 6e 65 74 64 2f 73 74 75 6e 6e 65  td/xinetd/stunne
0060: 6c 34 2c 20 6f 72 20 61 73 20 61 20 73 74 61 6e  l4, or as a stan
0070: 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65 72 0a 2a  d-alone server.*
0080: 2a 20 20 20 20 20 2a 20 4f 6e 65 20 70 72 6f 63  *     * One proc
0090: 65 73 73 20 70 65 72 20 72 65 71 75 65 73 74 0a  ess per request.
00a0: 2a 2a 20 20 20 20 20 2a 20 44 65 6c 69 76 65 72  **     * Deliver
00b0: 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20   static content 
00c0: 6f 72 20 72 75 6e 20 43 47 49 0a 2a 2a 20 20 20  or run CGI.**   
00d0: 20 20 2a 20 56 69 72 74 75 61 6c 20 73 69 74 65    * Virtual site
00e0: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 22  s based on the "
00f0: 48 6f 73 74 3a 22 20 70 72 6f 70 65 72 74 79 20  Host:" property 
0100: 6f 66 20 74 68 65 20 48 54 54 50 20 68 65 61 64  of the HTTP head
0110: 65 72 0a 2a 2a 20 20 20 20 20 2a 20 52 75 6e 73  er.**     * Runs
0120: 20 69 6e 20 61 20 63 68 72 6f 6f 74 20 6a 61 69   in a chroot jai
0130: 6c 0a 2a 2a 20 20 20 20 20 2a 20 55 6e 69 66 69  l.**     * Unifi
0140: 65 64 20 6c 6f 67 20 66 69 6c 65 20 69 6e 20 61  ed log file in a
0150: 20 43 53 56 20 66 6f 72 6d 61 74 0a 2a 2a 20 20   CSV format.**  
0160: 20 20 20 2a 20 53 6d 61 6c 6c 20 63 6f 64 65 20     * Small code 
0170: 62 61 73 65 20 28 74 68 69 73 20 31 20 66 69 6c  base (this 1 fil
0180: 65 29 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  e) to facilitate
0190: 20 73 65 63 75 72 69 74 79 20 61 75 64 69 74 69   security auditi
01a0: 6e 67 0a 2a 2a 20 20 20 20 20 2a 20 53 69 6d 70  ng.**     * Simp
01b0: 6c 65 20 73 65 74 75 70 20 2d 20 6e 6f 20 63 6f  le setup - no co
01c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65  nfiguration file
01d0: 73 20 74 6f 20 6d 65 73 73 20 77 69 74 68 2e 0a  s to mess with..
01e0: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ** .** This file
01f0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 73 6d   implements a sm
0200: 61 6c 6c 20 61 6e 64 20 73 69 6d 70 6c 65 20 62  all and simple b
0210: 75 74 20 73 65 63 75 72 65 20 61 6e 64 20 65 66  ut secure and ef
0220: 66 65 63 74 69 76 65 20 77 65 62 0a 2a 2a 20 73  fective web.** s
0230: 65 72 76 65 72 2e 20 20 54 68 65 72 65 20 61 72  erver.  There ar
0240: 65 20 6e 6f 20 66 72 69 6c 6c 73 2e 20 20 41 6e  e no frills.  An
0250: 79 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c  ything that coul
0260: 64 20 62 65 20 72 65 61 73 6f 6e 61 62 6c 79 0a  d be reasonably.
0270: 2a 2a 20 6f 6d 69 74 74 65 64 20 68 61 73 20 62  ** omitted has b
0280: 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 75 70  een..**.** Setup
0290: 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
02a0: 20 28 31 29 20 4c 61 75 6e 63 68 20 61 73 20 72   (1) Launch as r
02b0: 6f 6f 74 20 66 72 6f 6d 20 69 6e 65 74 64 20 6c  oot from inetd l
02c0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
02d0: 20 20 20 20 20 20 20 20 20 20 20 68 74 74 70 64             httpd
02e0: 20 2d 6c 6f 67 66 69 6c 65 20 6c 6f 67 66 69 6c   -logfile logfil
02f0: 65 20 2d 72 6f 6f 74 20 2f 68 6f 6d 65 2f 77 77  e -root /home/ww
0300: 77 20 2d 75 73 65 72 20 6e 6f 62 6f 64 79 0a 2a  w -user nobody.*
0310: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 49 74 20 77  *.**        It w
0320: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
0330: 79 20 63 68 72 6f 6f 74 20 74 6f 20 2f 68 6f 6d  y chroot to /hom
0340: 65 2f 77 77 77 20 61 6e 64 20 62 65 63 6f 6d 65  e/www and become
0350: 20 75 73 65 72 20 6e 6f 62 6f 64 79 2e 0a 2a 2a   user nobody..**
0360: 20 20 20 20 20 20 20 20 54 68 65 20 6c 6f 67 66          The logf
0370: 69 6c 65 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ile name should 
0380: 62 65 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74  be relative to t
0390: 68 65 20 63 68 72 6f 6f 74 20 6a 61 69 6c 2e 0a  he chroot jail..
03a0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 44 69 72  **.**    (2) Dir
03b0: 65 63 74 6f 72 69 65 73 20 6f 66 20 74 68 65 20  ectories of the 
03c0: 66 6f 72 6d 20 22 2a 2e 77 65 62 73 69 74 65 22  form "*.website"
03d0: 20 28 65 78 3a 20 77 77 77 5f 68 77 61 63 69 5f   (ex: www_hwaci_
03e0: 63 6f 6d 2e 77 65 62 73 69 74 65 29 0a 2a 2a 20  com.website).** 
03f0: 20 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 63         contain c
0400: 6f 6e 74 65 6e 74 2e 20 20 54 68 65 20 64 69 72  ontent.  The dir
0410: 65 63 74 6f 72 79 20 69 73 20 63 68 6f 73 65 6e  ectory is chosen
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 48 54   based on the HT
0430: 54 50 5f 48 4f 53 54 0a 2a 2a 20 20 20 20 20 20  TP_HOST.**      
0440: 20 20 72 65 71 75 65 73 74 20 68 65 61 64 65 72    request header
0450: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
0460: 6f 20 48 54 54 50 5f 48 4f 53 54 20 68 65 61 64  o HTTP_HOST head
0470: 65 72 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  er or if the.** 
0480: 20 20 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e         correspon
0490: 64 69 6e 67 20 68 6f 73 74 20 64 69 72 65 63 74  ding host direct
04a0: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ory does not exi
04b0: 73 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  st, then the.** 
04c0: 20 20 20 20 20 20 20 22 64 65 66 61 75 6c 74 2e         "default.
04d0: 77 65 62 73 69 74 65 22 20 69 73 20 75 73 65 64  website" is used
04e0: 2e 20 20 49 66 20 74 68 65 20 48 54 54 50 5f 48  .  If the HTTP_H
04f0: 4f 53 54 20 68 65 61 64 65 72 20 63 6f 6e 74 61  OST header conta
0500: 69 6e 73 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20  ins any.**      
0510: 20 20 63 68 61 72 61 74 65 72 73 20 6f 74 68 65    charaters othe
0520: 72 20 74 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d  r than [a-zA-Z0-
0530: 39 5f 2e 2c 2a 7e 2f 5d 20 74 68 65 6e 20 61 20  9_.,*~/] then a 
0540: 34 30 33 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  403 error is.** 
0550: 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 64         generated
0560: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 41  ..**.**    (3) A
0570: 6e 79 20 66 69 6c 65 20 6f 72 20 64 69 72 65 63  ny file or direc
0580: 74 6f 72 79 20 77 68 6f 73 65 20 6e 61 6d 65 20  tory whose name 
0590: 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20  begins with "." 
05a0: 6f 72 20 22 2d 22 20 69 73 20 69 67 6e 6f 72 65  or "-" is ignore
05b0: 64 2c 0a 2a 2a 20 20 20 20 20 20 20 20 65 78 63  d,.**        exc
05c0: 65 70 74 20 66 6f 72 20 2f 2e 77 65 6c 6c 2d 6b  ept for /.well-k
05d0: 6e 6f 77 6e 2f 20 61 74 20 74 68 65 20 74 6f 70  nown/ at the top
05e0: 2d 6c 65 76 65 6c 2e 20 20 54 68 65 20 65 78 63  -level.  The exc
05f0: 65 70 74 69 6f 6e 20 69 73 20 66 6f 72 0a 2a 2a  eption is for.**
0600: 20 20 20 20 20 20 20 20 52 46 43 2d 35 37 38 35          RFC-5785
0610: 20 74 6f 20 61 6c 6c 6f 77 20 6c 65 74 73 65 6e   to allow letsen
0620: 63 72 79 70 74 20 6f 72 20 63 65 72 74 62 6f 74  crypt or certbot
0630: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 54   to generate a T
0640: 53 4c 20 63 65 72 74 0a 2a 2a 20 20 20 20 20 20  SL cert.**      
0650: 20 20 75 73 69 6e 67 20 77 65 62 72 6f 6f 74 2e    using webroot.
0660: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 43 68  .**.**    (4) Ch
0670: 61 72 61 63 74 65 72 73 20 6f 74 68 65 72 20 74  aracters other t
0680: 68 61 6e 20 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d  han [0-9a-zA-Z,-
0690: 2e 2f 3a 5f 7e 5d 20 61 6e 64 20 61 6e 79 20 25  ./:_~] and any %
06a0: 48 48 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  HH characters.**
06b0: 20 20 20 20 20 20 20 20 65 73 63 61 70 65 73 20          escapes 
06c0: 69 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  in the filename 
06d0: 61 72 65 20 61 6c 6c 20 74 72 61 6e 73 6c 61 74  are all translat
06e0: 65 64 20 69 6e 74 6f 20 22 5f 22 2e 20 20 54 68  ed into "_".  Th
06f0: 69 73 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  is is.**        
0700: 61 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e 73  a defense agains
0710: 74 20 63 72 6f 73 73 2d 73 69 74 65 20 73 63 72  t cross-site scr
0720: 69 70 74 69 6e 67 20 61 74 74 61 63 6b 73 20 61  ipting attacks a
0730: 6e 64 20 6f 74 68 65 72 20 6d 69 73 63 68 69 65  nd other mischie
0740: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 35 29 20  f..**.**    (5) 
0750: 45 78 65 63 75 74 61 62 6c 65 20 66 69 6c 65 73  Executable files
0760: 20 61 72 65 20 72 75 6e 20 61 73 20 43 47 49 2e   are run as CGI.
0770: 20 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 6c 65    All other file
0780: 73 20 61 72 65 20 64 65 6c 69 76 65 72 65 64 0a  s are delivered.
0790: 2a 2a 20 20 20 20 20 20 20 20 61 73 20 69 73 2e  **        as is.
07a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 36 29 20 46 6f  .**.**    (6) Fo
07b0: 72 20 53 53 4c 20 73 75 70 70 6f 72 74 20 75 73  r SSL support us
07c0: 65 20 73 74 75 6e 6e 65 6c 20 61 6e 64 20 61 64  e stunnel and ad
07d0: 64 20 74 68 65 20 2d 68 74 74 70 73 20 31 20 6f  d the -https 1 o
07e0: 70 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ption on the.** 
07f0: 20 20 20 20 20 20 20 68 74 74 70 64 20 63 6f 6d         httpd com
0800: 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a  mand-line..**.**
0810: 20 20 20 20 28 37 29 20 49 66 20 61 20 66 69 6c      (7) If a fil
0820: 65 20 6e 61 6d 65 64 20 22 2d 61 75 74 68 22 20  e named "-auth" 
0830: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 73 61  exists in the sa
0840: 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20  me directory as 
0850: 74 68 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 20  the file to.**  
0860: 20 20 20 20 20 20 62 65 20 72 75 6e 20 61 73 20        be run as 
0870: 43 47 49 20 6f 72 20 74 6f 20 62 65 20 64 65 6c  CGI or to be del
0880: 69 76 65 72 65 64 2c 20 74 68 65 6e 20 69 74 20  ivered, then it 
0890: 63 6f 6e 74 61 69 6e 73 20 69 6e 66 6f 72 6d 61  contains informa
08a0: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 66  tion.**        f
08b0: 6f 72 20 48 54 54 50 20 42 61 73 69 63 20 61 75  or HTTP Basic au
08c0: 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20 53 65  thorization.  Se
08d0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 64 65  e file format de
08e0: 74 61 69 6c 73 20 62 65 6c 6f 77 2e 0a 2a 2a 0a  tails below..**.
08f0: 2a 2a 20 20 20 20 28 38 29 20 54 6f 20 72 75 6e  **    (8) To run
0900: 20 61 73 20 61 20 73 74 61 6e 64 2d 61 6c 6f 6e   as a stand-alon
0910: 65 20 73 65 72 76 65 72 2c 20 73 69 6d 70 6c 79  e server, simply
0920: 20 61 64 64 20 74 68 65 20 22 2d 70 6f 72 74 20   add the "-port 
0930: 4e 22 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 0a  N" command-line.
0940: 2a 2a 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e  **        option
0950: 20 74 6f 20 64 65 66 69 6e 65 20 77 68 69 63 68   to define which
0960: 20 54 43 50 20 70 6f 72 74 20 74 6f 20 6c 69 73   TCP port to lis
0970: 74 65 6e 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ten on..**.**   
0980: 20 28 39 29 20 46 6f 72 20 73 74 61 74 69 63 20   (9) For static 
0990: 63 6f 6e 74 65 6e 74 2c 20 74 68 65 20 6d 69 6d  content, the mim
09a0: 65 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69  etype is determi
09b0: 6e 65 64 20 62 79 20 74 68 65 20 66 69 6c 65 20  ned by the file 
09c0: 73 75 66 66 69 78 0a 2a 2a 20 20 20 20 20 20 20  suffix.**       
09d0: 20 75 73 69 6e 67 20 61 20 74 61 62 6c 65 20 62   using a table b
09e0: 75 69 6c 74 20 69 6e 74 6f 20 74 68 65 20 73 6f  uilt into the so
09f0: 75 72 63 65 20 63 6f 64 65 20 62 65 6c 6f 77 2e  urce code below.
0a00: 20 20 49 66 20 79 6f 75 20 68 61 76 65 0a 2a 2a    If you have.**
0a10: 20 20 20 20 20 20 20 20 75 6e 75 73 75 61 6c 20          unusual 
0a20: 63 6f 6e 74 65 6e 74 20 66 69 6c 65 73 2c 20 79  content files, y
0a30: 6f 75 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ou might need to
0a40: 20 65 78 74 65 6e 64 20 74 68 69 73 20 74 61 62   extend this tab
0a50: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e  le..**.** Comman
0a60: 64 2d 6c 69 6e 65 20 4f 70 74 69 6f 6e 73 3a 0a  d-line Options:.
0a70: 2a 2a 0a 2a 2a 20 20 2d 2d 72 6f 6f 74 20 44 49  **.**  --root DI
0a80: 52 20 20 20 20 20 20 20 44 65 66 69 6e 65 73 20  R       Defines 
0a90: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
0aa0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
0ab0: 76 61 72 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20  various.**      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 24 48 4f               $HO
0ad0: 53 54 2e 77 65 62 73 69 74 65 20 73 75 62 64 69  ST.website subdi
0ae0: 72 65 63 74 6f 72 69 65 73 2c 20 65 61 63 68 20  rectories, each 
0af0: 63 6f 6e 74 61 69 6e 69 6e 67 20 77 65 62 20 63  containing web c
0b00: 6f 6e 74 65 6e 74 20 0a 2a 2a 20 20 20 20 20 20  ontent .**      
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
0b20: 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 61   a single virtua
0b30: 6c 20 68 6f 73 74 2e 20 20 49 66 20 6c 61 75 6e  l host.  If laun
0b40: 63 68 65 64 20 61 73 20 72 6f 6f 74 20 61 6e 64  ched as root and
0b50: 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   if.**          
0b60: 20 20 20 20 20 20 20 20 20 22 2d 2d 75 73 65 72           "--user
0b70: 20 55 53 45 52 22 20 61 6c 73 6f 20 61 70 70 65   USER" also appe
0b80: 61 72 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ars on the comma
0b90: 6e 64 2d 6c 69 6e 65 20 61 6e 64 20 69 66 0a 2a  nd-line and if.*
0ba0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bb0: 20 20 20 20 22 2d 2d 6a 61 69 6c 20 30 22 20 69      "--jail 0" i
0bc0: 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  s omitted, then 
0bd0: 74 68 65 20 70 72 6f 63 65 73 73 20 72 75 6e 73  the process runs
0be0: 20 69 6e 20 61 20 63 68 72 6f 6f 74 0a 2a 2a 20   in a chroot.** 
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 6a 61 69 6c 20 72 6f 6f 74 65 64 20 61 74    jail rooted at
0c10: 20 74 68 69 73 20 64 69 72 65 63 74 6f 72 79 20   this directory 
0c20: 61 6e 64 20 75 6e 64 65 72 20 74 68 65 20 75 73  and under the us
0c30: 65 72 69 64 20 55 53 45 52 2e 0a 2a 2a 20 20 20  erid USER..**   
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 54 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 20 72  This option is r
0c60: 65 71 75 69 72 65 64 20 66 6f 72 20 78 69 6e 65  equired for xine
0c70: 74 64 20 6c 61 75 6e 63 68 20 62 75 74 20 64 65  td launch but de
0c80: 66 61 75 6c 74 73 0a 2a 2a 20 20 20 20 20 20 20  faults.**       
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 22              to "
0ca0: 2e 22 20 66 6f 72 20 61 20 73 74 61 6e 64 2d 61  ." for a stand-a
0cb0: 6c 6f 6e 65 20 77 65 62 20 73 65 72 76 65 72 2e  lone web server.
0cc0: 0a 2a 2a 0a 2a 2a 20 20 2d 2d 70 6f 72 74 20 4e  .**.**  --port N
0cd0: 20 20 20 20 20 20 20 20 20 52 75 6e 20 69 6e 20           Run in 
0ce0: 73 74 61 6e 64 61 6c 6f 6e 65 20 6d 6f 64 65 20  standalone mode 
0cf0: 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20 54 43 50  listening on TCP
0d00: 20 70 6f 72 74 20 4e 0a 2a 2a 0a 2a 2a 20 20 2d   port N.**.**  -
0d10: 2d 75 73 65 72 20 55 53 45 52 20 20 20 20 20 20  -user USER      
0d20: 44 65 66 69 6e 65 20 74 68 65 20 75 73 65 72 20  Define the user 
0d30: 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 65 20  under which the 
0d40: 70 72 6f 63 65 73 73 20 73 68 6f 75 6c 64 20 72  process should r
0d50: 75 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20  un if.**        
0d60: 20 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69             origi
0d70: 6e 61 6c 6c 79 20 6c 61 75 6e 63 68 65 64 20 61  nally launched a
0d80: 73 20 72 6f 6f 74 2e 20 20 54 68 69 73 20 70 72  s root.  This pr
0d90: 6f 63 65 73 73 20 77 69 6c 6c 20 72 65 66 75 73  ocess will refus
0da0: 65 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  e to.**         
0db0: 20 20 20 20 20 20 20 20 20 20 72 75 6e 20 61 73            run as
0dc0: 20 72 6f 6f 74 20 28 66 6f 72 20 73 65 63 75 72   root (for secur
0dd0: 69 74 79 29 2e 20 20 49 66 20 74 68 69 73 20 6f  ity).  If this o
0de0: 70 74 69 6f 6e 20 69 73 20 6f 6d 69 74 74 65 64  ption is omitted
0df0: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
0e00: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 70 72            the pr
0e10: 6f 63 65 73 73 20 69 73 20 6c 61 75 6e 63 68 65  ocess is launche
0e20: 64 20 61 73 20 72 6f 6f 74 2c 20 69 74 20 77 69  d as root, it wi
0e30: 6c 6c 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  ll abort without
0e40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0e50: 20 20 20 20 20 20 70 72 6f 63 65 73 73 69 6e 67        processing
0e60: 20 61 6e 79 20 48 54 54 50 20 72 65 71 75 65 73   any HTTP reques
0e70: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6c 6f 67  ts..**.**  --log
0e80: 66 69 6c 65 20 46 49 4c 45 20 20 20 41 70 70 65  file FILE   Appe
0e90: 6e 64 20 61 20 73 69 6e 67 6c 65 2d 6c 69 6e 65  nd a single-line
0ea0: 2c 20 43 53 56 2d 66 6f 72 6d 61 74 2c 20 6c 6f  , CSV-format, lo
0eb0: 67 20 66 69 6c 65 20 65 6e 74 72 79 20 74 6f 20  g file entry to 
0ec0: 46 49 4c 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  FILE.**         
0ed0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 65 61            for ea
0ee0: 63 68 20 48 54 54 50 20 72 65 71 75 65 73 74 2e  ch HTTP request.
0ef0: 20 20 46 49 4c 45 20 73 68 6f 75 6c 64 20 62 65    FILE should be
0f00: 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
0f10: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0f20: 20 20 20 20 20 20 20 54 68 65 20 46 49 4c 45 20         The FILE 
0f30: 6e 61 6d 65 20 69 73 20 69 6e 74 65 72 70 72 65  name is interpre
0f40: 74 65 64 20 69 6e 73 69 64 65 20 74 68 65 20 63  ted inside the c
0f50: 68 72 6f 6f 74 20 6a 61 69 6c 2e 20 20 54 68 65  hroot jail.  The
0f60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0f70: 20 20 20 20 20 20 46 49 4c 45 20 6e 61 6d 65 20        FILE name 
0f80: 69 73 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e  is expanded usin
0f90: 67 20 73 74 72 66 74 69 6d 65 28 29 20 69 66 20  g strftime() if 
0fa0: 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 20  it contains.**  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 27 25   at least one '%
0fd0: 27 20 61 6e 64 20 69 73 20 6e 6f 74 20 74 6f 6f  ' and is not too
0fe0: 20 6c 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d   long..**.**  --
0ff0: 68 74 74 70 73 20 20 20 20 20 20 20 20 20 20 49  https          I
1000: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 69 6e  ndicates that in
1010: 70 75 74 20 69 73 20 63 6f 6d 69 6e 67 20 6f 76  put is coming ov
1020: 65 72 20 53 53 4c 20 61 6e 64 20 69 73 20 62 65  er SSL and is be
1030: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1040: 20 20 20 20 20 20 20 20 20 64 65 63 6f 64 65 64           decoded
1050: 20 75 70 73 74 72 65 61 6d 2c 20 70 65 72 68 61   upstream, perha
1060: 70 73 20 62 79 20 73 74 75 6e 6e 65 6c 2e 20 20  ps by stunnel.  
1070: 28 54 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a  (This program.**
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 20 20 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61     only understa
10a0: 6e 64 73 20 70 6c 61 69 6e 74 65 78 74 2e 29 0a  nds plaintext.).
10b0: 2a 2a 0a 2a 2a 20 20 2d 2d 66 61 6d 69 6c 79 20  **.**  --family 
10c0: 69 70 76 34 20 20 20 20 4f 6e 6c 79 20 61 63 63  ipv4    Only acc
10d0: 65 70 74 20 69 6e 70 75 74 20 66 72 6f 6d 20 49  ept input from I
10e0: 50 56 34 20 6f 72 20 49 50 56 36 2c 20 72 65 73  PV4 or IPV6, res
10f0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 20 2d  pectively..**  -
1100: 2d 66 61 6d 69 6c 79 20 69 70 76 36 20 20 20 20  -family ipv6    
1110: 54 68 65 73 65 20 6f 70 74 69 6f 6e 73 20 61 72  These options ar
1120: 65 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66 75  e only meaningfu
1130: 6c 20 69 66 20 61 6c 74 68 74 74 70 64 20 69 73  l if althttpd is
1140: 20 72 75 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20   run.**         
1150: 20 20 20 20 20 20 20 20 20 20 61 73 20 61 20 73            as a s
1160: 74 61 6e 64 2d 61 6c 6f 6e 65 20 73 65 72 76 65  tand-alone serve
1170: 72 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6a 61 69 6c  r..**.**  --jail
1180: 20 42 4f 4f 4c 45 41 4e 20 20 20 49 6e 64 69 63   BOOLEAN   Indic
1190: 61 74 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ates whether or 
11a0: 6e 6f 74 20 74 6f 20 66 6f 72 6d 20 61 20 63 68  not to form a ch
11b0: 72 6f 6f 74 20 6a 61 69 6c 20 69 66 20 0a 2a 2a  root jail if .**
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 20 69 6e 69 74 69 61 6c 6c 79 20 72 75 6e     initially run
11e0: 20 61 73 20 72 6f 6f 74 2e 20 20 54 68 65 20 64   as root.  The d
11f0: 65 66 61 75 6c 74 20 69 73 20 74 72 75 65 2c 20  efault is true, 
1200: 73 6f 20 74 68 65 20 6f 6e 6c 79 0a 2a 2a 20 20  so the only.**  
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 75 73 65 66 75 6c 20 76 61 72 69 61 6e 74 20   useful variant 
1230: 6f 66 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69  of this option i
1240: 73 20 22 2d 2d 6a 61 69 6c 20 30 22 20 77 68 69  s "--jail 0" whi
1250: 63 68 20 70 72 65 76 65 6e 74 73 0a 2a 2a 20 20  ch prevents.**  
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 74 68 65 20 66 6f 72 6d 61 74 69 6f 6e 20 6f   the formation o
1280: 66 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69  f the chroot jai
1290: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 6d 61 78 2d  l..**.**  --max-
12a0: 61 67 65 20 53 45 43 20 20 20 20 54 68 65 20 76  age SEC    The v
12b0: 61 6c 75 65 20 66 6f 72 20 22 43 61 63 68 65 2d  alue for "Cache-
12c0: 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65  Control: max-age
12d0: 3d 25 64 22 2e 20 20 44 65 66 61 75 6c 74 73 20  =%d".  Defaults 
12e0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
12f0: 20 20 20 20 20 20 20 20 31 32 30 20 73 65 63 6f          120 seco
1300: 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 20 2d 2d 64 65  nds..**.**  --de
1310: 62 75 67 20 20 20 20 20 20 20 20 20 20 44 69 73  bug          Dis
1320: 61 62 6c 65 73 20 69 6e 70 75 74 20 74 69 6d 65  ables input time
1330: 6f 75 74 73 2e 20 20 54 68 69 73 20 69 73 20 75  outs.  This is u
1340: 73 65 66 75 6c 20 66 6f 72 20 64 65 62 75 67 67  seful for debugg
1350: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1360: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 6e           when in
1370: 70 75 74 73 20 69 73 20 62 65 69 6e 67 20 74 79  puts is being ty
1380: 70 65 64 20 69 6e 20 6d 61 6e 75 61 6c 6c 79 2e  ped in manually.
1390: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 6d 61 6e 64 2d 6c  .**.** Command-l
13a0: 69 6e 65 20 6f 70 74 69 6f 6e 73 20 63 61 6e 20  ine options can 
13b0: 74 61 6b 65 20 65 69 74 68 65 72 20 6f 6e 65 20  take either one 
13c0: 6f 72 20 74 77 6f 20 69 6e 69 74 69 61 6c 20 22  or two initial "
13d0: 2d 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  -" characters..*
13e0: 2a 20 53 6f 20 22 2d 2d 64 65 62 75 67 22 20 61  * So "--debug" a
13f0: 6e 64 20 22 2d 64 65 62 75 67 22 20 6d 65 61 6e  nd "-debug" mean
1400: 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2c   the same thing,
1410: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a   for example..**
1420: 0a 2a 2a 0a 2a 2a 20 53 65 63 75 72 69 74 79 20  .**.** Security 
1430: 46 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20  Features:.**.** 
1440: 28 31 29 20 20 54 68 69 73 20 70 72 6f 67 72 61  (1)  This progra
1450: 6d 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  m automatically 
1460: 70 75 74 73 20 69 74 73 65 6c 66 20 69 6e 73 69  puts itself insi
1470: 64 65 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c  de a chroot jail
1480: 20 69 66 0a 2a 2a 20 20 20 20 20 20 69 74 20 63   if.**      it c
1490: 61 6e 20 61 6e 64 20 69 66 20 6e 6f 74 20 73 70  an and if not sp
14a0: 65 63 69 66 69 63 61 6c 6c 79 20 70 72 6f 68 69  ecifically prohi
14b0: 62 69 74 65 64 20 62 79 20 74 68 65 20 22 2d 2d  bited by the "--
14c0: 6a 61 69 6c 20 30 22 0a 2a 2a 20 20 20 20 20 20  jail 0".**      
14d0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
14e0: 69 6f 6e 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f  ion.  The root o
14f0: 66 20 74 68 65 20 6a 61 69 6c 20 69 73 20 74 68  f the jail is th
1500: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
1510: 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e  .**      contain
1520: 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 24 48  s the various $H
1530: 4f 53 54 2e 77 65 62 73 69 74 65 20 63 6f 6e 74  OST.website cont
1540: 65 6e 74 20 73 75 62 64 69 72 65 63 74 6f 72 69  ent subdirectori
1550: 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20 20 4e  es..**.** (2)  N
1560: 6f 20 69 6e 70 75 74 20 69 73 20 72 65 61 64 20  o input is read 
1570: 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
1580: 73 73 20 68 61 73 20 72 6f 6f 74 20 70 72 69 76  ss has root priv
1590: 69 6c 65 67 65 73 2e 20 20 52 6f 6f 74 0a 2a 2a  ileges.  Root.**
15a0: 20 20 20 20 20 20 70 72 69 76 69 6c 65 67 65 73        privileges
15b0: 20 61 72 65 20 64 72 6f 70 70 65 64 20 70 72 69   are dropped pri
15c0: 6f 72 20 74 6f 20 72 65 61 64 69 6e 67 20 61 6e  or to reading an
15d0: 79 20 69 6e 70 75 74 20 28 62 75 74 20 61 66 74  y input (but aft
15e0: 65 72 20 65 6e 74 65 72 69 6e 67 0a 2a 2a 20 20  er entering.**  
15f0: 20 20 20 20 74 68 65 20 63 68 72 6f 6f 74 20 6a      the chroot j
1600: 61 69 6c 2c 20 6f 66 20 63 6f 75 72 73 65 29 2e  ail, of course).
1610: 20 20 49 66 20 72 6f 6f 74 20 70 72 69 76 69 6c    If root privil
1620: 65 67 65 73 20 63 61 6e 6e 6f 74 20 62 65 20 64  eges cannot be d
1630: 72 6f 70 70 65 64 0a 2a 2a 20 20 20 20 20 20 28  ropped.**      (
1640: 66 6f 72 20 65 78 61 6d 70 6c 65 20 62 65 63 61  for example beca
1650: 75 73 65 20 74 68 65 20 2d 2d 75 73 65 72 20 63  use the --user c
1660: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
1670: 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 20 6f  on was omitted o
1680: 72 0a 2a 2a 20 20 20 20 20 20 62 65 63 61 75 73  r.**      becaus
1690: 65 20 74 68 65 20 75 73 65 72 20 73 70 65 63 69  e the user speci
16a0: 66 69 65 64 20 62 79 20 74 68 65 20 2d 2d 75 73  fied by the --us
16b0: 65 72 20 6f 70 74 69 6f 6e 20 64 6f 65 73 20 6e  er option does n
16c0: 6f 74 20 65 78 69 73 74 29 2c 20 0a 2a 2a 20 20  ot exist), .**  
16d0: 20 20 20 20 74 68 65 6e 20 74 68 65 20 70 72 6f      then the pro
16e0: 63 65 73 73 20 61 62 6f 72 74 73 20 77 69 74 68  cess aborts with
16f0: 20 61 6e 20 65 72 72 6f 72 20 70 72 69 6f 72 20   an error prior 
1700: 74 6f 20 72 65 61 64 69 6e 67 20 61 6e 79 20 69  to reading any i
1710: 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20  nput..**.** (3) 
1720: 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61   The length of a
1730: 6e 20 48 54 54 50 20 72 65 71 75 65 73 74 20 69  n HTTP request i
1740: 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 4d 41 58  s limited to MAX
1750: 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20  _CONTENT_LENGTH 
1760: 62 79 74 65 73 0a 2a 2a 20 20 20 20 20 20 28 64  bytes.**      (d
1770: 65 66 61 75 6c 74 3a 20 32 35 30 20 6d 69 6c 6c  efault: 250 mill
1780: 69 6f 6e 29 2e 20 20 41 6e 79 20 48 54 54 50 20  ion).  Any HTTP 
1790: 72 65 71 75 65 73 74 20 6c 6f 6e 67 65 72 20 74  request longer t
17a0: 68 61 6e 20 74 68 69 73 20 66 61 69 6c 73 0a 2a  han this fails.*
17b0: 2a 20 20 20 20 20 20 77 69 74 68 20 61 6e 20 65  *      with an e
17c0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20  rror..**.** (4) 
17d0: 20 54 68 65 72 65 20 61 72 65 20 68 61 72 64 2d   There are hard-
17e0: 63 6f 64 65 64 20 74 69 6d 65 2d 6f 75 74 73 20  coded time-outs 
17f0: 6f 6e 20 65 61 63 68 20 48 54 54 50 20 72 65 71  on each HTTP req
1800: 75 65 73 74 2e 20 20 49 66 20 74 68 69 73 20 70  uest.  If this p
1810: 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 77  rocess.**      w
1820: 61 69 74 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  aits longer than
1830: 20 74 68 65 20 74 69 6d 65 6f 75 74 20 66 6f 72   the timeout for
1840: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 72 65   the complete re
1850: 71 75 65 73 74 2c 20 6f 72 20 66 6f 72 20 43 47  quest, or for CG
1860: 49 0a 2a 2a 20 20 20 20 20 20 74 6f 20 66 69 6e  I.**      to fin
1870: 69 73 68 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65  ish running, the
1880: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 61  n this process a
1890: 62 6f 72 74 73 2e 20 20 28 54 68 65 20 74 69 6d  borts.  (The tim
18a0: 65 6f 75 74 20 66 65 61 74 75 72 65 0a 2a 2a 20  eout feature.** 
18b0: 20 20 20 20 20 63 61 6e 20 62 65 20 64 69 73 61       can be disa
18c0: 62 6c 65 64 20 75 73 69 6e 67 20 74 68 65 20 2d  bled using the -
18d0: 2d 64 65 62 75 67 20 63 6f 6d 6d 61 6e 64 2d 6c  -debug command-l
18e0: 69 6e 65 20 6f 70 74 69 6f 6e 2e 29 0a 2a 2a 0a  ine option.).**.
18f0: 2a 2a 20 28 35 29 20 20 49 66 20 74 68 65 20 48  ** (5)  If the H
1900: 54 54 50 5f 48 4f 53 54 20 72 65 71 75 65 73 74  TTP_HOST request
1910: 20 68 65 61 64 65 72 20 63 6f 6e 74 61 69 6e 73   header contains
1920: 20 63 68 61 72 61 63 74 65 72 73 20 6f 74 68 65   characters othe
1930: 72 20 74 68 61 6e 0a 2a 2a 20 20 20 20 20 20 5b  r than.**      [
1940: 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e  0-9a-zA-Z,-./:_~
1950: 5d 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  ] then the entir
1960: 65 20 72 65 71 75 65 73 74 20 69 73 20 72 65 6a  e request is rej
1970: 65 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 28 36 29  ected..**.** (6)
1980: 20 20 41 6e 79 20 63 68 61 72 61 63 74 65 72 73    Any characters
1990: 20 69 6e 20 74 68 65 20 55 52 49 20 70 61 74 68   in the URI path
19a0: 6e 61 6d 65 20 6f 74 68 65 72 20 74 68 61 6e 20  name other than 
19b0: 5b 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f  [0-9a-zA-Z,-./:_
19c0: 7e 5d 0a 2a 2a 20 20 20 20 20 20 61 72 65 20 63  ~].**      are c
19d0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 5f  onverted into "_
19e0: 22 2e 20 20 54 68 69 73 20 61 70 70 6c 69 65 73  ".  This applies
19f0: 20 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65   to the pathname
1a00: 20 6f 6e 6c 79 2c 20 6e 6f 74 0a 2a 2a 20 20 20   only, not.**   
1a10: 20 20 20 74 6f 20 74 68 65 20 71 75 65 72 79 20     to the query 
1a20: 70 61 72 61 6d 65 74 65 72 73 20 6f 72 20 66 72  parameters or fr
1a30: 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 28 37  agment..**.** (7
1a40: 29 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  )  If the first 
1a50: 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 6e 79  character of any
1a60: 20 55 52 49 20 70 61 74 68 6e 61 6d 65 20 63 6f   URI pathname co
1a70: 6d 70 6f 6e 65 6e 74 20 69 73 20 22 2e 22 20 6f  mponent is "." o
1a80: 72 20 22 2d 22 0a 2a 2a 20 20 20 20 20 20 74 68  r "-".**      th
1a90: 65 6e 20 61 20 34 30 34 20 4e 6f 74 20 46 6f 75  en a 404 Not Fou
1aa0: 6e 64 20 72 65 70 6c 79 20 69 73 20 67 65 6e 65  nd reply is gene
1ab0: 72 61 74 65 64 2e 20 20 54 68 69 73 20 70 72 65  rated.  This pre
1ac0: 76 65 6e 74 73 20 61 74 74 61 63 6b 73 0a 2a 2a  vents attacks.**
1ad0: 20 20 20 20 20 20 73 75 63 68 20 61 73 20 69 6e        such as in
1ae0: 63 6c 75 64 69 6e 67 20 22 2e 2e 22 20 6f 72 20  cluding ".." or 
1af0: 22 2e 22 20 64 69 72 65 63 74 6f 72 79 20 65 6c  "." directory el
1b00: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 70 61  ements in the pa
1b10: 74 68 6e 61 6d 65 0a 2a 2a 20 20 20 20 20 20 61  thname.**      a
1b20: 6e 64 20 61 6c 6c 6f 77 73 20 70 6c 61 63 69 6e  nd allows placin
1b30: 67 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  g files and dire
1b40: 63 74 6f 72 69 65 73 20 69 6e 20 74 68 65 20 63  ctories in the c
1b50: 6f 6e 74 65 6e 74 20 73 75 62 64 69 72 65 63 74  ontent subdirect
1b60: 6f 72 79 0a 2a 2a 20 20 20 20 20 20 74 68 61 74  ory.**      that
1b70: 20 61 72 65 20 69 6e 76 69 73 69 62 6c 65 20 74   are invisible t
1b80: 6f 20 61 6c 6c 20 48 54 54 50 20 72 65 71 75 65  o all HTTP reque
1b90: 73 74 73 2c 20 62 79 20 6d 61 6b 69 6e 67 20 74  sts, by making t
1ba0: 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 20  he first .**    
1bb0: 20 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74    character of t
1bc0: 68 65 20 66 69 6c 65 20 6f 72 20 73 75 62 64 69  he file or subdi
1bd0: 72 65 63 74 6f 72 79 20 6e 61 6d 65 20 22 2d 22  rectory name "-"
1be0: 20 6f 72 20 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 28   or "."..**.** (
1bf0: 38 29 20 20 54 68 65 20 72 65 71 75 65 73 74 20  8)  The request 
1c00: 55 52 49 20 6d 75 73 74 20 62 65 67 69 6e 20 77  URI must begin w
1c10: 69 74 68 20 22 2f 22 20 6f 72 20 65 6c 73 65 20  ith "/" or else 
1c20: 61 20 34 30 34 20 65 72 72 6f 72 20 69 73 20 67  a 404 error is g
1c30: 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  enerated..**.** 
1c40: 28 39 29 20 20 54 68 69 73 20 70 72 6f 67 72 61  (9)  This progra
1c50: 6d 20 6e 65 76 65 72 20 73 65 74 73 20 74 68 65  m never sets the
1c60: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 65 6e 76   value of an env
1c70: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
1c80: 65 20 74 6f 20 61 0a 2a 2a 20 20 20 20 20 20 73  e to a.**      s
1c90: 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
1ca0: 73 20 77 69 74 68 20 22 28 29 20 7b 22 2e 0a 2a  s with "() {"..*
1cb0: 2a 0a 2a 2a 0a 2a 2a 20 42 61 73 69 63 20 41 75  *.**.** Basic Au
1cc0: 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 0a 2a 2a 0a  thorization:.**.
1cd0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 22  ** If the file "
1ce0: 2d 61 75 74 68 22 20 65 78 69 73 74 73 20 69 6e  -auth" exists in
1cf0: 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
1d00: 6f 72 79 20 61 73 20 74 68 65 20 63 6f 6e 74 65  ory as the conte
1d10: 6e 74 20 66 69 6c 65 0a 2a 2a 20 28 66 6f 72 20  nt file.** (for 
1d20: 62 6f 74 68 20 73 74 61 74 69 63 20 63 6f 6e 74  both static cont
1d30: 65 6e 74 20 61 6e 64 20 43 47 49 29 20 74 68 65  ent and CGI) the
1d40: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  n it contains th
1d50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  e information us
1d60: 65 64 0a 2a 2a 20 66 6f 72 20 62 61 73 69 63 20  ed.** for basic 
1d70: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 2e 20 20  authorization.  
1d80: 54 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  The file format 
1d90: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
1da0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b  *.**    *  Blank
1db0: 20 6c 69 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73   lines and lines
1dc0: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
1dd0: 20 27 23 27 20 61 72 65 20 69 67 6e 6f 72 65 64   '#' are ignored
1de0: 0a 2a 2a 20 20 20 20 2a 20 20 22 68 74 74 70 2d  .**    *  "http-
1df0: 72 65 64 69 72 65 63 74 22 20 66 6f 72 63 65 73  redirect" forces
1e00: 20 61 20 72 65 64 69 72 65 63 74 20 74 6f 20 48   a redirect to H
1e10: 54 54 50 53 20 69 66 20 6e 6f 74 20 74 68 65 72  TTPS if not ther
1e20: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  e already.**    
1e30: 2a 20 20 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20  *  "https-only" 
1e40: 64 69 73 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74  disallows operat
1e50: 69 6f 6e 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20  ion in HTTP.**  
1e60: 20 20 2a 20 20 22 75 73 65 72 20 4e 41 4d 45 20    *  "user NAME 
1e70: 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 22 20  LOGIN:PASSWORD" 
1e80: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
1e90: 20 4c 4f 47 49 4e 3a 50 41 53 53 57 4f 52 44 20   LOGIN:PASSWORD 
1ea0: 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 68 6f 72  .**       author
1eb0: 69 7a 61 74 69 6f 6e 20 63 72 65 64 65 6e 74 69  ization credenti
1ec0: 61 6c 73 20 61 72 65 20 70 72 6f 76 69 64 65 64  als are provided
1ed0: 2c 20 61 6e 64 20 69 66 20 73 6f 20 73 65 74 73  , and if so sets
1ee0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 52 45   the.**       RE
1ef0: 4d 4f 54 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d  MOTE_USER to NAM
1f00: 45 2e 0a 2a 2a 20 20 20 20 2a 20 20 22 72 65 61  E..**    *  "rea
1f10: 6c 6d 20 54 45 58 54 22 20 73 65 74 73 20 74 68  lm TEXT" sets th
1f20: 65 20 72 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e  e realm to TEXT.
1f30: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e  .**.** There can
1f40: 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 22 75 73   be multiple "us
1f50: 65 72 22 20 6c 69 6e 65 73 2e 20 20 49 66 20 6e  er" lines.  If n
1f60: 6f 20 22 75 73 65 72 22 20 6c 69 6e 65 20 6d 61  o "user" line ma
1f70: 74 63 68 65 73 2c 20 74 68 65 0a 2a 2a 20 72 65  tches, the.** re
1f80: 71 75 65 73 74 20 66 61 69 6c 73 20 77 69 74 68  quest fails with
1f90: 20 61 20 34 30 31 20 65 72 72 6f 72 2e 0a 2a 2a   a 401 error..**
1fa0: 0a 2a 2a 20 42 65 63 61 75 73 65 20 6f 66 20 73  .** Because of s
1fb0: 65 63 75 72 69 74 79 20 72 75 6c 65 20 28 37 29  ecurity rule (7)
1fc0: 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  , there is no wa
1fd0: 79 20 66 6f 72 20 74 68 65 20 63 6f 6e 74 65 6e  y for the conten
1fe0: 74 20 6f 66 20 74 68 65 20 22 2d 61 75 74 68 22  t of the "-auth"
1ff0: 0a 2a 2a 20 66 69 6c 65 20 74 6f 20 6c 65 61 6b  .** file to leak
2000: 20 6f 75 74 20 76 69 61 20 48 54 54 50 20 72 65   out via HTTP re
2010: 71 75 65 73 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  quest..*/.#inclu
2020: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
2030: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
2040: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 6c 6f 67  #include <syslog
2050: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
2060: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
2070: 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69   <sys/stat.h>.#i
2080: 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68  nclude <unistd.h
2090: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74  >.#include <fcnt
20a0: 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  l.h>.#include <s
20b0: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
20c0: 65 20 3c 70 77 64 2e 68 3e 0a 23 69 6e 63 6c 75  e <pwd.h>.#inclu
20d0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
20e0: 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79  #include <sys/ty
20f0: 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  pes.h>.#include 
2100: 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e 0a 23  <sys/socket.h>.#
2110: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 77 61 69  include <sys/wai
2120: 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e  t.h>.#include <n
2130: 65 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a 23 69 6e  etinet/in.h>.#in
2140: 63 6c 75 64 65 20 3c 61 72 70 61 2f 69 6e 65 74  clude <arpa/inet
2150: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
2160: 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  darg.h>.#include
2170: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
2180: 64 65 20 3c 73 79 73 2f 74 69 6d 65 73 2e 68 3e  de <sys/times.h>
2190: 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65 74 64 62  .#include <netdb
21a0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72  .h>.#include <er
21b0: 72 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rno.h>.#include 
21c0: 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e  <sys/resource.h>
21d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61  .#include <signa
21e0: 6c 2e 68 3e 0a 23 69 66 64 65 66 20 6c 69 6e 75  l.h>.#ifdef linu
21f0: 78 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  x.#include <sys/
2200: 73 65 6e 64 66 69 6c 65 2e 68 3e 0a 23 65 6e 64  sendfile.h>.#end
2210: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  if.#include <ass
2220: 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ert.h>../*.** Co
2230: 6e 66 69 67 75 72 65 20 74 68 65 20 73 65 72 76  nfigure the serv
2240: 65 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  er by setting th
2250: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
2260: 6f 73 20 61 6e 64 20 72 65 63 6f 6d 70 69 6c 69  os and recompili
2270: 6e 67 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 44  ng..*/.#ifndef D
2280: 45 46 41 55 4c 54 5f 50 4f 52 54 0a 23 64 65 66  EFAULT_PORT.#def
2290: 69 6e 65 20 44 45 46 41 55 4c 54 5f 50 4f 52 54  ine DEFAULT_PORT
22a0: 20 22 38 30 22 20 20 20 20 20 20 20 20 20 20 20   "80"           
22b0: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 54 43 50    /* Default TCP
22c0: 20 70 6f 72 74 20 66 6f 72 20 48 54 54 50 20 2a   port for HTTP *
22d0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  /.#endif.#ifndef
22e0: 20 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e   MAX_CONTENT_LEN
22f0: 47 54 48 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  GTH.#define MAX_
2300: 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 20 32  CONTENT_LENGTH 2
2310: 35 30 30 30 30 30 30 30 20 20 2f 2a 20 4d 61 78  50000000  /* Max
2320: 20 6c 65 6e 67 74 68 20 6f 66 20 48 54 54 50 20   length of HTTP 
2330: 72 65 71 75 65 73 74 20 63 6f 6e 74 65 6e 74 20  request content 
2340: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
2350: 20 57 65 20 72 65 63 6f 72 64 20 6d 6f 73 74 20   We record most 
2360: 6f 66 20 74 68 65 20 73 74 61 74 65 20 69 6e 66  of the state inf
2370: 6f 72 6d 61 74 69 6f 6e 20 61 73 20 67 6c 6f 62  ormation as glob
2380: 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 20 20 54  al variables.  T
2390: 68 69 73 0a 2a 2a 20 73 61 76 65 73 20 68 61 76  his.** saves hav
23a0: 69 6e 67 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  ing to pass info
23b0: 72 6d 61 74 69 6f 6e 20 74 6f 20 73 75 62 72 6f  rmation to subro
23c0: 75 74 69 6e 65 73 20 61 73 20 70 61 72 61 6d 65  utines as parame
23d0: 74 65 72 73 2c 20 61 6e 64 0a 2a 2a 20 6d 61 6b  ters, and.** mak
23e0: 65 73 20 74 68 65 20 65 78 65 63 75 74 61 62 6c  es the executabl
23f0: 65 20 73 6d 61 6c 6c 65 72 2e 2e 2e 0a 2a 2f 0a  e smaller....*/.
2400: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52 6f  static char *zRo
2410: 6f 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ot = 0;         
2420: 20 2f 2a 20 52 6f 6f 74 20 64 69 72 65 63 74 6f   /* Root directo
2430: 72 79 20 6f 66 20 74 68 65 20 77 65 62 73 69 74  ry of the websit
2440: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e */.static char
2450: 20 2a 7a 54 6d 70 4e 61 6d 20 3d 20 30 3b 20 20   *zTmpNam = 0;  
2460: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2470: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2480: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e */.static char
2490: 20 7a 54 6d 70 4e 61 6d 42 75 66 5b 35 30 30 5d   zTmpNamBuf[500]
24a0: 3b 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74  ;     /* Space t
24b0: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 6d 70 6f  o hold the tempo
24c0: 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  rary filename */
24d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 50  .static char *zP
24e0: 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 20 20 20 20  rotocol = 0;    
24f0: 20 20 2f 2a 20 54 68 65 20 70 72 6f 74 6f 63 6f    /* The protoco
2500: 6c 20 62 65 69 6e 67 20 75 73 69 6e 67 20 62 79  l being using by
2510: 20 74 68 65 20 62 72 6f 77 73 65 72 20 2a 2f 0a   the browser */.
2520: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 4d 65  static char *zMe
2530: 74 68 6f 64 20 3d 20 30 3b 20 20 20 20 20 20 20  thod = 0;       
2540: 20 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 2e 20   /* The method. 
2550: 20 4d 75 73 74 20 62 65 20 47 45 54 20 2a 2f 0a   Must be GET */.
2560: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 53 63  static char *zSc
2570: 72 69 70 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ript = 0;       
2580: 20 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74   /* The object t
2590: 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 73 74  o retrieve */.st
25a0: 61 74 69 63 20 63 68 61 72 20 2a 7a 52 65 61 6c  atic char *zReal
25b0: 53 63 72 69 70 74 20 3d 20 30 3b 20 20 20 20 2f  Script = 0;    /
25c0: 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  * The object to 
25d0: 72 65 74 72 69 65 76 65 2e 20 20 53 61 6d 65 20  retrieve.  Same 
25e0: 61 73 20 7a 53 63 72 69 70 74 0a 20 20 20 20 20  as zScript.     
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65              ** e
2610: 78 63 65 70 74 20 6d 69 67 68 74 20 68 61 76 65  xcept might have
2620: 20 22 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 61   "/index.html" a
2630: 70 70 65 6e 64 65 64 20 2a 2f 0a 73 74 61 74 69  ppended */.stati
2640: 63 20 63 68 61 72 20 2a 7a 48 6f 6d 65 20 3d 20  c char *zHome = 
2650: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
2660: 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
2670: 74 61 69 6e 69 6e 67 20 63 6f 6e 74 65 6e 74 20  taining content 
2680: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2690: 7a 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20 30  zQueryString = 0
26a0: 3b 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79  ;   /* The query
26b0: 20 73 74 72 69 6e 67 20 6f 6e 20 74 68 65 20 65   string on the e
26c0: 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 2a  nd of the name *
26d0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
26e0: 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
26f0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 6e 61     /* The filena
2700: 6d 65 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74  me of the object
2710: 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
2720: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6e 46 69  static int lenFi
2730: 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  le = 0;         
2740: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68   /* Length of th
2750: 65 20 7a 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  e zFile name */.
2760: 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 44 69  static char *zDi
2770: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
2780: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2790: 64 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e  directory holdin
27a0: 67 20 7a 46 69 6c 65 20 2a 2f 0a 73 74 61 74 69  g zFile */.stati
27b0: 63 20 63 68 61 72 20 2a 7a 50 61 74 68 49 6e 66  c char *zPathInf
27c0: 6f 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  o = 0;      /* P
27d0: 61 72 74 20 6f 66 20 74 68 65 20 70 61 74 68 6e  art of the pathn
27e0: 61 6d 65 20 70 61 73 74 20 74 68 65 20 66 69 6c  ame past the fil
27f0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e */.static char
2800: 20 2a 7a 41 67 65 6e 74 20 3d 20 30 3b 20 20 20   *zAgent = 0;   
2810: 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 79        /* What ty
2820: 70 65 20 69 66 20 62 72 6f 77 73 65 72 20 69 73  pe if browser is
2830: 20 6d 61 6b 69 6e 67 20 74 68 69 73 20 71 75 65   making this que
2840: 72 79 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ry */.static cha
2850: 72 20 2a 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d  r *zServerName =
2860: 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 6e 61   0;    /* The na
2870: 6d 65 20 61 66 74 65 72 20 74 68 65 20 68 74 74  me after the htt
2880: 70 3a 2f 2f 20 2a 2f 0a 73 74 61 74 69 63 20 63  p:// */.static c
2890: 68 61 72 20 2a 7a 53 65 72 76 65 72 50 6f 72 74  har *zServerPort
28a0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 68 65 20   = 0;    /* The 
28b0: 70 6f 72 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 73  port number */.s
28c0: 74 61 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6f  tatic char *zCoo
28d0: 6b 69 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  kie = 0;        
28e0: 2f 2a 20 43 6f 6f 6b 69 65 73 20 72 65 70 6f 72  /* Cookies repor
28f0: 74 65 64 20 77 69 74 68 20 74 68 65 20 72 65 71  ted with the req
2900: 75 65 73 74 20 2a 2f 0a 73 74 61 74 69 63 20 63  uest */.static c
2910: 68 61 72 20 2a 7a 48 74 74 70 48 6f 73 74 20 3d  har *zHttpHost =
2920: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
2930: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2940: 65 20 77 65 62 20 62 72 6f 77 73 65 72 20 2a 2f  e web browser */
2950: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
2960: 65 61 6c 50 6f 72 74 20 3d 20 30 3b 20 20 20 20  ealPort = 0;    
2970: 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 54 43    /* The real TC
2980: 50 20 70 6f 72 74 20 77 68 65 6e 20 72 75 6e 6e  P port when runn
2990: 69 6e 67 20 61 73 20 64 61 65 6d 6f 6e 20 2a 2f  ing as daemon */
29a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 52  .static char *zR
29b0: 65 6d 6f 74 65 41 64 64 72 20 3d 20 30 3b 20 20  emoteAddr = 0;  
29c0: 20 20 2f 2a 20 49 50 20 61 64 64 72 65 73 73 20    /* IP address 
29d0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 20 2a  of the request *
29e0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
29f0: 52 65 66 65 72 65 72 20 3d 20 30 3b 20 20 20 20  Referer = 0;    
2a00: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2a10: 65 20 70 61 67 65 20 74 68 61 74 20 72 65 66 65  e page that refe
2a20: 72 65 64 20 74 6f 20 75 73 20 2a 2f 0a 73 74 61  red to us */.sta
2a30: 74 69 63 20 63 68 61 72 20 2a 7a 41 63 63 65 70  tic char *zAccep
2a40: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
2a50: 20 57 68 61 74 20 66 6f 72 6d 61 74 73 20 77 69   What formats wi
2a60: 6c 6c 20 62 65 20 61 63 63 65 70 74 65 64 20 2a  ll be accepted *
2a70: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a  /.static char *z
2a80: 41 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d  AcceptEncoding =
2a90: 30 3b 20 2f 2a 20 67 7a 69 70 20 6f 72 20 64 65  0; /* gzip or de
2aa0: 66 61 75 6c 74 20 2a 2f 0a 73 74 61 74 69 63 20  fault */.static 
2ab0: 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 4c 65  char *zContentLe
2ac0: 6e 67 74 68 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  ngth = 0; /* Con
2ad0: 74 65 6e 74 20 6c 65 6e 67 74 68 20 72 65 70 6f  tent length repo
2ae0: 72 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 64  rted in the head
2af0: 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  er */.static cha
2b00: 72 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20  r *zContentType 
2b10: 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 6e 74 65 6e  = 0;   /* Conten
2b20: 74 20 74 79 70 65 20 72 65 70 6f 72 74 65 64 20  t type reported 
2b30: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  in the header */
2b40: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 51  .static char *zQ
2b50: 75 65 72 79 53 75 66 66 69 78 20 3d 20 30 3b 20  uerySuffix = 0; 
2b60: 20 20 2f 2a 20 54 68 65 20 70 61 72 74 20 6f 66    /* The part of
2b70: 20 74 68 65 20 55 52 4c 20 61 66 74 65 72 20 74   the URL after t
2b80: 68 65 20 66 69 72 73 74 20 3f 20 2a 2f 0a 73 74  he first ? */.st
2b90: 61 74 69 63 20 63 68 61 72 20 2a 7a 41 75 74 68  atic char *zAuth
2ba0: 54 79 70 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  Type = 0;      /
2bb0: 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  * Authorization 
2bc0: 74 79 70 65 20 28 62 61 73 69 63 20 6f 72 20 64  type (basic or d
2bd0: 69 67 65 73 74 29 20 2a 2f 0a 73 74 61 74 69 63  igest) */.static
2be0: 20 63 68 61 72 20 2a 7a 41 75 74 68 41 72 67 20   char *zAuthArg 
2bf0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 41 75  = 0;       /* Au
2c00: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 76 61 6c 75  thorization valu
2c10: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  es */.static cha
2c20: 72 20 2a 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d  r *zRemoteUser =
2c30: 20 30 3b 20 20 20 20 2f 2a 20 52 45 4d 4f 54 45   0;    /* REMOTE
2c40: 5f 55 53 45 52 20 73 65 74 20 62 79 20 61 75 74  _USER set by aut
2c50: 68 6f 72 69 7a 61 74 69 6f 6e 20 6d 6f 64 75 6c  horization modul
2c60: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e */.static char
2c70: 20 2a 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 3d 20   *zIfNoneMatch= 
2c80: 30 3b 20 20 20 20 2f 2a 20 54 68 65 20 49 66 2d  0;    /* The If-
2c90: 4e 6f 6e 65 2d 4d 61 74 63 68 20 68 65 61 64 65  None-Match heade
2ca0: 72 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61 74 69  r value */.stati
2cb0: 63 20 63 68 61 72 20 2a 7a 49 66 4d 6f 64 69 66  c char *zIfModif
2cc0: 69 65 64 53 69 6e 63 65 3d 30 3b 20 2f 2a 20 54  iedSince=0; /* T
2cd0: 68 65 20 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53  he If-Modified-S
2ce0: 69 6e 63 65 20 68 65 61 64 65 72 20 76 61 6c 75  ince header valu
2cf0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
2d00: 6e 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nIn = 0;        
2d10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d20: 6f 66 20 62 79 74 65 73 20 6f 66 20 69 6e 70 75  of bytes of inpu
2d30: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
2d40: 6e 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  nOut = 0;       
2d50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d60: 6f 66 20 62 79 74 65 73 20 6f 66 20 6f 75 74 70  of bytes of outp
2d70: 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ut */.static cha
2d80: 72 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 34  r zReplyStatus[4
2d90: 5d 3b 20 20 20 20 20 2f 2a 20 52 65 70 6c 79 20  ];     /* Reply 
2da0: 73 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 73  status code */.s
2db0: 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 75 73  tatic int status
2dc0: 53 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Sent = 0;       
2dd0: 2f 2a 20 54 72 75 65 20 61 66 74 65 72 20 73 74  /* True after st
2de0: 61 74 75 73 20 6c 69 6e 65 20 69 73 20 73 65 6e  atus line is sen
2df0: 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  t */.static char
2e00: 20 2a 7a 4c 6f 67 46 69 6c 65 20 3d 20 30 3b 20   *zLogFile = 0; 
2e10: 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 6f 20        /* Log to 
2e20: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 73 74 61  this file */.sta
2e30: 74 69 63 20 69 6e 74 20 64 65 62 75 67 46 6c 61  tic int debugFla
2e40: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  g = 0;        /*
2e50: 20 54 72 75 65 20 69 66 20 62 65 69 6e 67 20 64   True if being d
2e60: 65 62 75 67 67 65 64 20 2a 2f 0a 73 74 61 74 69  ebugged */.stati
2e70: 63 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c  c struct timeval
2e80: 20 62 65 67 69 6e 54 69 6d 65 3b 20 2f 2a 20 54   beginTime; /* T
2e90: 69 6d 65 20 77 68 65 6e 20 74 68 69 73 20 70 72  ime when this pr
2ea0: 6f 63 65 73 73 20 73 74 61 72 74 73 20 2a 2f 0a  ocess starts */.
2eb0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
2ec0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20  Connection = 0; 
2ed0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 6e 64   /* True to send
2ee0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f   Connection: clo
2ef0: 73 65 20 69 6e 20 72 65 70 6c 79 20 2a 2f 0a 73  se in reply */.s
2f00: 74 61 74 69 63 20 69 6e 74 20 6e 52 65 71 75 65  tatic int nReque
2f10: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
2f20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 71  /* Number of req
2f30: 75 65 73 74 73 20 70 72 6f 63 65 73 73 65 64 20  uests processed 
2f40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 6d  */.static int om
2f50: 69 74 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20  itLog = 0;      
2f60: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61      /* Do not ma
2f70: 6b 65 20 6c 6f 67 66 69 6c 65 20 65 6e 74 72 69  ke logfile entri
2f80: 65 73 20 69 66 20 74 72 75 65 20 2a 2f 0a 73 74  es if true */.st
2f90: 61 74 69 63 20 69 6e 74 20 75 73 65 48 74 74 70  atic int useHttp
2fa0: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  s = 0;         /
2fb0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 48 54  * True to use HT
2fc0: 54 50 53 3a 20 69 6e 73 74 65 61 64 20 6f 66 20  TPS: instead of 
2fd0: 48 54 54 50 3a 20 2a 2f 0a 73 74 61 74 69 63 20  HTTP: */.static 
2fe0: 63 68 61 72 20 2a 7a 48 74 74 70 20 3d 20 22 68  char *zHttp = "h
2ff0: 74 74 70 22 3b 20 20 20 20 20 2f 2a 20 68 74 74  ttp";     /* htt
3000: 70 20 6f 72 20 68 74 74 70 73 20 2a 2f 0a 73 74  p or https */.st
3010: 61 74 69 63 20 69 6e 74 20 75 73 65 54 69 6d 65  atic int useTime
3020: 6f 75 74 20 3d 20 31 3b 20 20 20 20 20 20 20 2f  out = 1;       /
3030: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 69  * True to use ti
3040: 6d 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  mes */.static in
3050: 74 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 30  t standalone = 0
3060: 3b 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 61  ;       /* Run a
3070: 73 20 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20 73  s a standalone s
3080: 65 72 76 65 72 20 28 6e 6f 20 69 6e 65 74 64 29  erver (no inetd)
3090: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69   */.static int i
30a0: 70 76 36 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20  pv6Only = 0;    
30b0: 20 20 20 20 20 2f 2a 20 55 73 65 20 49 50 76 36       /* Use IPv6
30c0: 20 6f 6e 6c 79 20 2a 2f 0a 73 74 61 74 69 63 20   only */.static 
30d0: 69 6e 74 20 69 70 76 34 4f 6e 6c 79 20 3d 20 30  int ipv4Only = 0
30e0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  ;         /* Use
30f0: 20 49 50 76 34 20 6f 6e 6c 79 20 2a 2f 0a 73 74   IPv4 only */.st
3100: 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61  atic struct rusa
3110: 67 65 20 70 72 69 6f 72 53 65 6c 66 3b 20 20 2f  ge priorSelf;  /
3120: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 72 65 70  * Previously rep
3130: 6f 72 74 20 53 45 4c 46 20 74 69 6d 65 20 2a 2f  ort SELF time */
3140: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72  .static struct r
3150: 75 73 61 67 65 20 70 72 69 6f 72 43 68 69 6c 64  usage priorChild
3160: 3b 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20  ; /* Previously 
3170: 72 65 70 6f 72 74 20 43 48 49 4c 44 20 74 69 6d  report CHILD tim
3180: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
3190: 6d 78 41 67 65 20 3d 20 31 32 30 3b 20 20 20 20  mxAge = 120;    
31a0: 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 2d 63        /* Cache-c
31b0: 6f 6e 74 72 6f 6c 20 6d 61 78 2d 61 67 65 20 2a  ontrol max-age *
31c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 6f 75 62 6c 65 20  /../*.** Double 
31d0: 61 6e 79 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  any double-quote
31e0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 61   characters in a
31f0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
3200: 69 63 20 63 68 61 72 20 2a 45 73 63 61 70 65 28  ic char *Escape(
3210: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
3220: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  i, j;.  int n;. 
3230: 20 63 68 61 72 20 63 3b 0a 20 20 63 68 61 72 20   char c;.  char 
3240: 2a 7a 4f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30  *zOut;.  for(i=0
3250: 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 20 26 26  ; (c=z[i])!=0 &&
3260: 20 63 21 3d 27 22 27 3b 20 69 2b 2b 29 7b 7d 0a   c!='"'; i++){}.
3270: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
3280: 75 72 6e 20 7a 3b 0a 20 20 6e 20 3d 20 31 3b 0a  urn z;.  n = 1;.
3290: 20 20 66 6f 72 28 69 2b 2b 3b 20 28 63 3d 7a 5b    for(i++; (c=z[
32a0: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 20 69 66  i])!=0; i++){ if
32b0: 28 20 63 3d 3d 27 22 27 20 29 20 6e 2b 2b 3b 20  ( c=='"' ) n++; 
32c0: 7d 0a 20 20 7a 4f 75 74 20 3d 20 6d 61 6c 6c 6f  }.  zOut = mallo
32d0: 63 28 20 69 2b 6e 2b 31 20 29 3b 0a 20 20 69 66  c( i+n+1 );.  if
32e0: 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75  ( zOut==0 ) retu
32f0: 72 6e 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 6a  rn "";.  for(i=j
3300: 3d 30 3b 20 28 63 3d 7a 5b 69 5d 29 21 3d 30 3b  =0; (c=z[i])!=0;
3310: 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 4f 75 74 5b   i++){.    zOut[
3320: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 69 66  j++] = c;.    if
3330: 28 20 63 3d 3d 27 22 27 20 29 20 7a 4f 75 74 5b  ( c=='"' ) zOut[
3340: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  j++] = c;.  }.  
3350: 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  zOut[j] = 0;.  r
3360: 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f  eturn zOut;.}../
3370: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73  *.** Convert a s
3380: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 69 6e  truct timeval in
3390: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  to an integer nu
33a0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
33b0: 6f 6e 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  onds.*/.static i
33c0: 6e 74 20 74 76 6d 73 28 73 74 72 75 63 74 20 74  nt tvms(struct t
33d0: 69 6d 65 76 61 6c 20 2a 70 29 7b 0a 20 20 72 65  imeval *p){.  re
33e0: 74 75 72 6e 20 28 69 6e 74 29 28 70 2d 3e 74 76  turn (int)(p->tv
33f0: 5f 73 65 63 2a 31 30 30 30 30 30 30 20 2b 20 70  _sec*1000000 + p
3400: 2d 3e 74 76 5f 75 73 65 63 29 3b 0a 7d 0a 0a 2f  ->tv_usec);.}../
3410: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 6e 20 65 6e 74  *.** Make an ent
3420: 72 79 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  ry in the log fi
3430: 6c 65 2e 20 20 49 66 20 74 68 65 20 48 54 54 50  le.  If the HTTP
3440: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75   connection shou
3450: 6c 64 20 62 65 0a 2a 2a 20 63 6c 6f 73 65 64 2c  ld be.** closed,
3460: 20 74 68 65 6e 20 74 65 72 6d 69 6e 61 74 65 20   then terminate 
3470: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 4f  this process.  O
3480: 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 2e  therwise return.
3490: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34a0: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 69 6e 74  MakeLogEntry(int
34b0: 20 65 78 69 74 43 6f 64 65 2c 20 69 6e 74 20 6c   exitCode, int l
34c0: 69 6e 65 4e 75 6d 29 7b 0a 20 20 46 49 4c 45 20  ineNum){.  FILE 
34d0: 2a 6c 6f 67 3b 0a 20 20 69 66 28 20 7a 54 6d 70  *log;.  if( zTmp
34e0: 4e 61 6d 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e  Nam ){.    unlin
34f0: 6b 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 7d 0a  k(zTmpNam);.  }.
3500: 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 20 26    if( zLogFile &
3510: 26 20 21 6f 6d 69 74 4c 6f 67 20 29 7b 0a 20 20  & !omitLog ){.  
3520: 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
3530: 20 6e 6f 77 3b 0a 20 20 20 20 73 74 72 75 63 74   now;.    struct
3540: 20 74 6d 20 2a 70 54 6d 3b 0a 20 20 20 20 73 74   tm *pTm;.    st
3550: 72 75 63 74 20 72 75 73 61 67 65 20 73 65 6c 66  ruct rusage self
3560: 2c 20 63 68 69 6c 64 72 65 6e 3b 0a 20 20 20 20  , children;.    
3570: 69 6e 74 20 77 61 69 74 53 74 61 74 75 73 3b 0a  int waitStatus;.
3580: 20 20 20 20 63 68 61 72 20 2a 7a 52 4d 20 3d 20      char *zRM = 
3590: 7a 52 65 6d 6f 74 65 55 73 65 72 20 3f 20 7a 52  zRemoteUser ? zR
35a0: 65 6d 6f 74 65 55 73 65 72 20 3a 20 22 22 3b 0a  emoteUser : "";.
35b0: 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e      char *zFilen
35c0: 61 6d 65 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  ame;.    size_t 
35d0: 73 7a 3b 0a 20 20 20 20 63 68 61 72 20 7a 44 61  sz;.    char zDa
35e0: 74 65 5b 32 30 30 5d 3b 0a 20 20 20 20 63 68 61  te[200];.    cha
35f0: 72 20 7a 45 78 70 4c 6f 67 46 69 6c 65 5b 35 30  r zExpLogFile[50
3600: 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20 7a 53 63  0];..    if( zSc
3610: 72 69 70 74 3d 3d 30 20 29 20 7a 53 63 72 69 70  ript==0 ) zScrip
3620: 74 20 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20  t = "";.    if( 
3630: 7a 52 65 61 6c 53 63 72 69 70 74 3d 3d 30 20 29  zRealScript==0 )
3640: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 22   zRealScript = "
3650: 22 3b 0a 20 20 20 20 69 66 28 20 7a 52 65 6d 6f  ";.    if( zRemo
3660: 74 65 41 64 64 72 3d 3d 30 20 29 20 7a 52 65 6d  teAddr==0 ) zRem
3670: 6f 74 65 41 64 64 72 20 3d 20 22 22 3b 0a 20 20  oteAddr = "";.  
3680: 20 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d    if( zHttpHost=
3690: 3d 30 20 29 20 7a 48 74 74 70 48 6f 73 74 20 3d  =0 ) zHttpHost =
36a0: 20 22 22 3b 0a 20 20 20 20 69 66 28 20 7a 52 65   "";.    if( zRe
36b0: 66 65 72 65 72 3d 3d 30 20 29 20 7a 52 65 66 65  ferer==0 ) zRefe
36c0: 72 65 72 20 3d 20 22 22 3b 0a 20 20 20 20 69 66  rer = "";.    if
36d0: 28 20 7a 41 67 65 6e 74 3d 3d 30 20 29 20 7a 41  ( zAgent==0 ) zA
36e0: 67 65 6e 74 20 3d 20 22 22 3b 0a 20 20 20 20 67  gent = "";.    g
36f0: 65 74 74 69 6d 65 6f 66 64 61 79 28 26 6e 6f 77  ettimeofday(&now
3700: 2c 20 30 29 3b 0a 20 20 20 20 70 54 6d 20 3d 20  , 0);.    pTm = 
3710: 6c 6f 63 61 6c 74 69 6d 65 28 26 6e 6f 77 2e 74  localtime(&now.t
3720: 76 5f 73 65 63 29 3b 0a 20 20 20 20 73 74 72 66  v_sec);.    strf
3730: 74 69 6d 65 28 7a 44 61 74 65 2c 20 73 69 7a 65  time(zDate, size
3740: 6f 66 28 7a 44 61 74 65 29 2c 20 22 25 59 2d 25  of(zDate), "%Y-%
3750: 6d 2d 25 64 20 25 48 3a 25 4d 3a 25 53 22 2c 20  m-%d %H:%M:%S", 
3760: 70 54 6d 29 3b 0a 20 20 20 20 73 7a 20 3d 20 73  pTm);.    sz = s
3770: 74 72 66 74 69 6d 65 28 7a 45 78 70 4c 6f 67 46  trftime(zExpLogF
3780: 69 6c 65 2c 20 73 69 7a 65 6f 66 28 7a 45 78 70  ile, sizeof(zExp
3790: 4c 6f 67 46 69 6c 65 29 2c 20 7a 4c 6f 67 46 69  LogFile), zLogFi
37a0: 6c 65 2c 20 70 54 6d 29 3b 0a 20 20 20 20 69 66  le, pTm);.    if
37b0: 28 20 73 7a 3e 30 20 26 26 20 73 7a 3c 73 69 7a  ( sz>0 && sz<siz
37c0: 65 6f 66 28 7a 45 78 70 4c 6f 67 46 69 6c 65 29  eof(zExpLogFile)
37d0: 2d 32 20 29 7b 0a 20 20 20 20 20 20 7a 46 69 6c  -2 ){.      zFil
37e0: 65 6e 61 6d 65 20 3d 20 7a 45 78 70 4c 6f 67 46  ename = zExpLogF
37f0: 69 6c 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ile;.    }else{.
3800: 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20        zFilename 
3810: 3d 20 7a 4c 6f 67 46 69 6c 65 3b 0a 20 20 20 20  = zLogFile;.    
3820: 7d 0a 20 20 20 20 77 61 69 74 70 69 64 28 2d 31  }.    waitpid(-1
3830: 2c 20 26 77 61 69 74 53 74 61 74 75 73 2c 20 57  , &waitStatus, W
3840: 4e 4f 48 41 4e 47 29 3b 0a 20 20 20 20 67 65 74  NOHANG);.    get
3850: 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45  rusage(RUSAGE_SE
3860: 4c 46 2c 20 26 73 65 6c 66 29 3b 0a 20 20 20 20  LF, &self);.    
3870: 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
3880: 5f 43 48 49 4c 44 52 45 4e 2c 20 26 63 68 69 6c  _CHILDREN, &chil
3890: 64 72 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 28  dren);.    if( (
38a0: 6c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c  log = fopen(zFil
38b0: 65 6e 61 6d 65 2c 22 61 22 29 29 21 3d 30 20 29  ename,"a"))!=0 )
38c0: 7b 0a 23 69 66 64 65 66 20 43 4f 4d 42 49 4e 45  {.#ifdef COMBINE
38d0: 44 5f 4c 4f 47 5f 46 4f 52 4d 41 54 0a 20 20 20  D_LOG_FORMAT.   
38e0: 20 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61 74     strftime(zDat
38f0: 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65 29  e, sizeof(zDate)
3900: 2c 20 22 25 64 2f 25 62 2f 25 59 3a 25 48 3a 25  , "%d/%b/%Y:%H:%
3910: 4d 3a 25 53 20 25 7a 22 2c 20 70 54 6d 29 3b 0a  M:%S %z", pTm);.
3920: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6c 6f        fprintf(lo
3930: 67 2c 20 22 25 73 20 2d 20 2d 20 5b 25 73 5d 20  g, "%s - - [%s] 
3940: 5c 22 25 73 20 25 73 20 25 73 5c 22 20 25 73 20  \"%s %s %s\" %s 
3950: 25 64 20 5c 22 25 73 5c 22 20 5c 22 25 73 5c 22  %d \"%s\" \"%s\"
3960: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
3970: 20 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 2c 20     zRemoteAddr, 
3980: 7a 44 61 74 65 2c 20 7a 4d 65 74 68 6f 64 2c 20  zDate, zMethod, 
3990: 7a 53 63 72 69 70 74 2c 20 7a 50 72 6f 74 6f 63  zScript, zProtoc
39a0: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
39b0: 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20    zReplyStatus, 
39c0: 6e 4f 75 74 2c 20 7a 52 65 66 65 72 65 72 2c 20  nOut, zReferer, 
39d0: 7a 41 67 65 6e 74 29 3b 0a 23 65 6c 73 65 0a 20  zAgent);.#else. 
39e0: 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 7a 44       strftime(zD
39f0: 61 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74  ate, sizeof(zDat
3a00: 65 29 2c 20 22 25 59 2d 25 6d 2d 25 64 20 25 48  e), "%Y-%m-%d %H
3a10: 3a 25 4d 3a 25 53 22 2c 20 70 54 6d 29 3b 0a 20  :%M:%S", pTm);. 
3a20: 20 20 20 20 20 2f 2a 20 4c 6f 67 20 72 65 63 6f       /* Log reco
3a30: 72 64 20 66 69 6c 65 73 3a 0a 20 20 20 20 20 20  rd files:.      
3a40: 2a 2a 20 20 28 31 29 20 44 61 74 65 20 61 6e 64  **  (1) Date and
3a50: 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 20   time.      **  
3a60: 28 32 29 20 49 50 20 61 64 64 72 65 73 73 0a 20  (2) IP address. 
3a70: 20 20 20 20 20 2a 2a 20 20 28 33 29 20 55 52 4c       **  (3) URL
3a80: 20 62 65 69 6e 67 20 61 63 63 65 73 73 65 64 0a   being accessed.
3a90: 20 20 20 20 20 20 2a 2a 20 20 28 34 29 20 52 65        **  (4) Re
3aa0: 66 65 72 65 72 0a 20 20 20 20 20 20 2a 2a 20 20  ferer.      **  
3ab0: 28 35 29 20 52 65 70 6c 79 20 73 74 61 74 75 73  (5) Reply status
3ac0: 0a 20 20 20 20 20 20 2a 2a 20 20 28 36 29 20 42  .      **  (6) B
3ad0: 79 74 65 73 20 72 65 63 65 69 76 65 64 0a 20 20  ytes received.  
3ae0: 20 20 20 20 2a 2a 20 20 28 37 29 20 42 79 74 65      **  (7) Byte
3af0: 73 20 73 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  s sent.      ** 
3b00: 20 28 38 29 20 53 65 6c 66 20 75 73 65 72 20 74   (8) Self user t
3b10: 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 20 28 39  ime.      **  (9
3b20: 29 20 53 65 6c 66 20 73 79 73 74 65 6d 20 74 69  ) Self system ti
3b30: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28 31 30 29  me.      ** (10)
3b40: 20 43 68 69 6c 64 72 65 6e 20 75 73 65 72 20 74   Children user t
3b50: 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20 28 31 31  ime.      ** (11
3b60: 29 20 43 68 69 6c 64 72 65 6e 20 73 79 73 74 65  ) Children syste
3b70: 6d 20 74 69 6d 65 0a 20 20 20 20 20 20 2a 2a 20  m time.      ** 
3b80: 28 31 32 29 20 54 6f 74 61 6c 20 77 61 6c 6c 2d  (12) Total wall-
3b90: 63 6c 6f 63 6b 20 74 69 6d 65 0a 20 20 20 20 20  clock time.     
3ba0: 20 2a 2a 20 28 31 33 29 20 52 65 71 75 65 73 74   ** (13) Request
3bb0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 61 6d 65   number for same
3bc0: 20 54 43 50 2f 49 50 20 63 6f 6e 6e 65 63 74 69   TCP/IP connecti
3bd0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 28 31 34 29  on.      ** (14)
3be0: 20 55 73 65 72 20 61 67 65 6e 74 0a 20 20 20 20   User agent.    
3bf0: 20 20 2a 2a 20 28 31 35 29 20 52 65 6d 6f 74 65    ** (15) Remote
3c00: 20 75 73 65 72 0a 20 20 20 20 20 20 2a 2a 20 28   user.      ** (
3c10: 31 36 29 20 42 79 74 65 73 20 6f 66 20 55 52 4c  16) Bytes of URL
3c20: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
3c30: 20 74 6f 20 74 68 65 20 53 43 52 49 50 54 5f 4e   to the SCRIPT_N
3c40: 41 4d 45 0a 20 20 20 20 20 20 2a 2a 20 28 31 37  AME.      ** (17
3c50: 29 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 69 6e  ) Line number in
3c60: 20 73 6f 75 72 63 65 20 66 69 6c 65 0a 20 20 20   source file.   
3c70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 70 72 69     */.      fpri
3c80: 6e 74 66 28 6c 6f 67 2c 0a 20 20 20 20 20 20 20  ntf(log,.       
3c90: 20 22 25 73 2c 25 73 2c 5c 22 25 73 3a 2f 2f 25   "%s,%s,\"%s://%
3ca0: 73 25 73 5c 22 2c 5c 22 25 73 5c 22 2c 22 0a 20  s%s\",\"%s\",". 
3cb0: 20 20 20 20 20 20 20 20 20 20 22 25 73 2c 25 64            "%s,%d
3cc0: 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c 25 64 2c  ,%d,%d,%d,%d,%d,
3cd0: 25 64 2c 25 64 2c 5c 22 25 73 5c 22 2c 5c 22 25  %d,%d,\"%s\",\"%
3ce0: 73 5c 22 2c 25 64 2c 25 64 5c 6e 22 2c 0a 20 20  s\",%d,%d\n",.  
3cf0: 20 20 20 20 20 20 7a 44 61 74 65 2c 20 7a 52 65        zDate, zRe
3d00: 6d 6f 74 65 41 64 64 72 2c 20 7a 48 74 74 70 2c  moteAddr, zHttp,
3d10: 20 45 73 63 61 70 65 28 7a 48 74 74 70 48 6f 73   Escape(zHttpHos
3d20: 74 29 2c 20 45 73 63 61 70 65 28 7a 53 63 72 69  t), Escape(zScri
3d30: 70 74 29 2c 0a 20 20 20 20 20 20 20 20 45 73 63  pt),.        Esc
3d40: 61 70 65 28 7a 52 65 66 65 72 65 72 29 2c 20 7a  ape(zReferer), z
3d50: 52 65 70 6c 79 53 74 61 74 75 73 2c 20 6e 49 6e  ReplyStatus, nIn
3d60: 2c 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , nOut,.        
3d70: 74 76 6d 73 28 26 73 65 6c 66 2e 72 75 5f 75 74  tvms(&self.ru_ut
3d80: 69 6d 65 29 20 2d 20 74 76 6d 73 28 26 70 72 69  ime) - tvms(&pri
3d90: 6f 72 53 65 6c 66 2e 72 75 5f 75 74 69 6d 65 29  orSelf.ru_utime)
3da0: 2c 0a 20 20 20 20 20 20 20 20 74 76 6d 73 28 26  ,.        tvms(&
3db0: 73 65 6c 66 2e 72 75 5f 73 74 69 6d 65 29 20 2d  self.ru_stime) -
3dc0: 20 74 76 6d 73 28 26 70 72 69 6f 72 53 65 6c 66   tvms(&priorSelf
3dd0: 2e 72 75 5f 73 74 69 6d 65 29 2c 0a 20 20 20 20  .ru_stime),.    
3de0: 20 20 20 20 74 76 6d 73 28 26 63 68 69 6c 64 72      tvms(&childr
3df0: 65 6e 2e 72 75 5f 75 74 69 6d 65 29 20 2d 20 74  en.ru_utime) - t
3e00: 76 6d 73 28 26 70 72 69 6f 72 43 68 69 6c 64 2e  vms(&priorChild.
3e10: 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20 20  ru_utime),.     
3e20: 20 20 20 74 76 6d 73 28 26 63 68 69 6c 64 72 65     tvms(&childre
3e30: 6e 2e 72 75 5f 73 74 69 6d 65 29 20 2d 20 74 76  n.ru_stime) - tv
3e40: 6d 73 28 26 70 72 69 6f 72 43 68 69 6c 64 2e 72  ms(&priorChild.r
3e50: 75 5f 73 74 69 6d 65 29 2c 0a 20 20 20 20 20 20  u_stime),.      
3e60: 20 20 74 76 6d 73 28 26 6e 6f 77 29 20 2d 20 74    tvms(&now) - t
3e70: 76 6d 73 28 26 62 65 67 69 6e 54 69 6d 65 29 2c  vms(&beginTime),
3e80: 0a 20 20 20 20 20 20 20 20 6e 52 65 71 75 65 73  .        nReques
3e90: 74 2c 20 45 73 63 61 70 65 28 7a 41 67 65 6e 74  t, Escape(zAgent
3ea0: 29 2c 20 45 73 63 61 70 65 28 7a 52 4d 29 2c 0a  ), Escape(zRM),.
3eb0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 73 74          (int)(st
3ec0: 72 6c 65 6e 28 7a 48 74 74 70 29 2b 73 74 72 6c  rlen(zHttp)+strl
3ed0: 65 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74  en(zHttpHost)+st
3ee0: 72 6c 65 6e 28 7a 52 65 61 6c 53 63 72 69 70 74  rlen(zRealScript
3ef0: 29 2b 33 29 2c 0a 20 20 20 20 20 20 20 20 6c 69  )+3),.        li
3f00: 6e 65 4e 75 6d 0a 20 20 20 20 20 20 29 3b 0a 20  neNum.      );. 
3f10: 20 20 20 20 20 70 72 69 6f 72 53 65 6c 66 20 3d       priorSelf =
3f20: 20 73 65 6c 66 3b 0a 20 20 20 20 20 20 70 72 69   self;.      pri
3f30: 6f 72 43 68 69 6c 64 20 3d 20 63 68 69 6c 64 72  orChild = childr
3f40: 65 6e 3b 0a 20 20 20 20 20 20 62 65 67 69 6e 54  en;.      beginT
3f50: 69 6d 65 20 3d 20 6e 6f 77 3b 0a 23 65 6e 64 69  ime = now;.#endi
3f60: 66 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6c  f.      fclose(l
3f70: 6f 67 29 3b 0a 20 20 20 20 20 20 6e 49 6e 20 3d  og);.      nIn =
3f80: 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d   nOut = 0;.    }
3f90: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f 73 65  .  }.  if( close
3fa0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Connection ){.  
3fb0: 20 20 65 78 69 74 28 65 78 69 74 43 6f 64 65 29    exit(exitCode)
3fc0: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 75 73 53 65  ;.  }.  statusSe
3fd0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
3fe0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
3ff0: 20 73 61 66 65 6c 79 0a 2a 2f 0a 73 74 61 74 69   safely.*/.stati
4000: 63 20 63 68 61 72 20 2a 53 61 66 65 4d 61 6c 6c  c char *SafeMall
4010: 6f 63 28 20 69 6e 74 20 73 69 7a 65 20 29 7b 0a  oc( int size ){.
4020: 20 20 63 68 61 72 20 2a 70 3b 0a 0a 20 20 70 20    char *p;..  p 
4030: 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
4040: 73 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  size);.  if( p==
4050: 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
4060: 7a 52 65 70 6c 79 53 74 61 74 75 73 2c 20 22 39  zReplyStatus, "9
4070: 39 38 22 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f  98");.    MakeLo
4080: 67 45 6e 74 72 79 28 31 2c 31 30 30 29 3b 20 20  gEntry(1,100);  
4090: 2f 2a 20 4c 4f 47 3a 20 4d 61 6c 6c 6f 63 28 29  /* LOG: Malloc()
40a0: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 65   failed */.    e
40b0: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65  xit(1);.  }.  re
40c0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
40d0: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
40e0: 66 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  f environment va
40f0: 72 69 61 62 6c 65 20 7a 56 61 72 20 74 6f 20 7a  riable zVar to z
4100: 56 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  Value..*/.static
4110: 20 76 6f 69 64 20 53 65 74 45 6e 76 28 63 6f 6e   void SetEnv(con
4120: 73 74 20 63 68 61 72 20 2a 7a 56 61 72 2c 20 63  st char *zVar, c
4130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75  onst char *zValu
4140: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  e){.  char *z;. 
4150: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 66 28 20   int len;.  if( 
4160: 7a 56 61 6c 75 65 3d 3d 30 20 29 20 7a 56 61 6c  zValue==0 ) zVal
4170: 75 65 3d 22 22 3b 0a 20 20 2f 2a 20 44 69 73 61  ue="";.  /* Disa
4180: 62 6c 65 20 61 6e 20 61 74 74 65 6d 70 74 65 64  ble an attempted
4190: 20 62 61 73 68 64 6f 6f 72 20 61 74 74 61 63 6b   bashdoor attack
41a0: 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 6e 63 6d   */.  if( strncm
41b0: 70 28 7a 56 61 6c 75 65 2c 22 28 29 20 7b 22 2c  p(zValue,"() {",
41c0: 34 29 3d 3d 30 20 29 20 7a 56 61 6c 75 65 20 3d  4)==0 ) zValue =
41d0: 20 22 22 3b 0a 20 20 6c 65 6e 20 3d 20 73 74 72   "";.  len = str
41e0: 6c 65 6e 28 7a 56 61 72 29 20 2b 20 73 74 72 6c  len(zVar) + strl
41f0: 65 6e 28 7a 56 61 6c 75 65 29 20 2b 20 32 3b 0a  en(zValue) + 2;.
4200: 20 20 7a 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63    z = SafeMalloc
4210: 28 6c 65 6e 29 3b 0a 20 20 73 70 72 69 6e 74 66  (len);.  sprintf
4220: 28 7a 2c 22 25 73 3d 25 73 22 2c 7a 56 61 72 2c  (z,"%s=%s",zVar,
4230: 7a 56 61 6c 75 65 29 3b 0a 20 20 70 75 74 65 6e  zValue);.  puten
4240: 76 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  v(z);.}../*.** R
4250: 65 6d 6f 76 65 20 74 68 65 20 66 69 72 73 74 20  emove the first 
4260: 73 70 61 63 65 2d 64 65 6c 69 6d 69 74 65 64 20  space-delimited 
4270: 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73 74 72  token from a str
4280: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ing and return.*
4290: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  * a pointer to i
42a0: 74 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c 20 74  t.  Add a NULL t
42b0: 6f 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20  o the string to 
42c0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f  terminate the to
42d0: 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 7a 4c  ken..** Make *zL
42e0: 65 66 74 4f 76 65 72 20 70 6f 69 6e 74 20 74 6f  eftOver point to
42f0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
4300: 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a 2f  e next token..*/
4310: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 47 65  .static char *Ge
4320: 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 63 68  tFirstElement(ch
4330: 61 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68 61 72  ar *zInput, char
4340: 20 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b 0a 20   **zLeftOver){. 
4350: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d   char *zResult =
4360: 20 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70 75 74   0;.  if( zInput
4370: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  ==0 ){.    if( z
4380: 4c 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c 65 66  LeftOver ) *zLef
4390: 74 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  tOver = 0;.    r
43a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77  eturn 0;.  }.  w
43b0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a  hile( isspace(*z
43c0: 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74  Input) ){ zInput
43d0: 2b 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20  ++; }.  zResult 
43e0: 3d 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69 6c  = zInput;.  whil
43f0: 65 28 20 2a 7a 49 6e 70 75 74 20 26 26 20 21 69  e( *zInput && !i
4400: 73 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20  sspace(*zInput) 
4410: 29 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20  ){ zInput++; }. 
4420: 20 69 66 28 20 2a 7a 49 6e 70 75 74 20 29 7b 0a   if( *zInput ){.
4430: 20 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20 30 3b      *zInput = 0;
4440: 0a 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20  .    zInput++;. 
4450: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
4460: 65 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49  e(*zInput) ){ zI
4470: 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  nput++; }.  }.  
4480: 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 7b  if( zLeftOver ){
4490: 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 7a 49   *zLeftOver = zI
44a0: 6e 70 75 74 3b 20 7d 0a 20 20 72 65 74 75 72 6e  nput; }.  return
44b0: 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   zResult;.}../*.
44c0: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
44d0: 66 20 61 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  f a string into 
44e0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
44f0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
4500: 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 74 72  static char *Str
4510: 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Dup(const char *
4520: 7a 53 72 63 29 7b 0a 20 20 63 68 61 72 20 2a 7a  zSrc){.  char *z
4530: 44 65 73 74 3b 0a 20 20 69 6e 74 20 73 69 7a 65  Dest;.  int size
4540: 3b 0a 0a 20 20 69 66 28 20 7a 53 72 63 3d 3d 30  ;..  if( zSrc==0
4550: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
4560: 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 7a 53 72  ize = strlen(zSr
4570: 63 29 20 2b 20 31 3b 0a 20 20 7a 44 65 73 74 20  c) + 1;.  zDest 
4580: 3d 20 28 63 68 61 72 2a 29 53 61 66 65 4d 61 6c  = (char*)SafeMal
4590: 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 73  loc( size );.  s
45a0: 74 72 63 70 79 28 7a 44 65 73 74 2c 7a 53 72 63  trcpy(zDest,zSrc
45b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 73  );.  return zDes
45c0: 74 3b 0a 7d 0a 73 74 61 74 69 63 20 63 68 61 72  t;.}.static char
45d0: 20 2a 53 74 72 41 70 70 65 6e 64 28 63 68 61 72   *StrAppend(char
45e0: 20 2a 7a 50 72 69 6f 72 2c 20 63 6f 6e 73 74 20   *zPrior, const 
45f0: 63 68 61 72 20 2a 7a 53 65 70 2c 20 63 6f 6e 73  char *zSep, cons
4600: 74 20 63 68 61 72 20 2a 7a 53 72 63 29 7b 0a 20  t char *zSrc){. 
4610: 20 63 68 61 72 20 2a 7a 44 65 73 74 3b 0a 20 20   char *zDest;.  
4620: 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20  int size;.  int 
4630: 6e 31 2c 20 6e 32 3b 0a 0a 20 20 69 66 28 20 7a  n1, n2;..  if( z
4640: 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
4650: 30 3b 0a 20 20 69 66 28 20 7a 50 72 69 6f 72 3d  0;.  if( zPrior=
4660: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 74 72 44  =0 ) return StrD
4670: 75 70 28 7a 53 72 63 29 3b 0a 20 20 73 69 7a 65  up(zSrc);.  size
4680: 20 3d 20 28 6e 31 3d 73 74 72 6c 65 6e 28 7a 53   = (n1=strlen(zS
4690: 72 63 29 29 20 2b 20 28 6e 32 3d 73 74 72 6c 65  rc)) + (n2=strle
46a0: 6e 28 7a 53 65 70 29 29 20 2b 20 73 74 72 6c 65  n(zSep)) + strle
46b0: 6e 28 7a 50 72 69 6f 72 29 20 2b 20 31 3b 0a 20  n(zPrior) + 1;. 
46c0: 20 7a 44 65 73 74 20 3d 20 28 63 68 61 72 2a 29   zDest = (char*)
46d0: 53 61 66 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  SafeMalloc( size
46e0: 20 29 3b 0a 20 20 73 74 72 63 70 79 28 7a 44 65   );.  strcpy(zDe
46f0: 73 74 2c 7a 50 72 69 6f 72 29 3b 0a 20 20 66 72  st,zPrior);.  fr
4700: 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20 73 74  ee(zPrior);.  st
4710: 72 63 70 79 28 26 7a 44 65 73 74 5b 6e 31 5d 2c  rcpy(&zDest[n1],
4720: 7a 53 65 70 29 3b 0a 20 20 73 74 72 63 70 79 28  zSep);.  strcpy(
4730: 26 7a 44 65 73 74 5b 6e 31 2b 6e 32 5d 2c 7a 53  &zDest[n1+n2],zS
4740: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44  rc);.  return zD
4750: 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  est;.}../*.** Co
4760: 6d 70 61 72 65 20 74 77 6f 20 45 54 61 67 20 76  mpare two ETag v
4770: 61 6c 75 65 73 2e 20 52 65 74 75 72 6e 20 30 20  alues. Return 0 
4780: 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e  if they match an
4790: 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  d non-zero if th
47a0: 65 79 20 64 69 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ey differ..**.**
47b0: 20 54 68 65 20 6f 6e 65 20 6f 6e 20 74 68 65 20   The one on the 
47c0: 6c 65 66 74 20 6d 69 67 68 74 20 62 65 20 61 20  left might be a 
47d0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 6e 64  NULL pointer and
47e0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 71 75 6f   it might be quo
47f0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
4800: 6e 74 20 43 6f 6d 70 61 72 65 45 74 61 67 73 28  nt CompareEtags(
4810: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
4820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 29 7b  const char *zB){
4830: 0a 20 20 69 66 28 20 7a 41 3d 3d 30 20 29 20 72  .  if( zA==0 ) r
4840: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 7a  eturn 1;.  if( z
4850: 41 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  A[0]=='"' ){.   
4860: 20 69 6e 74 20 6c 65 6e 42 20 3d 20 28 69 6e 74   int lenB = (int
4870: 29 73 74 72 6c 65 6e 28 7a 42 29 3b 0a 20 20 20  )strlen(zB);.   
4880: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 41 2b   if( strncmp(zA+
4890: 31 2c 20 7a 42 2c 20 6c 65 6e 42 29 3d 3d 30 20  1, zB, lenB)==0 
48a0: 26 26 20 7a 41 5b 6c 65 6e 42 2b 31 5d 3d 3d 27  && zA[lenB+1]=='
48b0: 22 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  "' ) return 0;. 
48c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63   }.  return strc
48d0: 6d 70 28 7a 41 2c 20 7a 42 29 3b 0a 7d 0a 0a 2f  mp(zA, zB);.}../
48e0: 2a 0a 2a 2a 20 42 72 65 61 6b 20 61 20 6c 69 6e  *.** Break a lin
48f0: 65 20 61 74 20 74 68 65 20 66 69 72 73 74 20 5c  e at the first \
4900: 6e 20 6f 72 20 5c 72 20 63 68 61 72 61 63 74 65  n or \r characte
4910: 72 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69  r seen..*/.stati
4920: 63 20 76 6f 69 64 20 52 65 6d 6f 76 65 4e 65 77  c void RemoveNew
4930: 6c 69 6e 65 28 63 68 61 72 20 2a 7a 29 7b 0a 20  line(char *z){. 
4940: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
4950: 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20  rn;.  while( *z 
4960: 26 26 20 2a 7a 21 3d 27 5c 6e 27 20 26 26 20 2a  && *z!='\n' && *
4970: 7a 21 3d 27 5c 72 27 20 29 7b 20 7a 2b 2b 3b 20  z!='\r' ){ z++; 
4980: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 2f  }.  *z = 0;.}../
4990: 2a 20 52 65 6e 64 65 72 20 73 65 63 6f 6e 64 73  * Render seconds
49a0: 20 73 69 6e 63 65 20 31 39 37 30 20 61 73 20 61   since 1970 as a
49b0: 6e 20 52 46 43 38 32 32 20 64 61 74 65 20 73 74  n RFC822 date st
49c0: 72 69 6e 67 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  ring.  Return.**
49d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
49e0: 61 74 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  at string in a s
49f0: 74 61 74 69 63 20 62 75 66 66 65 72 2e 0a 2a 2f  tatic buffer..*/
4a00: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 52 66  .static char *Rf
4a10: 63 38 32 32 44 61 74 65 28 74 69 6d 65 5f 74 20  c822Date(time_t 
4a20: 74 29 7b 0a 20 20 73 74 72 75 63 74 20 74 6d 20  t){.  struct tm 
4a30: 2a 74 6d 3b 0a 20 20 73 74 61 74 69 63 20 63 68  *tm;.  static ch
4a40: 61 72 20 7a 44 61 74 65 5b 31 30 30 5d 3b 0a 20  ar zDate[100];. 
4a50: 20 74 6d 20 3d 20 67 6d 74 69 6d 65 28 26 74 29   tm = gmtime(&t)
4a60: 3b 0a 20 20 73 74 72 66 74 69 6d 65 28 7a 44 61  ;.  strftime(zDa
4a70: 74 65 2c 20 73 69 7a 65 6f 66 28 7a 44 61 74 65  te, sizeof(zDate
4a80: 29 2c 20 22 25 61 2c 20 25 64 20 25 62 20 25 59  ), "%a, %d %b %Y
4a90: 20 25 48 3a 25 4d 3a 25 53 20 25 7a 22 2c 20 74   %H:%M:%S %z", t
4aa0: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 44 61  m);.  return zDa
4ab0: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  te;.}../*.** Pri
4ac0: 6e 74 20 61 20 64 61 74 65 20 74 61 67 20 69 6e  nt a date tag in
4ad0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
4ae0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
4af0: 67 20 69 73 20 7a 54 61 67 2e 0a 2a 2a 20 54 68  g is zTag..** Th
4b00: 65 20 64 61 74 65 20 69 73 20 64 65 74 65 72 6d  e date is determ
4b10: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  ined from the un
4b20: 69 78 20 74 69 6d 65 73 74 61 6d 70 20 67 69 76  ix timestamp giv
4b30: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
4b40: 74 20 44 61 74 65 54 61 67 28 63 6f 6e 73 74 20  t DateTag(const 
4b50: 63 68 61 72 20 2a 7a 54 61 67 2c 20 74 69 6d 65  char *zTag, time
4b60: 5f 74 20 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  _t t){.  return 
4b70: 70 72 69 6e 74 66 28 22 25 73 3a 20 25 73 5c 72  printf("%s: %s\r
4b80: 5c 6e 22 2c 20 7a 54 61 67 2c 20 52 66 63 38 32  \n", zTag, Rfc82
4b90: 32 44 61 74 65 28 74 29 29 3b 0a 7d 0a 0a 2f 2a  2Date(t));.}../*
4ba0: 0a 2a 2a 20 50 61 72 73 65 20 61 6e 20 52 46 43  .** Parse an RFC
4bb0: 38 32 32 2d 66 6f 72 6d 61 74 74 65 64 20 74 69  822-formatted ti
4bc0: 6d 65 73 74 61 6d 70 20 61 73 20 77 65 27 64 20  mestamp as we'd 
4bd0: 65 78 70 65 63 74 20 66 72 6f 6d 20 48 54 54 50  expect from HTTP
4be0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61   and return.** a
4bf0: 20 55 6e 69 78 20 65 70 6f 63 68 20 74 69 6d 65   Unix epoch time
4c00: 2e 20 3c 3d 20 7a 65 72 6f 20 69 73 20 72 65 74  . <= zero is ret
4c10: 75 72 6e 65 64 20 6f 6e 20 66 61 69 6c 75 72 65  urned on failure
4c20: 2e 0a 2a 2f 0a 74 69 6d 65 5f 74 20 50 61 72 73  ..*/.time_t Pars
4c30: 65 52 66 63 38 32 32 44 61 74 65 28 63 6f 6e 73  eRfc822Date(cons
4c40: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 29 7b 0a  t char *zDate){.
4c50: 20 20 69 6e 74 20 6d 64 61 79 2c 20 6d 6f 6e 2c    int mday, mon,
4c60: 20 79 65 61 72 2c 20 79 64 61 79 2c 20 68 6f 75   year, yday, hou
4c70: 72 2c 20 6d 69 6e 2c 20 73 65 63 3b 0a 20 20 63  r, min, sec;.  c
4c80: 68 61 72 20 7a 49 67 6e 6f 72 65 5b 34 5d 3b 0a  har zIgnore[4];.
4c90: 20 20 63 68 61 72 20 7a 4d 6f 6e 74 68 5b 34 5d    char zMonth[4]
4ca0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
4cb0: 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4d   char *const azM
4cc0: 6f 6e 74 68 73 5b 5d 20 3d 0a 20 20 20 20 7b 22  onths[] =.    {"
4cd0: 4a 61 6e 22 2c 20 22 46 65 62 22 2c 20 22 4d 61  Jan", "Feb", "Ma
4ce0: 72 22 2c 20 22 41 70 72 22 2c 20 22 4d 61 79 22  r", "Apr", "May"
4cf0: 2c 20 22 4a 75 6e 22 2c 0a 20 20 20 20 20 22 4a  , "Jun",.     "J
4d00: 75 6c 22 2c 20 22 41 75 67 22 2c 20 22 53 65 70  ul", "Aug", "Sep
4d10: 22 2c 20 22 4f 63 74 22 2c 20 22 4e 6f 76 22 2c  ", "Oct", "Nov",
4d20: 20 22 44 65 63 22 2c 20 30 7d 3b 0a 20 20 69 66   "Dec", 0};.  if
4d30: 28 20 37 3d 3d 73 73 63 61 6e 66 28 7a 44 61 74  ( 7==sscanf(zDat
4d40: 65 2c 20 22 25 33 5b 41 2d 5a 61 2d 7a 5d 2c 20  e, "%3[A-Za-z], 
4d50: 25 64 20 25 33 5b 41 2d 5a 61 2d 7a 5d 20 25 64  %d %3[A-Za-z] %d
4d60: 20 25 64 3a 25 64 3a 25 64 22 2c 20 7a 49 67 6e   %d:%d:%d", zIgn
4d70: 6f 72 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ore,.           
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 64 61              &mda
4d90: 79 2c 20 7a 4d 6f 6e 74 68 2c 20 26 79 65 61 72  y, zMonth, &year
4da0: 2c 20 26 68 6f 75 72 2c 20 26 6d 69 6e 2c 20 26  , &hour, &min, &
4db0: 73 65 63 29 29 7b 0a 20 20 20 20 69 66 28 20 79  sec)){.    if( y
4dc0: 65 61 72 20 3e 20 31 39 30 30 20 29 20 79 65 61  ear > 1900 ) yea
4dd0: 72 20 2d 3d 20 31 39 30 30 3b 0a 20 20 20 20 66  r -= 1900;.    f
4de0: 6f 72 28 6d 6f 6e 3d 30 3b 20 61 7a 4d 6f 6e 74  or(mon=0; azMont
4df0: 68 73 5b 6d 6f 6e 5d 3b 20 6d 6f 6e 2b 2b 29 7b  hs[mon]; mon++){
4e00: 0a 20 20 20 20 20 20 69 66 28 20 21 73 74 72 6e  .      if( !strn
4e10: 63 6d 70 28 20 61 7a 4d 6f 6e 74 68 73 5b 6d 6f  cmp( azMonths[mo
4e20: 6e 5d 2c 20 7a 4d 6f 6e 74 68 2c 20 33 20 29 29  n], zMonth, 3 ))
4e30: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44  {.        int nD
4e40: 61 79 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ay;.        int 
4e50: 69 73 4c 65 61 70 59 72 3b 0a 20 20 20 20 20 20  isLeapYr;.      
4e60: 20 20 73 74 61 74 69 63 20 69 6e 74 20 70 72 69    static int pri
4e70: 6f 72 44 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  orDays[] =.     
4e80: 20 20 20 20 7b 20 20 30 2c 20 33 31 2c 20 35 39      {  0, 31, 59
4e90: 2c 20 39 30 2c 31 32 30 2c 31 35 31 2c 31 38 31  , 90,120,151,181
4ea0: 2c 32 31 32 2c 32 34 33 2c 32 37 33 2c 33 30 34  ,212,243,273,304
4eb0: 2c 33 33 34 20 7d 3b 0a 20 20 20 20 20 20 20 20  ,334 };.        
4ec0: 69 66 28 20 6d 6f 6e 3c 30 20 29 7b 0a 20 20 20  if( mon<0 ){.   
4ed0: 20 20 20 20 20 20 20 69 6e 74 20 6e 59 65 61 72         int nYear
4ee0: 20 3d 20 28 31 31 20 2d 20 6d 6f 6e 29 2f 31 32   = (11 - mon)/12
4ef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 79 65 61 72  ;.          year
4f00: 20 2d 3d 20 6e 59 65 61 72 3b 0a 20 20 20 20 20   -= nYear;.     
4f10: 20 20 20 20 20 6d 6f 6e 20 2b 3d 20 6e 59 65 61       mon += nYea
4f20: 72 2a 31 32 3b 0a 20 20 20 20 20 20 20 20 7d 65  r*12;.        }e
4f30: 6c 73 65 20 69 66 28 20 6d 6f 6e 3e 31 31 20 29  lse if( mon>11 )
4f40: 7b 0a 20 20 20 20 20 20 20 20 20 20 79 65 61 72  {.          year
4f50: 20 2b 3d 20 6d 6f 6e 2f 31 32 3b 0a 20 20 20 20   += mon/12;.    
4f60: 20 20 20 20 20 20 6d 6f 6e 20 25 3d 20 31 32 3b        mon %= 12;
4f70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4f80: 20 20 20 69 73 4c 65 61 70 59 72 20 3d 20 79 65     isLeapYr = ye
4f90: 61 72 25 34 3d 3d 30 20 26 26 20 28 79 65 61 72  ar%4==0 && (year
4fa0: 25 31 30 30 21 3d 30 20 7c 7c 20 28 79 65 61 72  %100!=0 || (year
4fb0: 2b 33 30 30 29 25 34 30 30 3d 3d 30 29 3b 0a 20  +300)%400==0);. 
4fc0: 20 20 20 20 20 20 20 79 64 61 79 20 3d 20 70 72         yday = pr
4fd0: 69 6f 72 44 61 79 73 5b 6d 6f 6e 5d 20 2b 20 6d  iorDays[mon] + m
4fe0: 64 61 79 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  day - 1;.       
4ff0: 20 69 66 28 20 69 73 4c 65 61 70 59 72 20 26 26   if( isLeapYr &&
5000: 20 6d 6f 6e 3e 31 20 29 20 79 64 61 79 2b 2b 3b   mon>1 ) yday++;
5010: 0a 20 20 20 20 20 20 20 20 6e 44 61 79 20 3d 20  .        nDay = 
5020: 28 79 65 61 72 2d 37 30 29 2a 33 36 35 20 2b 20  (year-70)*365 + 
5030: 28 79 65 61 72 2d 36 39 29 2f 34 20 2d 20 79 65  (year-69)/4 - ye
5040: 61 72 2f 31 30 30 20 2b 20 28 79 65 61 72 2b 33  ar/100 + (year+3
5050: 30 30 29 2f 34 30 30 20 2b 20 79 64 61 79 3b 0a  00)/400 + yday;.
5060: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
5070: 28 6e 44 61 79 2a 32 34 20 2b 20 68 6f 75 72 29  (nDay*24 + hour)
5080: 2a 36 30 20 2b 20 6d 69 6e 29 2a 36 30 20 2b 20  *60 + min)*60 + 
5090: 73 65 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sec;.      }.   
50a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
50b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  0;.}../*.** Test
50c0: 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 50   procedure for P
50d0: 61 72 73 65 52 66 63 38 32 32 44 61 74 65 0a 2a  arseRfc822Date.*
50e0: 2f 0a 76 6f 69 64 20 54 65 73 74 50 61 72 73 65  /.void TestParse
50f0: 52 66 63 38 32 32 44 61 74 65 28 76 6f 69 64 29  Rfc822Date(void)
5100: 7b 0a 20 20 74 69 6d 65 5f 74 20 74 31 2c 20 74  {.  time_t t1, t
5110: 32 3b 0a 20 20 66 6f 72 28 74 31 3d 30 3b 20 74  2;.  for(t1=0; t
5120: 31 3c 30 78 37 66 66 66 66 66 66 66 3b 20 74 31  1<0x7fffffff; t1
5130: 20 2b 3d 20 31 32 37 29 7b 0a 20 20 20 20 74 32   += 127){.    t2
5140: 20 3d 20 50 61 72 73 65 52 66 63 38 32 32 44 61   = ParseRfc822Da
5150: 74 65 28 52 66 63 38 32 32 44 61 74 65 28 74 31  te(Rfc822Date(t1
5160: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
5170: 74 31 3d 3d 74 32 20 29 3b 0a 20 20 7d 0a 7d 0a  t1==t2 );.  }.}.
5180: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
5190: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 61   first line of a
51a0: 20 72 65 73 70 6f 6e 73 65 20 66 6f 6c 6c 6f 77   response follow
51b0: 65 64 20 62 79 20 74 68 65 20 73 65 72 76 65 72  ed by the server
51c0: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   type..*/.static
51d0: 20 76 6f 69 64 20 53 74 61 72 74 52 65 73 70 6f   void StartRespo
51e0: 6e 73 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nse(const char *
51f0: 7a 52 65 73 75 6c 74 43 6f 64 65 29 7b 0a 20 20  zResultCode){.  
5200: 74 69 6d 65 5f 74 20 6e 6f 77 3b 0a 20 20 74 69  time_t now;.  ti
5210: 6d 65 28 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20  me(&now);.  if( 
5220: 73 74 61 74 75 73 53 65 6e 74 20 29 20 72 65 74  statusSent ) ret
5230: 75 72 6e 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  urn;.  nOut += p
5240: 72 69 6e 74 66 28 22 25 73 20 25 73 5c 72 5c 6e  rintf("%s %s\r\n
5250: 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 7a 52  ", zProtocol, zR
5260: 65 73 75 6c 74 43 6f 64 65 29 3b 0a 20 20 73 74  esultCode);.  st
5270: 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  rncpy(zReplyStat
5280: 75 73 2c 20 7a 52 65 73 75 6c 74 43 6f 64 65 2c  us, zResultCode,
5290: 20 33 29 3b 0a 20 20 7a 52 65 70 6c 79 53 74 61   3);.  zReplySta
52a0: 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 69 66  tus[3] = 0;.  if
52b0: 28 20 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 30  ( zReplyStatus[0
52c0: 5d 3e 3d 27 34 27 20 29 7b 0a 20 20 20 20 63 6c  ]>='4' ){.    cl
52d0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
52e0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 6f  1;.  }.  if( clo
52f0: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29 7b 0a  seConnection ){.
5300: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
5310: 74 66 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20  tf("Connection: 
5320: 63 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d  close\r\n");.  }
5330: 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74 20 2b  else{.    nOut +
5340: 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e 65 63  = printf("Connec
5350: 74 69 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65  tion: keep-alive
5360: 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 6e 4f  \r\n");.  }.  nO
5370: 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 44  ut += DateTag("D
5380: 61 74 65 22 2c 20 6e 6f 77 29 3b 0a 20 20 73 74  ate", now);.  st
5390: 61 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 7d 0a  atusSent = 1;.}.
53a0: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
53b0: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72  client that ther
53c0: 65 20 69 73 20 6e 6f 20 73 75 63 68 20 64 6f 63  e is no such doc
53d0: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
53e0: 76 6f 69 64 20 4e 6f 74 46 6f 75 6e 64 28 69 6e  void NotFound(in
53f0: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61  t lineno){.  Sta
5400: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 34 20  rtResponse("404 
5410: 4e 6f 74 20 46 6f 75 6e 64 22 29 3b 0a 20 20 6e  Not Found");.  n
5420: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
5430: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
5440: 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22  : text/html\r\n"
5450: 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20  .    "\r\n".    
5460: 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65 20 6c 69  "<head><title li
5470: 6e 65 6e 6f 3d 5c 22 25 64 5c 22 3e 4e 6f 74 20  neno=\"%d\">Not 
5480: 46 6f 75 6e 64 3c 2f 74 69 74 6c 65 3e 3c 2f 68  Found</title></h
5490: 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f  ead>\n".    "<bo
54a0: 64 79 3e 3c 68 31 3e 44 6f 63 75 6d 65 6e 74 20  dy><h1>Document 
54b0: 4e 6f 74 20 46 6f 75 6e 64 3c 2f 68 31 3e 5c 6e  Not Found</h1>\n
54c0: 22 0a 20 20 20 20 22 54 68 65 20 64 6f 63 75 6d  ".    "The docum
54d0: 65 6e 74 20 25 73 20 69 73 20 6e 6f 74 20 61 76  ent %s is not av
54e0: 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 69 73 20  ailable on this 
54f0: 73 65 72 76 65 72 5c 6e 22 0a 20 20 20 20 22 3c  server\n".    "<
5500: 2f 62 6f 64 79 3e 5c 6e 22 2c 20 6c 69 6e 65 6e  /body>\n", linen
5510: 6f 2c 20 7a 53 63 72 69 70 74 29 3b 0a 20 20 4d  o, zScript);.  M
5520: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c  akeLogEntry(0, l
5530: 69 6e 65 6e 6f 29 3b 0a 20 20 65 78 69 74 28 30  ineno);.  exit(0
5540: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c  );.}../*.** Tell
5550: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74   the client that
5560: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 77 65   they are not we
5570: 6c 63 6f 6d 65 64 20 68 65 72 65 2e 0a 2a 2f 0a  lcomed here..*/.
5580: 73 74 61 74 69 63 20 76 6f 69 64 20 46 6f 72 62  static void Forb
5590: 69 64 64 65 6e 28 69 6e 74 20 6c 69 6e 65 6e 6f  idden(int lineno
55a0: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
55b0: 73 65 28 22 34 30 33 20 46 6f 72 62 69 64 64 65  se("403 Forbidde
55c0: 6e 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  n");.  nOut += p
55d0: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
55e0: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
55f0: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c  lain\r\n".    "\
5600: 72 5c 6e 22 0a 20 20 20 20 22 41 63 63 65 73 73  r\n".    "Access
5610: 20 64 65 6e 69 65 64 5c 6e 22 0a 20 20 29 3b 0a   denied\n".  );.
5620: 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f    closeConnectio
5630: 6e 20 3d 20 31 3b 0a 20 20 4d 61 6b 65 4c 6f 67  n = 1;.  MakeLog
5640: 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29  Entry(0, lineno)
5650: 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a  ;.  exit(0);.}..
5660: 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63  /*.** Tell the c
5670: 6c 69 65 6e 74 20 74 68 61 74 20 61 75 74 68 6f  lient that autho
5680: 72 69 7a 61 74 69 6f 6e 20 69 73 20 72 65 71 75  rization is requ
5690: 69 72 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  ired to access t
56a0: 68 65 0a 2a 2a 20 64 6f 63 75 6d 65 6e 74 2e 0a  he.** document..
56b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e  */.static void N
56c0: 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 63 6f 6e  otAuthorized(con
56d0: 73 74 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 29  st char *zRealm)
56e0: 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73  {.  StartRespons
56f0: 65 28 22 34 30 31 20 41 75 74 68 6f 72 69 7a 61  e("401 Authoriza
5700: 74 69 6f 6e 20 52 65 71 75 69 72 65 64 22 29 3b  tion Required");
5710: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
5720: 66 28 0a 20 20 20 20 22 57 57 57 2d 41 75 74 68  f(.    "WWW-Auth
5730: 65 6e 74 69 63 61 74 65 3a 20 42 61 73 69 63 20  enticate: Basic 
5740: 72 65 61 6c 6d 3d 5c 22 25 73 5c 22 5c 72 5c 6e  realm=\"%s\"\r\n
5750: 22 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  ".    "Content-t
5760: 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c 72  ype: text/html\r
5770: 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20  \n".    "\r\n". 
5780: 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c 65     "<head><title
5790: 3e 4e 6f 74 20 41 75 74 68 6f 72 69 7a 65 64 3c  >Not Authorized<
57a0: 2f 74 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e  /title></head>\n
57b0: 22 0a 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31  ".    "<body><h1
57c0: 3e 34 30 31 20 4e 6f 74 20 41 75 74 68 6f 72 69  >401 Not Authori
57d0: 7a 65 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20  zed</h1>\n".    
57e0: 22 41 20 6c 6f 67 69 6e 20 61 6e 64 20 70 61 73  "A login and pas
57f0: 73 77 6f 72 64 20 61 72 65 20 72 65 71 75 69 72  sword are requir
5800: 65 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 75  ed for this docu
5810: 6d 65 6e 74 5c 6e 22 0a 20 20 20 20 22 3c 2f 62  ment\n".    "</b
5820: 6f 64 79 3e 5c 6e 22 2c 20 7a 52 65 61 6c 6d 29  ody>\n", zRealm)
5830: 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  ;.  MakeLogEntry
5840: 28 30 2c 20 31 31 30 29 3b 20 20 2f 2a 20 4c 4f  (0, 110);  /* LO
5850: 47 3a 20 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65  G: Not authorize
5860: 64 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  d */.}../*.** Te
5870: 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68  ll the client th
5880: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  at there is an e
5890: 72 72 6f 72 20 69 6e 20 74 68 65 20 73 63 72 69  rror in the scri
58a0: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  pt..*/.static vo
58b0: 69 64 20 43 67 69 45 72 72 6f 72 28 76 6f 69 64  id CgiError(void
58c0: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
58d0: 73 65 28 22 35 30 30 20 45 72 72 6f 72 22 29 3b  se("500 Error");
58e0: 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74  .  nOut += print
58f0: 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d  f(.    "Content-
5900: 74 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 5c  type: text/html\
5910: 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a  r\n".    "\r\n".
5920: 20 20 20 20 22 3c 68 65 61 64 3e 3c 74 69 74 6c      "<head><titl
5930: 65 3e 43 47 49 20 50 72 6f 67 72 61 6d 20 45 72  e>CGI Program Er
5940: 72 6f 72 3c 2f 74 69 74 6c 65 3e 3c 2f 68 65 61  ror</title></hea
5950: 64 3e 5c 6e 22 0a 20 20 20 20 22 3c 62 6f 64 79  d>\n".    "<body
5960: 3e 3c 68 31 3e 43 47 49 20 50 72 6f 67 72 61 6d  ><h1>CGI Program
5970: 20 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20   Error</h1>\n". 
5980: 20 20 20 22 54 68 65 20 43 47 49 20 70 72 6f 67     "The CGI prog
5990: 72 61 6d 20 25 73 20 67 65 6e 65 72 61 74 65 64  ram %s generated
59a0: 20 61 6e 20 65 72 72 6f 72 5c 6e 22 0a 20 20 20   an error\n".   
59b0: 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c 20 7a 53   "</body>\n", zS
59c0: 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f  cript);.  MakeLo
59d0: 67 45 6e 74 72 79 28 30 2c 20 31 32 30 29 3b 20  gEntry(0, 120); 
59e0: 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 45 72 72   /* LOG: CGI Err
59f0: 6f 72 20 2a 2f 0a 20 20 65 78 69 74 28 30 29 3b  or */.  exit(0);
5a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5a10: 73 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 74  s called if we t
5a20: 69 6d 65 6f 75 74 20 6f 72 20 63 61 74 63 68 20  imeout or catch 
5a30: 73 6f 6d 65 20 6f 74 68 65 72 20 6b 69 6e 64 20  some other kind 
5a40: 6f 66 20 73 69 67 6e 61 6c 2e 0a 2a 2a 20 4c 6f  of signal..** Lo
5a50: 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
5a60: 77 68 69 63 68 20 69 73 20 39 30 30 2b 69 53 69  which is 900+iSi
5a70: 67 20 61 6e 64 20 74 68 65 6e 20 71 75 69 74 2e  g and then quit.
5a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5a90: 54 69 6d 65 6f 75 74 28 69 6e 74 20 69 53 69 67  Timeout(int iSig
5aa0: 29 7b 0a 20 20 69 66 28 20 21 64 65 62 75 67 46  ){.  if( !debugF
5ab0: 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  lag ){.    if( z
5ac0: 53 63 72 69 70 74 20 26 26 20 7a 53 63 72 69 70  Script && zScrip
5ad0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 68  t[0] ){.      ch
5ae0: 61 72 20 7a 42 75 66 5b 31 30 5d 3b 0a 20 20 20  ar zBuf[10];.   
5af0: 20 20 20 7a 42 75 66 5b 30 5d 20 3d 20 27 39 27     zBuf[0] = '9'
5b00: 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 31 5d 20  ;.      zBuf[1] 
5b10: 3d 20 27 30 27 20 2b 20 28 69 53 69 67 2f 31 30  = '0' + (iSig/10
5b20: 29 25 31 30 3b 0a 20 20 20 20 20 20 7a 42 75 66  )%10;.      zBuf
5b30: 5b 32 5d 20 3d 20 27 30 27 20 2b 20 69 53 69 67  [2] = '0' + iSig
5b40: 25 31 30 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b  %10;.      zBuf[
5b50: 33 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  3] = 0;.      st
5b60: 72 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75  rcpy(zReplyStatu
5b70: 73 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  s, zBuf);.      
5b80: 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
5b90: 31 33 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 54  130);  /* LOG: T
5ba0: 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 7d 0a  imeout */.    }.
5bb0: 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d      exit(0);.  }
5bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74  .}../*.** Tell t
5bd0: 68 65 20 63 6c 69 65 6e 74 20 74 68 61 74 20 74  he client that t
5be0: 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
5bf0: 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 2e 0a   in the script..
5c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
5c10: 67 69 53 63 72 69 70 74 57 72 69 74 61 62 6c 65  giScriptWritable
5c20: 28 76 6f 69 64 29 7b 0a 20 20 53 74 61 72 74 52  (void){.  StartR
5c30: 65 73 70 6f 6e 73 65 28 22 35 30 30 20 43 47 49  esponse("500 CGI
5c40: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 45   Configuration E
5c50: 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75 74 20 2b  rror");.  nOut +
5c60: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22 43  = printf(.    "C
5c70: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
5c80: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
5c90: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 54 68 65   "\r\n".    "The
5ca0: 20 43 47 49 20 70 72 6f 67 72 61 6d 20 25 73 20   CGI program %s 
5cb0: 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20 75  is writable by u
5cc0: 73 65 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  sers other than 
5cd0: 69 74 73 20 6f 77 6e 65 72 2e 5c 6e 22 2c 0a 20  its owner.\n",. 
5ce0: 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 29 3b     zRealScript);
5cf0: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
5d00: 30 2c 20 31 34 30 29 3b 20 20 2f 2a 20 4c 4f 47  0, 140);  /* LOG
5d10: 3a 20 43 47 49 20 73 63 72 69 70 74 20 69 73 20  : CGI script is 
5d20: 77 72 69 74 61 62 6c 65 20 2a 2f 0a 20 20 65 78  writable */.  ex
5d30: 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a 7d 0a  it(0);       .}.
5d40: 0a 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20  ./*.** Tell the 
5d50: 63 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 20  client that the 
5d60: 73 65 72 76 65 72 20 6d 61 6c 66 75 6e 63 74 69  server malfuncti
5d70: 6f 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oned..*/.static 
5d80: 76 6f 69 64 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  void Malfunction
5d90: 28 69 6e 74 20 6c 69 6e 65 6e 75 6d 2c 20 63 6f  (int linenum, co
5da0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5db0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
5dc0: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
5dd0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
5de0: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
5df0: 22 35 30 30 20 53 65 72 76 65 72 20 4d 61 6c 66  "500 Server Malf
5e00: 75 6e 63 74 69 6f 6e 22 29 3b 0a 20 20 6e 4f 75  unction");.  nOu
5e10: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
5e20: 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20   "Content-type: 
5e30: 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a  text/plain\r\n".
5e40: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22      "\r\n".    "
5e50: 57 65 62 20 73 65 72 76 65 72 20 6d 61 6c 66 75  Web server malfu
5e60: 6e 63 74 69 6f 6e 65 64 3b 20 65 72 72 6f 72 20  nctioned; error 
5e70: 6e 75 6d 62 65 72 20 25 64 5c 6e 5c 6e 22 2c 20  number %d\n\n", 
5e80: 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 69 66 28 20  linenum);.  if( 
5e90: 7a 46 6f 72 6d 61 74 20 29 7b 0a 20 20 20 20 6e  zFormat ){.    n
5ea0: 4f 75 74 20 2b 3d 20 76 70 72 69 6e 74 66 28 7a  Out += vprintf(z
5eb0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
5ec0: 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28  .  MakeLogEntry(
5ed0: 30 2c 20 6c 69 6e 65 6e 75 6d 29 3b 0a 20 20 65  0, linenum);.  e
5ee0: 78 69 74 28 30 29 3b 20 20 20 20 20 20 20 0a 7d  xit(0);       .}
5ef0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 73 65 72  ../*.** Do a ser
5f00: 76 65 72 20 72 65 64 69 72 65 63 74 20 74 6f 20  ver redirect to 
5f10: 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 73 70 65  the document spe
5f20: 63 69 66 69 65 64 2e 20 20 54 68 65 20 64 6f 63  cified.  The doc
5f30: 75 6d 65 6e 74 0a 2a 2a 20 6e 61 6d 65 20 6e 6f  ument.** name no
5f40: 74 20 63 6f 6e 74 61 69 6e 20 73 63 68 65 6d 65  t contain scheme
5f50: 20 6f 72 20 6e 65 74 77 6f 72 6b 20 6c 6f 63 61   or network loca
5f60: 74 69 6f 6e 20 6f 72 20 74 68 65 20 71 75 65 72  tion or the quer
5f70: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 49 74 20  y string..** It 
5f80: 77 69 6c 6c 20 62 65 20 6a 75 73 74 20 74 68 65  will be just the
5f90: 20 70 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   path..*/.static
5fa0: 20 76 6f 69 64 20 52 65 64 69 72 65 63 74 28 63   void Redirect(c
5fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
5fc0: 2c 20 69 6e 74 20 66 69 6e 69 73 68 2c 20 69 6e  , int finish, in
5fd0: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61  t lineno){.  Sta
5fe0: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
5ff0: 54 65 6d 70 6f 72 61 72 79 20 52 65 64 69 72 65  Temporary Redire
6000: 63 74 22 29 3b 0a 20 20 69 66 28 20 7a 53 65 72  ct");.  if( zSer
6010: 76 65 72 50 6f 72 74 3d 3d 30 20 7c 7c 20 7a 53  verPort==0 || zS
6020: 65 72 76 65 72 50 6f 72 74 5b 30 5d 3d 3d 30 20  erverPort[0]==0 
6030: 7c 7c 20 73 74 72 63 6d 70 28 7a 53 65 72 76 65  || strcmp(zServe
6040: 72 50 6f 72 74 2c 22 38 30 22 29 3d 3d 30 20 29  rPort,"80")==0 )
6050: 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  {.    nOut += pr
6060: 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20  intf("Location: 
6070: 25 73 3a 2f 2f 25 73 25 73 25 73 5c 72 5c 6e 22  %s://%s%s%s\r\n"
6080: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6090: 20 20 20 20 20 7a 48 74 74 70 2c 20 7a 53 65 72       zHttp, zSer
60a0: 76 65 72 4e 61 6d 65 2c 20 7a 50 61 74 68 2c 20  verName, zPath, 
60b0: 7a 51 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20  zQuerySuffix);. 
60c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 75 74   }else{.    nOut
60d0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61   += printf("Loca
60e0: 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 3a 25 73  tion: %s://%s:%s
60f0: 25 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20  %s%s\r\n",.     
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 48                zH
6110: 74 74 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65  ttp, zServerName
6120: 2c 20 7a 53 65 72 76 65 72 50 6f 72 74 2c 20 7a  , zServerPort, z
6130: 50 61 74 68 2c 20 7a 51 75 65 72 79 53 75 66 66  Path, zQuerySuff
6140: 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ix);.  }.  if( f
6150: 69 6e 69 73 68 20 29 7b 0a 20 20 20 20 6e 4f 75  inish ){.    nOu
6160: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e  t += printf("Con
6170: 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 30 5c 72  tent-length: 0\r
6180: 5c 6e 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  \n");.    nOut +
6190: 3d 20 70 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29  = printf("\r\n")
61a0: 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  ;.    MakeLogEnt
61b0: 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  ry(0, lineno);. 
61c0: 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f   }.  fflush(stdo
61d0: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ut);.}../*.** Th
61e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 72 65 61  is function trea
61f0: 74 73 20 69 74 73 20 69 6e 70 75 74 20 61 73 20  ts its input as 
6200: 61 20 62 61 73 65 2d 36 34 20 73 74 72 69 6e 67  a base-64 string
6210: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
6220: 0a 2a 2a 20 64 65 63 6f 64 65 64 20 76 61 6c 75  .** decoded valu
6230: 65 20 6f 66 20 74 68 61 74 20 73 74 72 69 6e 67  e of that string
6240: 2e 20 20 43 68 61 72 61 63 74 65 72 73 20 6f 66  .  Characters of
6250: 20 69 6e 70 75 74 20 74 68 61 74 20 61 72 65 20   input that are 
6260: 6e 6f 74 0a 2a 2a 20 76 61 6c 69 64 20 62 61 73  not.** valid bas
6270: 65 2d 36 34 20 63 68 61 72 61 63 74 65 72 73 20  e-64 characters 
6280: 28 73 75 63 68 20 61 73 20 73 70 61 63 65 73 20  (such as spaces 
6290: 61 6e 64 20 6e 65 77 6c 69 6e 65 73 29 20 61 72  and newlines) ar
62a0: 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 76 6f  e ignored..*/.vo
62b0: 69 64 20 44 65 63 6f 64 65 36 34 28 63 68 61 72  id Decode64(char
62c0: 20 2a 7a 36 34 29 7b 0a 20 20 63 68 61 72 20 2a   *z64){.  char *
62d0: 7a 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 36 34  zData;.  int n64
62e0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
62f0: 69 6e 74 20 61 2c 20 62 2c 20 63 2c 20 64 3b 0a  int a, b, c, d;.
6300: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 49    static int isI
6310: 6e 69 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  nit = 0;.  stati
6320: 63 20 69 6e 74 20 74 72 61 6e 73 5b 31 32 38 5d  c int trans[128]
6330: 3b 0a 20 20 73 74 61 74 69 63 20 75 6e 73 69 67  ;.  static unsig
6340: 6e 65 64 20 63 68 61 72 20 7a 42 61 73 65 5b 5d  ned char zBase[]
6350: 20 3d 20 0a 20 20 20 20 22 41 42 43 44 45 46 47   = .    "ABCDEFG
6360: 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
6370: 58 59 5a 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  XYZabcdefghijklm
6380: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 30 31 32  nopqrstuvwxyz012
6390: 33 34 35 36 37 38 39 2b 2f 22 3b 0a 0a 20 20 69  3456789+/";..  i
63a0: 66 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20  f( !isInit ){.  
63b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
63c0: 3b 20 69 2b 2b 29 7b 20 74 72 61 6e 73 5b 69 5d  ; i++){ trans[i]
63d0: 20 3d 20 30 3b 20 7d 0a 20 20 20 20 66 6f 72 28   = 0; }.    for(
63e0: 69 3d 30 3b 20 7a 42 61 73 65 5b 69 5d 3b 20 69  i=0; zBase[i]; i
63f0: 2b 2b 29 7b 20 74 72 61 6e 73 5b 7a 42 61 73 65  ++){ trans[zBase
6400: 5b 69 5d 20 26 20 30 78 37 66 5d 20 3d 20 69 3b  [i] & 0x7f] = i;
6410: 20 7d 0a 20 20 20 20 69 73 49 6e 69 74 20 3d 20   }.    isInit = 
6420: 31 3b 0a 20 20 7d 0a 20 20 6e 36 34 20 3d 20 73  1;.  }.  n64 = s
6430: 74 72 6c 65 6e 28 7a 36 34 29 3b 0a 20 20 77 68  trlen(z64);.  wh
6440: 69 6c 65 28 20 6e 36 34 3e 30 20 26 26 20 7a 36  ile( n64>0 && z6
6450: 34 5b 6e 36 34 2d 31 5d 3d 3d 27 3d 27 20 29 20  4[n64-1]=='=' ) 
6460: 6e 36 34 2d 2d 3b 0a 20 20 7a 44 61 74 61 20 3d  n64--;.  zData =
6470: 20 7a 36 34 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d   z64;.  for(i=j=
6480: 30 3b 20 69 2b 33 3c 6e 36 34 3b 20 69 2b 3d 34  0; i+3<n64; i+=4
6490: 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73  ){.    a = trans
64a0: 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b  [z64[i] & 0x7f];
64b0: 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a  .    b = trans[z
64c0: 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b  64[i+1] & 0x7f];
64d0: 0a 20 20 20 20 63 20 3d 20 74 72 61 6e 73 5b 7a  .    c = trans[z
64e0: 36 34 5b 69 2b 32 5d 20 26 20 30 78 37 66 5d 3b  64[i+2] & 0x7f];
64f0: 0a 20 20 20 20 64 20 3d 20 74 72 61 6e 73 5b 7a  .    d = trans[z
6500: 36 34 5b 69 2b 33 5d 20 26 20 30 78 37 66 5d 3b  64[i+3] & 0x7f];
6510: 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20  .    zData[j++] 
6520: 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63  = ((a<<2) & 0xfc
6530: 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78  ) | ((b>>4) & 0x
6540: 30 33 29 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a  03);.    zData[j
6550: 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20 26 20  ++] = ((b<<4) & 
6560: 30 78 66 30 29 20 7c 20 28 28 63 3e 3e 32 29 20  0xf0) | ((c>>2) 
6570: 26 20 30 78 30 66 29 3b 0a 20 20 20 20 7a 44 61  & 0x0f);.    zDa
6580: 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 63 3c 3c 36  ta[j++] = ((c<<6
6590: 29 20 26 20 30 78 63 30 29 20 7c 20 28 64 20 26  ) & 0xc0) | (d &
65a0: 20 30 78 33 66 29 3b 0a 20 20 7d 0a 20 20 69 66   0x3f);.  }.  if
65b0: 28 20 69 2b 32 3c 6e 36 34 20 29 7b 0a 20 20 20  ( i+2<n64 ){.   
65c0: 20 61 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69   a = trans[z64[i
65d0: 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62  ] & 0x7f];.    b
65e0: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31   = trans[z64[i+1
65f0: 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63  ] & 0x7f];.    c
6600: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32   = trans[z64[i+2
6610: 5d 20 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a  ] & 0x7f];.    z
6620: 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c  Data[j++] = ((a<
6630: 3c 32 29 20 26 20 30 78 66 63 29 20 7c 20 28 28  <2) & 0xfc) | ((
6640: 62 3e 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20  b>>4) & 0x03);. 
6650: 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20     zData[j++] = 
6660: 28 28 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20  ((b<<4) & 0xf0) 
6670: 7c 20 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66  | ((c>>2) & 0x0f
6680: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
6690: 2b 31 3c 6e 36 34 20 29 7b 0a 20 20 20 20 61 20  +1<n64 ){.    a 
66a0: 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20 26  = trans[z64[i] &
66b0: 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d 20   0x7f];.    b = 
66c0: 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20 26  trans[z64[i+1] &
66d0: 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61 74   0x7f];.    zDat
66e0: 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32 29  a[j++] = ((a<<2)
66f0: 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e 3e   & 0xfc) | ((b>>
6700: 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 7d 0a  4) & 0x03);.  }.
6710: 20 20 7a 44 61 74 61 5b 6a 5d 20 3d 20 30 3b 0a    zData[j] = 0;.
6720: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
6730: 6f 20 73 65 65 20 69 66 20 62 61 73 69 63 20 61  o see if basic a
6740: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65  uthorization cre
6750: 64 65 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f  dentials are pro
6760: 76 69 64 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65  vided for.** the
6770: 20 75 73 65 72 20 61 63 63 6f 72 64 69 6e 67 20   user according 
6780: 74 6f 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  to the informati
6790: 6f 6e 20 69 6e 20 7a 41 75 74 68 46 69 6c 65 2e  on in zAuthFile.
67a0: 20 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a    Return true.**
67b0: 20 69 66 20 61 75 74 68 6f 72 69 7a 65 64 2e 20   if authorized. 
67c0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
67d0: 20 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 2e   not authorized.
67e0: 0a 2a 2a 0a 2a 2a 20 46 69 6c 65 20 66 6f 72 6d  .**.** File form
67f0: 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  at:.**.**    *  
6800: 42 6c 61 6e 6b 20 6c 69 6e 65 73 20 61 6e 64 20  Blank lines and 
6810: 6c 69 6e 65 73 20 74 68 61 74 20 62 65 67 69 6e  lines that begin
6820: 20 77 69 74 68 20 27 23 27 20 61 72 65 20 69 67   with '#' are ig
6830: 6e 6f 72 65 64 0a 2a 2a 20 20 20 20 2a 20 20 22  nored.**    *  "
6840: 68 74 74 70 2d 72 65 64 69 72 65 63 74 22 20 66  http-redirect" f
6850: 6f 72 63 65 73 20 61 20 72 65 64 69 72 65 63 74  orces a redirect
6860: 20 74 6f 20 48 54 54 50 53 20 69 66 20 6e 6f 74   to HTTPS if not
6870: 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 0a 2a   there already.*
6880: 2a 20 20 20 20 2a 20 20 22 68 74 74 70 73 2d 6f  *    *  "https-o
6890: 6e 6c 79 22 20 64 69 73 61 6c 6c 6f 77 73 20 6f  nly" disallows o
68a0: 70 65 72 61 74 69 6f 6e 20 69 6e 20 48 54 54 50  peration in HTTP
68b0: 0a 2a 2a 20 20 20 20 2a 20 20 22 75 73 65 72 20  .**    *  "user 
68c0: 4e 41 4d 45 20 4c 4f 47 49 4e 3a 50 41 53 53 57  NAME LOGIN:PASSW
68d0: 4f 52 44 22 20 63 68 65 63 6b 73 20 74 6f 20 73  ORD" checks to s
68e0: 65 65 20 69 66 20 4c 4f 47 49 4e 3a 50 41 53 53  ee if LOGIN:PASS
68f0: 57 4f 52 44 20 0a 2a 2a 20 20 20 20 20 20 20 61  WORD .**       a
6900: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 72 65  uthorization cre
6910: 64 65 6e 74 69 61 6c 73 20 61 72 65 20 70 72 6f  dentials are pro
6920: 76 69 64 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  vided, and if so
6930: 20 73 65 74 73 20 74 68 65 0a 2a 2a 20 20 20 20   sets the.**    
6940: 20 20 20 52 45 4d 4f 54 45 5f 55 53 45 52 20 74     REMOTE_USER t
6950: 6f 20 4e 41 4d 45 2e 0a 2a 2a 20 20 20 20 2a 20  o NAME..**    * 
6960: 20 22 72 65 61 6c 6d 20 54 45 58 54 22 20 73 65   "realm TEXT" se
6970: 74 73 20 74 68 65 20 72 65 61 6c 6d 20 74 6f 20  ts the realm to 
6980: 54 45 58 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  TEXT..*/.static 
6990: 69 6e 74 20 43 68 65 63 6b 42 61 73 69 63 41 75  int CheckBasicAu
69a0: 74 68 6f 72 69 7a 61 74 69 6f 6e 28 63 6f 6e 73  thorization(cons
69b0: 74 20 63 68 61 72 20 2a 7a 41 75 74 68 46 69 6c  t char *zAuthFil
69c0: 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  e){.  FILE *in;.
69d0: 20 20 63 68 61 72 20 2a 7a 52 65 61 6c 6d 20 3d    char *zRealm =
69e0: 20 22 75 6e 6b 6e 6f 77 6e 20 72 65 61 6c 6d 22   "unknown realm"
69f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e  ;.  char *zLogin
6a00: 50 73 77 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  Pswd;.  char *zN
6a10: 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e  ame;.  char zLin
6a20: 65 5b 32 30 30 30 5d 3b 0a 0a 20 20 69 6e 20 3d  e[2000];..  in =
6a30: 20 66 6f 70 65 6e 28 7a 41 75 74 68 46 69 6c 65   fopen(zAuthFile
6a40: 2c 20 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e  , "r");.  if( in
6a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f  ==0 ){.    NotFo
6a60: 75 6e 64 28 31 35 30 29 3b 20 20 2f 2a 20 4c 4f  und(150);  /* LO
6a70: 47 3a 20 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d  G: Cannot open -
6a80: 61 75 74 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20  auth file */.   
6a90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6aa0: 20 69 66 28 20 7a 41 75 74 68 41 72 67 20 29 20   if( zAuthArg ) 
6ab0: 44 65 63 6f 64 65 36 34 28 7a 41 75 74 68 41 72  Decode64(zAuthAr
6ac0: 67 29 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  g);.  while( fge
6ad0: 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66  ts(zLine, sizeof
6ae0: 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 20 29 7b 0a  (zLine), in) ){.
6af0: 20 20 20 20 63 68 61 72 20 2a 7a 46 69 65 6c 64      char *zField
6b00: 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Name;.    char *
6b10: 7a 56 61 6c 3b 0a 0a 20 20 20 20 7a 46 69 65 6c  zVal;..    zFiel
6b20: 64 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74  dName = GetFirst
6b30: 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a  Element(zLine,&z
6b40: 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  Val);.    if( zF
6b50: 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a  ieldName==0 || *
6b60: 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20  zFieldName==0 ) 
6b70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
6b80: 28 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 30 5d 3d  ( zFieldName[0]=
6b90: 3d 27 23 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='#' ) continue;
6ba0: 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69  .    RemoveNewli
6bb0: 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66  ne(zVal);.    if
6bc0: 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e  ( strcmp(zFieldN
6bd0: 61 6d 65 2c 20 22 72 65 61 6c 6d 22 29 3d 3d 30  ame, "realm")==0
6be0: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 61 6c 6d   ){.      zRealm
6bf0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
6c00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
6c10: 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  trcmp(zFieldName
6c20: 2c 22 75 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20  ,"user")==0 ){. 
6c30: 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 41 72       if( zAuthAr
6c40: 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  g==0 ) continue;
6c50: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 47  .      zName = G
6c60: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
6c70: 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20  Val, &zVal);.   
6c80: 20 20 20 7a 4c 6f 67 69 6e 50 73 77 64 20 3d 20     zLoginPswd = 
6c90: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
6ca0: 7a 56 61 6c 2c 20 26 7a 56 61 6c 29 3b 0a 20 20  zVal, &zVal);.  
6cb0: 20 20 20 20 69 66 28 20 7a 4c 6f 67 69 6e 50 73      if( zLoginPs
6cc0: 77 64 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  wd==0 ) continue
6cd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 75 74  ;.      if( zAut
6ce0: 68 41 72 67 20 26 26 20 73 74 72 63 6d 70 28 7a  hArg && strcmp(z
6cf0: 41 75 74 68 41 72 67 2c 7a 4c 6f 67 69 6e 50 73  AuthArg,zLoginPs
6d00: 77 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  wd)==0 ){.      
6d10: 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d 20    zRemoteUser = 
6d20: 53 74 72 44 75 70 28 7a 4e 61 6d 65 29 3b 0a 20  StrDup(zName);. 
6d30: 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e         fclose(in
6d40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
6d50: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
6d60: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6d70: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74  p(zFieldName,"ht
6d80: 74 70 73 2d 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  tps-only")==0 ){
6d90: 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48  .      if( !useH
6da0: 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ttps ){.        
6db0: 4e 6f 74 46 6f 75 6e 64 28 31 36 30 29 3b 20 20  NotFound(160);  
6dc0: 2f 2a 20 4c 4f 47 3a 20 20 68 74 74 70 20 72 65  /* LOG:  http re
6dd0: 71 75 65 73 74 20 6f 6e 20 68 74 74 70 73 2d 6f  quest on https-o
6de0: 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  nly page */.    
6df0: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
6e00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
6e10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6e20: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6e30: 46 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 2d  FieldName,"http-
6e40: 72 65 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b  redirect")==0 ){
6e50: 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65 48  .      if( !useH
6e60: 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ttps ){.        
6e70: 7a 48 74 74 70 20 3d 20 22 68 74 74 70 73 22 3b  zHttp = "https";
6e80: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
6e90: 28 7a 4c 69 6e 65 2c 20 22 25 73 25 73 22 2c 20  (zLine, "%s%s", 
6ea0: 7a 53 63 72 69 70 74 2c 20 7a 50 61 74 68 49 6e  zScript, zPathIn
6eb0: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 52 65 64  fo);.        Red
6ec0: 69 72 65 63 74 28 7a 4c 69 6e 65 2c 20 31 2c 20  irect(zLine, 1, 
6ed0: 31 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 2d 61  170); /* LOG: -a
6ee0: 75 74 68 20 72 65 64 69 72 65 63 74 20 2a 2f 0a  uth redirect */.
6ef0: 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69          fclose(i
6f00: 6e 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  n);.        retu
6f10: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
6f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4e    }else{.      N
6f30: 6f 74 46 6f 75 6e 64 28 31 38 30 29 3b 20 20 2f  otFound(180);  /
6f40: 2a 20 4c 4f 47 3a 20 20 6d 61 6c 66 6f 72 6d 65  * LOG:  malforme
6f50: 64 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74 68  d entry in -auth
6f60: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 66   file */.      f
6f70: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
6f80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6f90: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
6fa0: 29 3b 0a 20 20 4e 6f 74 41 75 74 68 6f 72 69 7a  );.  NotAuthoriz
6fb0: 65 64 28 7a 52 65 61 6c 6d 29 3b 0a 20 20 72 65  ed(zRealm);.  re
6fc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
6fd0: 20 47 75 65 73 73 20 74 68 65 20 6d 69 6d 65 2d   Guess the mime-
6fe0: 74 79 70 65 20 6f 66 20 61 20 64 6f 63 75 6d 65  type of a docume
6ff0: 6e 74 20 62 61 73 65 64 20 6f 6e 20 69 74 73 20  nt based on its 
7000: 6e 61 6d 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  name..*/.const c
7010: 68 61 72 20 2a 47 65 74 4d 69 6d 65 54 79 70 65  har *GetMimeType
7020: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
7030: 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a  me, int nName){.
7040: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
7050: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7060: 66 69 72 73 74 2c 20 6c 61 73 74 3b 0a 20 20 69  first, last;.  i
7070: 6e 74 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 7a  nt len;.  char z
7080: 53 75 66 66 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f  Suffix[20];..  /
7090: 2a 20 41 20 74 61 62 6c 65 20 6f 66 20 6d 69 6d  * A table of mim
70a0: 65 74 79 70 65 73 20 62 61 73 65 64 20 6f 6e 20  etypes based on 
70b0: 66 69 6c 65 20 73 75 66 66 69 78 65 73 2e 20 0a  file suffixes. .
70c0: 20 20 2a 2a 20 53 75 66 66 69 78 65 73 20 6d 75    ** Suffixes mu
70d0: 73 74 20 62 65 20 69 6e 20 73 6f 72 74 65 64 20  st be in sorted 
70e0: 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 77 65  order so that we
70f0: 20 63 61 6e 20 64 6f 20 61 20 62 69 6e 61 72 79   can do a binary
7100: 0a 20 20 2a 2a 20 73 65 61 72 63 68 20 74 6f 20  .  ** search to 
7110: 66 69 6e 64 20 74 68 65 20 6d 69 6d 65 2d 74 79  find the mime-ty
7120: 70 65 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  pe.  */.  static
7130: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
7140: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7150: 7a 53 75 66 66 69 78 3b 20 20 20 20 20 20 20 2f  zSuffix;       /
7160: 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
7170: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 69 7a  x */.    int siz
7180: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7190: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
71a0: 20 74 68 65 20 73 75 66 66 69 78 20 2a 2f 0a 20   the suffix */. 
71b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
71c0: 4d 69 6d 65 74 79 70 65 3b 20 20 20 20 20 2f 2a  Mimetype;     /*
71d0: 20 54 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   The correspondi
71e0: 6e 67 20 6d 69 6d 65 74 79 70 65 20 2a 2f 0a 20  ng mimetype */. 
71f0: 20 7d 20 61 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20   } aMime[] = {. 
7200: 20 20 20 7b 20 22 61 69 22 2c 20 20 20 20 20 20     { "ai",      
7210: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
7220: 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20  on/postscript"  
7230: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7240: 20 7b 20 22 61 69 66 22 2c 20 20 20 20 20 20 20   { "aif",       
7250: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66   3, "audio/x-aif
7260: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
7270: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7280: 20 22 61 69 66 63 22 2c 20 20 20 20 20 20 20 34   "aifc",       4
7290: 2c 20 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22  , "audio/x-aiff"
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
72c0: 61 69 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20  aiff",       4, 
72d0: 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20  "audio/x-aiff"  
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 72      },.    { "ar
7300: 6a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  j",        3, "a
7310: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 61 72 6a  pplication/x-arj
7320: 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20  -compressed"    
7330: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 73 63 22    },.    { "asc"
7340: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
7350: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 7d 2c 0a 20 20 20 20 7b 20 22 61 73 66 22 2c 20  },.    { "asf", 
7380: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
7390: 2f 78 2d 6d 73 2d 61 73 66 22 20 20 20 20 20 20  /x-ms-asf"      
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
73b0: 0a 20 20 20 20 7b 20 22 61 73 78 22 2c 20 20 20  .    { "asx",   
73c0: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
73d0: 2d 6d 73 2d 61 73 78 22 20 20 20 20 20 20 20 20  -ms-asx"        
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
73f0: 20 20 20 7b 20 22 61 75 22 2c 20 20 20 20 20 20     { "au",      
7400: 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 75 6c 61     2, "audio/ula
7410: 77 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w"              
7420: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7430: 20 7b 20 22 61 76 69 22 2c 20 20 20 20 20 20 20   { "avi",       
7440: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 76   3, "video/x-msv
7450: 69 64 65 6f 22 20 20 20 20 20 20 20 20 20 20 20  ideo"           
7460: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7470: 20 22 62 61 74 22 2c 20 20 20 20 20 20 20 20 33   "bat",        3
7480: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7490: 2d 6d 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20  -msdos-program" 
74a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
74b0: 62 63 70 69 6f 22 2c 20 20 20 20 20 20 35 2c 20  bcpio",      5, 
74c0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 62  "application/x-b
74d0: 63 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20  cpio"           
74e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 69      },.    { "bi
74f0: 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  n",        3, "a
7500: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
7510: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
7520: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 22 2c 20    },.    { "c", 
7530: 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65 78           1, "tex
7540: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 7d 2c 0a 20 20 20 20 7b 20 22 63 63 22 2c 20 20  },.    { "cc",  
7570: 20 20 20 20 20 20 20 32 2c 20 22 74 65 78 74 2f         2, "text/
7580: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
75a0: 0a 20 20 20 20 7b 20 22 63 63 61 64 22 2c 20 20  .    { "ccad",  
75b0: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
75c0: 74 69 6f 6e 2f 63 6c 61 72 69 73 63 61 64 22 20  tion/clariscad" 
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
75e0: 20 20 20 7b 20 22 63 64 66 22 2c 20 20 20 20 20     { "cdf",     
75f0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7600: 6f 6e 2f 78 2d 6e 65 74 63 64 66 22 20 20 20 20  on/x-netcdf"    
7610: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7620: 20 7b 20 22 63 6c 61 73 73 22 2c 20 20 20 20 20   { "class",     
7630: 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   5, "application
7640: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
7650: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7660: 20 22 63 6f 64 22 2c 20 20 20 20 20 20 20 20 33   "cod",        3
7670: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
7680: 6e 64 2e 72 69 6d 2e 63 6f 64 22 20 20 20 20 20  nd.rim.cod"     
7690: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
76a0: 63 6f 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  com",        3, 
76b0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d  "application/x-m
76c0: 73 64 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20  sdos-program"   
76d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70      },.    { "cp
76e0: 69 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  io",       4, "a
76f0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 70 69  pplication/x-cpi
7700: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
7710: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 70 74 22    },.    { "cpt"
7720: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7730: 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d  lication/mac-com
7740: 70 61 63 74 70 72 6f 22 20 20 20 20 20 20 20 20  pactpro"        
7750: 7d 2c 0a 20 20 20 20 7b 20 22 63 73 68 22 2c 20  },.    { "csh", 
7760: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7770: 63 61 74 69 6f 6e 2f 78 2d 63 73 68 22 20 20 20  cation/x-csh"   
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7790: 0a 20 20 20 20 7b 20 22 63 73 73 22 2c 20 20 20  .    { "css",   
77a0: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 63 73       3, "text/cs
77b0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
77d0: 20 20 20 7b 20 22 64 63 72 22 2c 20 20 20 20 20     { "dcr",     
77e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
77f0: 6f 6e 2f 78 2d 64 69 72 65 63 74 6f 72 22 20 20  on/x-director"  
7800: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7810: 20 7b 20 22 64 65 62 22 2c 20 20 20 20 20 20 20   { "deb",       
7820: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7830: 2f 78 2d 64 65 62 69 61 6e 2d 70 61 63 6b 61 67  /x-debian-packag
7840: 65 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  e"      },.    {
7850: 20 22 64 69 72 22 2c 20 20 20 20 20 20 20 20 33   "dir",        3
7860: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7870: 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20  -director"      
7880: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7890: 64 6c 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  dl",         2, 
78a0: 22 76 69 64 65 6f 2f 64 6c 22 20 20 20 20 20 20  "video/dl"      
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6d      },.    { "dm
78d0: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
78e0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74  pplication/octet
78f0: 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20 20  -stream"        
7900: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6f 63 22    },.    { "doc"
7910: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7920: 6c 69 63 61 74 69 6f 6e 2f 6d 73 77 6f 72 64 22  lication/msword"
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7940: 7d 2c 0a 20 20 20 20 7b 20 22 64 72 77 22 2c 20  },.    { "drw", 
7950: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7960: 63 61 74 69 6f 6e 2f 64 72 61 66 74 69 6e 67 22  cation/drafting"
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7980: 0a 20 20 20 20 7b 20 22 64 76 69 22 2c 20 20 20  .    { "dvi",   
7990: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
79a0: 74 69 6f 6e 2f 78 2d 64 76 69 22 20 20 20 20 20  tion/x-dvi"     
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
79c0: 20 20 20 7b 20 22 64 77 67 22 2c 20 20 20 20 20     { "dwg",     
79d0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
79e0: 6f 6e 2f 61 63 61 64 22 20 20 20 20 20 20 20 20  on/acad"        
79f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7a00: 20 7b 20 22 64 78 66 22 2c 20 20 20 20 20 20 20   { "dxf",       
7a10: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7a20: 2f 64 78 66 22 20 20 20 20 20 20 20 20 20 20 20  /dxf"           
7a30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7a40: 20 22 64 78 72 22 2c 20 20 20 20 20 20 20 20 33   "dxr",        3
7a50: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7a60: 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20  -director"      
7a70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7a80: 65 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  eps",        3, 
7a90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73  "application/pos
7aa0: 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  tscript"        
7ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 74      },.    { "et
7ac0: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  x",        3, "t
7ad0: 65 78 74 2f 78 2d 73 65 74 65 78 74 22 20 20 20  ext/x-setext"   
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 65 22    },.    { "exe"
7b00: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7b10: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
7b20: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
7b30: 7d 2c 0a 20 20 20 20 7b 20 22 65 7a 22 2c 20 20  },.    { "ez",  
7b40: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
7b50: 63 61 74 69 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e  cation/andrew-in
7b60: 73 65 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  set"          },
7b70: 0a 20 20 20 20 7b 20 22 66 22 2c 20 20 20 20 20  .    { "f",     
7b80: 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c       1, "text/pl
7b90: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7bb0: 20 20 20 7b 20 22 66 39 30 22 2c 20 20 20 20 20     { "f90",     
7bc0: 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69     3, "text/plai
7bd0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
7be0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7bf0: 20 7b 20 22 66 6c 69 22 2c 20 20 20 20 20 20 20   { "fli",       
7c00: 20 33 2c 20 22 76 69 64 65 6f 2f 66 6c 69 22 20   3, "video/fli" 
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7c30: 20 22 66 6c 76 22 2c 20 20 20 20 20 20 20 20 33   "flv",        3
7c40: 2c 20 22 76 69 64 65 6f 2f 66 6c 76 22 20 20 20  , "video/flv"   
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7c70: 67 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  gif",        3, 
7c80: 22 69 6d 61 67 65 2f 67 69 66 22 20 20 20 20 20  "image/gif"     
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 6c      },.    { "gl
7cb0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76  ",         2, "v
7cc0: 69 64 65 6f 2f 67 6c 22 20 20 20 20 20 20 20 20  ideo/gl"        
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 74 61 72    },.    { "gtar
7cf0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
7d00: 6c 69 63 61 74 69 6f 6e 2f 78 2d 67 74 61 72 22  lication/x-gtar"
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 7d 2c 0a 20 20 20 20 7b 20 22 67 7a 22 2c 20 20  },.    { "gz",  
7d30: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
7d40: 63 61 74 69 6f 6e 2f 78 2d 67 7a 69 70 22 20 20  cation/x-gzip"  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7d60: 0a 20 20 20 20 7b 20 22 68 64 66 22 2c 20 20 20  .    { "hdf",   
7d70: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7d80: 74 69 6f 6e 2f 78 2d 68 64 66 22 20 20 20 20 20  tion/x-hdf"     
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7da0: 20 20 20 7b 20 22 68 68 22 2c 20 20 20 20 20 20     { "hh",      
7db0: 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69     2, "text/plai
7dc0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
7dd0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7de0: 20 7b 20 22 68 71 78 22 2c 20 20 20 20 20 20 20   { "hqx",       
7df0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7e00: 2f 6d 61 63 2d 62 69 6e 68 65 78 34 30 22 20 20  /mac-binhex40"  
7e10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7e20: 20 22 68 22 2c 20 20 20 20 20 20 20 20 20 20 31   "h",          1
7e30: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7e60: 68 74 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  htm",        3, 
7e70: 22 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72  "text/html; char
7e80: 73 65 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20  set=utf-8"      
7e90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74      },.    { "ht
7ea0: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 74  ml",       4, "t
7eb0: 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65  ext/html; charse
7ec0: 74 3d 75 74 66 2d 38 22 20 20 20 20 20 20 20 20  t=utf-8"        
7ed0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 63 65 22    },.    { "ice"
7ee0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 78 2d 63  ,        3, "x-c
7ef0: 6f 6e 66 65 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c  onference/x-cool
7f00: 74 61 6c 6b 22 20 20 20 20 20 20 20 20 20 20 20  talk"           
7f10: 7d 2c 0a 20 20 20 20 7b 20 22 69 65 66 22 2c 20  },.    { "ief", 
7f20: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
7f30: 2f 69 65 66 22 20 20 20 20 20 20 20 20 20 20 20  /ief"           
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7f50: 0a 20 20 20 20 7b 20 22 69 67 65 73 22 2c 20 20  .    { "iges",  
7f60: 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 69       4, "model/i
7f70: 67 65 73 22 20 20 20 20 20 20 20 20 20 20 20 20  ges"            
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7f90: 20 20 20 7b 20 22 69 67 73 22 2c 20 20 20 20 20     { "igs",     
7fa0: 20 20 20 33 2c 20 22 6d 6f 64 65 6c 2f 69 67 65     3, "model/ige
7fb0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
7fc0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7fd0: 20 7b 20 22 69 70 73 22 2c 20 20 20 20 20 20 20   { "ips",       
7fe0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7ff0: 2f 78 2d 69 70 73 63 72 69 70 74 22 20 20 20 20  /x-ipscript"    
8000: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8010: 20 22 69 70 78 22 2c 20 20 20 20 20 20 20 20 33   "ipx",        3
8020: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8030: 2d 69 70 69 78 22 20 20 20 20 20 20 20 20 20 20  -ipix"          
8040: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8050: 6a 61 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  jad",        3, 
8060: 22 74 65 78 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32  "text/vnd.sun.j2
8070: 6d 65 2e 61 70 70 2d 64 65 73 63 72 69 70 74 6f  me.app-descripto
8080: 72 22 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61  r"  },.    { "ja
8090: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
80a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 61 76 61 2d  pplication/java-
80b0: 61 72 63 68 69 76 65 22 20 20 20 20 20 20 20 20  archive"        
80c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 67    },.    { "jpeg
80d0: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61  ",       4, "ima
80e0: 67 65 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20  ge/jpeg"        
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 7d 2c 0a 20 20 20 20 7b 20 22 6a 70 65 22 2c 20  },.    { "jpe", 
8110: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8120: 2f 6a 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /jpeg"          
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8140: 0a 20 20 20 20 7b 20 22 6a 70 67 22 2c 20 20 20  .    { "jpg",   
8150: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a       3, "image/j
8160: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
8170: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8180: 20 20 20 7b 20 22 6a 73 22 2c 20 20 20 20 20 20     { "js",      
8190: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
81a0: 6f 6e 2f 78 2d 6a 61 76 61 73 63 72 69 70 74 22  on/x-javascript"
81b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
81c0: 20 7b 20 22 6b 61 72 22 2c 20 20 20 20 20 20 20   { "kar",       
81d0: 20 33 2c 20 22 61 75 64 69 6f 2f 6d 69 64 69 22   3, "audio/midi"
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8200: 20 22 6c 61 74 65 78 22 2c 20 20 20 20 20 20 35   "latex",      5
8210: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8220: 2d 6c 61 74 65 78 22 20 20 20 20 20 20 20 20 20  -latex"         
8230: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8240: 6c 68 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  lha",        3, 
8250: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
8260: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
8270: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 73      },.    { "ls
8280: 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  p",        3, "a
8290: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 69 73  pplication/x-lis
82a0: 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p"              
82b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 7a 68 22    },.    { "lzh"
82c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
82d0: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
82e0: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
82f0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 22 2c 20 20 20  },.    { "m",   
8300: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
8310: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8330: 0a 20 20 20 20 7b 20 22 6d 33 75 22 2c 20 20 20  .    { "m3u",   
8340: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
8350: 2d 6d 70 65 67 75 72 6c 22 20 20 20 20 20 20 20  -mpegurl"       
8360: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8370: 20 20 20 7b 20 22 6d 61 6e 22 2c 20 20 20 20 20     { "man",     
8380: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8390: 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 61 6e 22 20  on/x-troff-man" 
83a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
83b0: 20 7b 20 22 6d 65 22 2c 20 20 20 20 20 20 20 20   { "me",        
83c0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
83d0: 2f 78 2d 74 72 6f 66 66 2d 6d 65 22 20 20 20 20  /x-troff-me"    
83e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
83f0: 20 22 6d 65 73 68 22 2c 20 20 20 20 20 20 20 34   "mesh",       4
8400: 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20  , "model/mesh"  
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8430: 6d 69 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mid",        3, 
8440: 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20  "audio/midi"    
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69      },.    { "mi
8470: 64 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  di",       4, "a
8480: 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20  udio/midi"      
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 66 22    },.    { "mif"
84b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
84c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 69 66 22 20  lication/x-mif" 
84d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84e0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 6d 65 22 2c  },.    { "mime",
84f0: 20 20 20 20 20 20 20 34 2c 20 22 77 77 77 2f 6d         4, "www/m
8500: 69 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ime"            
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8520: 0a 20 20 20 20 7b 20 22 6d 6f 76 69 65 22 2c 20  .    { "movie", 
8530: 20 20 20 20 20 35 2c 20 22 76 69 64 65 6f 2f 78       5, "video/x
8540: 2d 73 67 69 2d 6d 6f 76 69 65 22 20 20 20 20 20  -sgi-movie"     
8550: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8560: 20 20 20 7b 20 22 6d 6f 76 22 2c 20 20 20 20 20     { "mov",     
8570: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 71 75 69     3, "video/qui
8580: 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20  cktime"         
8590: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
85a0: 20 7b 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20   { "mp2",       
85b0: 20 33 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22   3, "audio/mpeg"
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
85e0: 20 22 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33   "mp2",        3
85f0: 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20  , "video/mpeg"  
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8620: 6d 70 33 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mp3",        3, 
8630: 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20  "audio/mpeg"    
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
8660: 65 67 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76  eg",       4, "v
8670: 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  ideo/mpeg"      
8680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8690: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 22    },.    { "mpe"
86a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
86b0: 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  eo/mpeg"        
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 67 61 22 2c  },.    { "mpga",
86e0: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
86f0: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8710: 0a 20 20 20 20 7b 20 22 6d 70 67 22 2c 20 20 20  .    { "mpg",   
8720: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d       3, "video/m
8730: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
8740: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8750: 20 20 20 7b 20 22 6d 73 22 2c 20 20 20 20 20 20     { "ms",      
8760: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
8770: 6f 6e 2f 78 2d 74 72 6f 66 66 2d 6d 73 22 20 20  on/x-troff-ms"  
8780: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8790: 20 7b 20 22 6d 73 68 22 2c 20 20 20 20 20 20 20   { "msh",       
87a0: 20 33 2c 20 22 6d 6f 64 65 6c 2f 6d 65 73 68 22   3, "model/mesh"
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
87d0: 20 22 6e 63 22 2c 20 20 20 20 20 20 20 20 20 32   "nc",         2
87e0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
87f0: 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20  -netcdf"        
8800: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8810: 6f 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  oda",        3, 
8820: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 64 61  "application/oda
8830: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8840: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67      },.    { "og
8850: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  g",        3, "a
8860: 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20  pplication/ogg" 
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 6d 22    },.    { "ogm"
8890: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
88a0: 6c 69 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20  lication/ogg"   
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 7d 2c 0a 20 20 20 20 7b 20 22 70 62 6d 22 2c 20  },.    { "pbm", 
88d0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
88e0: 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 62 69 74 6d  /x-portable-bitm
88f0: 61 70 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ap"           },
8900: 0a 20 20 20 20 7b 20 22 70 64 62 22 2c 20 20 20  .    { "pdb",   
8910: 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61       3, "chemica
8920: 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20  l/x-pdb"        
8930: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8940: 20 20 20 7b 20 22 70 64 66 22 2c 20 20 20 20 20     { "pdf",     
8950: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8960: 6f 6e 2f 70 64 66 22 20 20 20 20 20 20 20 20 20  on/pdf"         
8970: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8980: 20 7b 20 22 70 67 6d 22 2c 20 20 20 20 20 20 20   { "pgm",       
8990: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
89a0: 74 61 62 6c 65 2d 67 72 61 79 6d 61 70 22 20 20  table-graymap"  
89b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
89c0: 20 22 70 67 6e 22 2c 20 20 20 20 20 20 20 20 33   "pgn",        3
89d0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
89e0: 2d 63 68 65 73 73 2d 70 67 6e 22 20 20 20 20 20  -chess-pgn"     
89f0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8a00: 70 67 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pgp",        3, 
8a10: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 67 70  "application/pgp
8a20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8a30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6c      },.    { "pl
8a40: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
8a50: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72  pplication/x-per
8a60: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
8a70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6d 22 2c    },.    { "pm",
8a80: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
8a90: 6c 69 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22  lication/x-perl"
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ab0: 7d 2c 0a 20 20 20 20 7b 20 22 70 6e 67 22 2c 20  },.    { "png", 
8ac0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8ad0: 2f 70 6e 67 22 20 20 20 20 20 20 20 20 20 20 20  /png"           
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8af0: 0a 20 20 20 20 7b 20 22 70 6e 6d 22 2c 20 20 20  .    { "pnm",   
8b00: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
8b10: 2d 70 6f 72 74 61 62 6c 65 2d 61 6e 79 6d 61 70  -portable-anymap
8b20: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
8b30: 20 20 20 7b 20 22 70 6f 74 22 2c 20 20 20 20 20     { "pot",     
8b40: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8b50: 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22  on/mspowerpoint"
8b60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8b70: 20 7b 20 22 70 70 6d 22 2c 20 20 20 20 20 20 20   { "ppm",       
8b80: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
8b90: 74 61 62 6c 65 2d 70 69 78 6d 61 70 22 20 20 20  table-pixmap"   
8ba0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8bb0: 20 22 70 70 73 22 2c 20 20 20 20 20 20 20 20 33   "pps",        3
8bc0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
8bd0: 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20  spowerpoint"    
8be0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8bf0: 70 70 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ppt",        3, 
8c00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70  "application/msp
8c10: 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20  owerpoint"      
8c20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
8c30: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  z",        3, "a
8c40: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
8c50: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
8c60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 72 65 22    },.    { "pre"
8c70: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8c80: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 72 65 65 6c  lication/x-freel
8c90: 61 6e 63 65 22 20 20 20 20 20 20 20 20 20 20 20  ance"           
8ca0: 7d 2c 0a 20 20 20 20 7b 20 22 70 72 74 22 2c 20  },.    { "prt", 
8cb0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8cc0: 63 61 74 69 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20  cation/pro_eng" 
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8ce0: 0a 20 20 20 20 7b 20 22 70 73 22 2c 20 20 20 20  .    { "ps",    
8cf0: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
8d00: 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22  tion/postscript"
8d10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8d20: 20 20 20 7b 20 22 71 74 22 2c 20 20 20 20 20 20     { "qt",      
8d30: 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 71 75 69     2, "video/qui
8d40: 63 6b 74 69 6d 65 22 20 20 20 20 20 20 20 20 20  cktime"         
8d50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8d60: 20 7b 20 22 72 61 22 2c 20 20 20 20 20 20 20 20   { "ra",        
8d70: 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 72 65 61   2, "audio/x-rea
8d80: 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  laudio"         
8d90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8da0: 20 22 72 61 6d 22 2c 20 20 20 20 20 20 20 20 33   "ram",        3
8db0: 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65  , "audio/x-pn-re
8dc0: 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20 20  alaudio"        
8dd0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8de0: 72 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rar",        3, 
8df0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 72  "application/x-r
8e00: 61 72 2d 63 6f 6d 70 72 65 73 73 65 64 22 20 20  ar-compressed"  
8e10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
8e20: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  s",        3, "i
8e30: 6d 61 67 65 2f 63 6d 75 2d 72 61 73 74 65 72 22  mage/cmu-raster"
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22    },.    { "ras"
8e60: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
8e70: 67 65 2f 78 2d 63 6d 75 2d 72 61 73 74 65 72 22  ge/x-cmu-raster"
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 7d 2c 0a 20 20 20 20 7b 20 22 72 67 62 22 2c 20  },.    { "rgb", 
8ea0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8eb0: 2f 78 2d 72 67 62 22 20 20 20 20 20 20 20 20 20  /x-rgb"         
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8ed0: 0a 20 20 20 20 7b 20 22 72 6d 22 2c 20 20 20 20  .    { "rm",    
8ee0: 20 20 20 20 20 32 2c 20 22 61 75 64 69 6f 2f 78       2, "audio/x
8ef0: 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22 20 20  -pn-realaudio"  
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8f10: 20 20 20 7b 20 22 72 6f 66 66 22 2c 20 20 20 20     { "roff",    
8f20: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
8f30: 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20  on/x-troff"     
8f40: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8f50: 20 7b 20 22 72 70 6d 22 2c 20 20 20 20 20 20 20   { "rpm",       
8f60: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d   3, "audio/x-pn-
8f70: 72 65 61 6c 61 75 64 69 6f 2d 70 6c 75 67 69 6e  realaudio-plugin
8f80: 22 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  "       },.    {
8f90: 20 22 72 74 66 22 2c 20 20 20 20 20 20 20 20 33   "rtf",        3
8fa0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72  , "application/r
8fb0: 74 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  tf"             
8fc0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8fd0: 72 74 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rtf",        3, 
8fe0: 22 74 65 78 74 2f 72 74 66 22 20 20 20 20 20 20  "text/rtf"      
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74      },.    { "rt
9010: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  x",        3, "t
9020: 65 78 74 2f 72 69 63 68 74 65 78 74 22 20 20 20  ext/richtext"   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 63 6d 22    },.    { "scm"
9050: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9060: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73  lication/x-lotus
9070: 73 63 72 65 65 6e 63 61 6d 22 20 20 20 20 20 20  screencam"      
9080: 7d 2c 0a 20 20 20 20 7b 20 22 73 65 74 22 2c 20  },.    { "set", 
9090: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
90a0: 63 61 74 69 6f 6e 2f 73 65 74 22 20 20 20 20 20  cation/set"     
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
90c0: 0a 20 20 20 20 7b 20 22 73 67 6d 6c 22 2c 20 20  .    { "sgml",  
90d0: 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 73 67       4, "text/sg
90e0: 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ml"             
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9100: 20 20 20 7b 20 22 73 67 6d 22 2c 20 20 20 20 20     { "sgm",     
9110: 20 20 20 33 2c 20 22 74 65 78 74 2f 73 67 6d 6c     3, "text/sgml
9120: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9130: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9140: 20 7b 20 22 73 68 22 2c 20 20 20 20 20 20 20 20   { "sh",        
9150: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
9160: 2f 78 2d 73 68 22 20 20 20 20 20 20 20 20 20 20  /x-sh"          
9170: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9180: 20 22 73 68 61 72 22 2c 20 20 20 20 20 20 20 34   "shar",       4
9190: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
91a0: 2d 73 68 61 72 22 20 20 20 20 20 20 20 20 20 20  -shar"          
91b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
91c0: 73 69 6c 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  silo",       4, 
91d0: 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20  "model/mesh"    
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69      },.    { "si
9200: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
9210: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 74 75  pplication/x-stu
9220: 66 66 69 74 22 20 20 20 20 20 20 20 20 20 20 20  ffit"           
9230: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 64 22    },.    { "skd"
9240: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9250: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22  lication/x-koan"
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 7d 2c 0a 20 20 20 20 7b 20 22 73 6b 6d 22 2c 20  },.    { "skm", 
9280: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9290: 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20  cation/x-koan"  
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
92b0: 0a 20 20 20 20 7b 20 22 73 6b 70 22 2c 20 20 20  .    { "skp",   
92c0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
92d0: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
92f0: 20 20 20 7b 20 22 73 6b 74 22 2c 20 20 20 20 20     { "skt",     
9300: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9310: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
9320: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9330: 20 7b 20 22 73 6d 69 22 2c 20 20 20 20 20 20 20   { "smi",       
9340: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9350: 2f 73 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20  /smil"          
9360: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9370: 20 22 73 6d 69 6c 22 2c 20 20 20 20 20 20 20 34   "smil",       4
9380: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73  , "application/s
9390: 6d 69 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  mil"            
93a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
93b0: 73 6e 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20  snd",        3, 
93c0: 22 61 75 64 69 6f 2f 62 61 73 69 63 22 20 20 20  "audio/basic"   
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6f      },.    { "so
93f0: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
9400: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6f 6c 69 64  pplication/solid
9410: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
9420: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 6c 22    },.    { "spl"
9430: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9440: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 75 74 75 72  lication/x-futur
9450: 65 73 70 6c 61 73 68 22 20 20 20 20 20 20 20 20  esplash"        
9460: 7d 2c 0a 20 20 20 20 7b 20 22 73 72 63 22 2c 20  },.    { "src", 
9470: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9480: 63 61 74 69 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f  cation/x-wais-so
9490: 75 72 63 65 22 20 20 20 20 20 20 20 20 20 7d 2c  urce"         },
94a0: 0a 20 20 20 20 7b 20 22 73 74 65 70 22 2c 20 20  .    { "step",  
94b0: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
94c0: 74 69 6f 6e 2f 53 54 45 50 22 20 20 20 20 20 20  tion/STEP"      
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
94e0: 20 20 20 7b 20 22 73 74 6c 22 2c 20 20 20 20 20     { "stl",     
94f0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9500: 6f 6e 2f 53 4c 41 22 20 20 20 20 20 20 20 20 20  on/SLA"         
9510: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9520: 20 7b 20 22 73 74 70 22 2c 20 20 20 20 20 20 20   { "stp",       
9530: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9540: 2f 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20  /STEP"          
9550: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9560: 20 22 73 76 34 63 70 69 6f 22 2c 20 20 20 20 37   "sv4cpio",    7
9570: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
9580: 2d 73 76 34 63 70 69 6f 22 20 20 20 20 20 20 20  -sv4cpio"       
9590: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
95a0: 73 76 34 63 72 63 22 2c 20 20 20 20 20 36 2c 20  sv4crc",     6, 
95b0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
95c0: 76 34 63 72 63 22 20 20 20 20 20 20 20 20 20 20  v4crc"          
95d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76      },.    { "sv
95e0: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  g",        3, "i
95f0: 6d 61 67 65 2f 73 76 67 2b 78 6d 6c 22 20 20 20  mage/svg+xml"   
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 77 66 22    },.    { "swf"
9620: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9630: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b  lication/x-shock
9640: 77 61 76 65 2d 66 6c 61 73 68 22 20 20 20 20 20  wave-flash"     
9650: 7d 2c 0a 20 20 20 20 7b 20 22 74 22 2c 20 20 20  },.    { "t",   
9660: 20 20 20 20 20 20 20 31 2c 20 22 61 70 70 6c 69         1, "appli
9670: 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20  cation/x-troff" 
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9690: 0a 20 20 20 20 7b 20 22 74 61 72 22 2c 20 20 20  .    { "tar",   
96a0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
96b0: 74 69 6f 6e 2f 78 2d 74 61 72 22 20 20 20 20 20  tion/x-tar"     
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
96d0: 20 20 20 7b 20 22 74 63 6c 22 2c 20 20 20 20 20     { "tcl",     
96e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
96f0: 6f 6e 2f 78 2d 74 63 6c 22 20 20 20 20 20 20 20  on/x-tcl"       
9700: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9710: 20 7b 20 22 74 65 78 22 2c 20 20 20 20 20 20 20   { "tex",       
9720: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9730: 2f 78 2d 74 65 78 22 20 20 20 20 20 20 20 20 20  /x-tex"         
9740: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9750: 20 22 74 65 78 69 22 2c 20 20 20 20 20 20 20 34   "texi",       4
9760: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
9770: 2d 74 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20  -texinfo"       
9780: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9790: 74 65 78 69 6e 66 6f 22 2c 20 20 20 20 37 2c 20  texinfo",    7, 
97a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
97b0: 65 78 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20  exinfo"         
97c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 67      },.    { "tg
97d0: 7a 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  z",        3, "a
97e0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 61 72  pplication/x-tar
97f0: 2d 67 7a 22 20 20 20 20 20 20 20 20 20 20 20 20  -gz"            
9800: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 66    },.    { "tiff
9810: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 69 6d 61  ",       4, "ima
9820: 67 65 2f 74 69 66 66 22 20 20 20 20 20 20 20 20  ge/tiff"        
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 7d 2c 0a 20 20 20 20 7b 20 22 74 69 66 22 2c 20  },.    { "tif", 
9850: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
9860: 2f 74 69 66 66 22 20 20 20 20 20 20 20 20 20 20  /tiff"          
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9880: 0a 20 20 20 20 7b 20 22 74 72 22 2c 20 20 20 20  .    { "tr",    
9890: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
98a0: 74 69 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20  tion/x-troff"   
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
98c0: 20 20 20 7b 20 22 74 73 69 22 2c 20 20 20 20 20     { "tsi",     
98d0: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 54 53 50     3, "audio/TSP
98e0: 2d 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20  -audio"         
98f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9900: 20 7b 20 22 74 73 70 22 2c 20 20 20 20 20 20 20   { "tsp",       
9910: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9920: 2f 64 73 70 74 79 70 65 22 20 20 20 20 20 20 20  /dsptype"       
9930: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9940: 20 22 74 73 76 22 2c 20 20 20 20 20 20 20 20 33   "tsv",        3
9950: 2c 20 22 74 65 78 74 2f 74 61 62 2d 73 65 70 61  , "text/tab-sepa
9960: 72 61 74 65 64 2d 76 61 6c 75 65 73 22 20 20 20  rated-values"   
9970: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9980: 74 78 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20  txt",        3, 
9990: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e      },.    { "un
99c0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  v",        3, "a
99d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 69 2d 64 65 61  pplication/i-dea
99e0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
99f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 73 74 61    },.    { "usta
9a00: 72 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  r",      5, "app
9a10: 6c 69 63 61 74 69 6f 6e 2f 78 2d 75 73 74 61 72  lication/x-ustar
9a20: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9a30: 7d 2c 0a 20 20 20 20 7b 20 22 76 63 64 22 2c 20  },.    { "vcd", 
9a40: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9a50: 63 61 74 69 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22  cation/x-cdlink"
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9a70: 0a 20 20 20 20 7b 20 22 76 64 61 22 2c 20 20 20  .    { "vda",   
9a80: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9a90: 74 69 6f 6e 2f 76 64 61 22 20 20 20 20 20 20 20  tion/vda"       
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9ab0: 20 20 20 7b 20 22 76 69 76 22 2c 20 20 20 20 20     { "viv",     
9ac0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 76 6e 64     3, "video/vnd
9ad0: 2e 76 69 76 6f 22 20 20 20 20 20 20 20 20 20 20  .vivo"          
9ae0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9af0: 20 7b 20 22 76 69 76 6f 22 2c 20 20 20 20 20 20   { "vivo",      
9b00: 20 34 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76   4, "video/vnd.v
9b10: 69 76 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  ivo"            
9b20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9b30: 20 22 76 72 6d 6c 22 2c 20 20 20 20 20 20 20 34   "vrml",       4
9b40: 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20  , "model/vrml"  
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9b70: 76 73 69 78 22 2c 20 20 20 20 20 20 20 34 2c 20  vsix",       4, 
9b80: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 73 69  "application/vsi
9b90: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
9ba0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61      },.    { "wa
9bb0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  v",        3, "a
9bc0: 75 64 69 6f 2f 78 2d 77 61 76 22 20 20 20 20 20  udio/x-wav"     
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 61 78 22    },.    { "wax"
9bf0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
9c00: 69 6f 2f 78 2d 6d 73 2d 77 61 78 22 20 20 20 20  io/x-ms-wax"    
9c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c20: 7d 2c 0a 20 20 20 20 7b 20 22 77 69 6b 69 22 2c  },.    { "wiki",
9c30: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
9c40: 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d  cation/x-fossil-
9c50: 77 69 6b 69 22 20 20 20 20 20 20 20 20 20 7d 2c  wiki"         },
9c60: 0a 20 20 20 20 7b 20 22 77 6d 61 22 2c 20 20 20  .    { "wma",   
9c70: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
9c80: 2d 6d 73 2d 77 6d 61 22 20 20 20 20 20 20 20 20  -ms-wma"        
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9ca0: 20 20 20 7b 20 22 77 6d 76 22 2c 20 20 20 20 20     { "wmv",     
9cb0: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
9cc0: 73 2d 77 6d 76 22 20 20 20 20 20 20 20 20 20 20  s-wmv"          
9cd0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9ce0: 20 7b 20 22 77 6d 78 22 2c 20 20 20 20 20 20 20   { "wmx",       
9cf0: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
9d00: 77 6d 78 22 20 20 20 20 20 20 20 20 20 20 20 20  wmx"            
9d10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9d20: 20 22 77 72 6c 22 2c 20 20 20 20 20 20 20 20 33   "wrl",        3
9d30: 2c 20 22 6d 6f 64 65 6c 2f 76 72 6d 6c 22 20 20  , "model/vrml"  
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9d60: 77 76 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wvx",        3, 
9d70: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 76 78 22  "video/x-ms-wvx"
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 62      },.    { "xb
9da0: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  m",        3, "i
9db0: 6d 61 67 65 2f 78 2d 78 62 69 74 6d 61 70 22 20  mage/x-xbitmap" 
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 63 22    },.    { "xlc"
9de0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9df0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
9e00: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
9e10: 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 6c 22 2c 20  },.    { "xll", 
9e20: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9e30: 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78  cation/vnd.ms-ex
9e40: 63 65 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c  cel"          },
9e50: 0a 20 20 20 20 7b 20 22 78 6c 6d 22 2c 20 20 20  .    { "xlm",   
9e60: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9e70: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
9e80: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
9e90: 20 20 20 7b 20 22 78 6c 73 22 2c 20 20 20 20 20     { "xls",     
9ea0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9eb0: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
9ec0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9ed0: 20 7b 20 22 78 6c 77 22 2c 20 20 20 20 20 20 20   { "xlw",       
9ee0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9ef0: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
9f00: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9f10: 20 22 78 6d 6c 22 2c 20 20 20 20 20 20 20 20 33   "xml",        3
9f20: 2c 20 22 74 65 78 74 2f 78 6d 6c 22 20 20 20 20  , "text/xml"    
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f40: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9f50: 78 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xpm",        3, 
9f60: 22 69 6d 61 67 65 2f 78 2d 78 70 69 78 6d 61 70  "image/x-xpixmap
9f70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9f80: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 77      },.    { "xw
9f90: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69  d",        3, "i
9fa0: 6d 61 67 65 2f 78 2d 78 77 69 6e 64 6f 77 64 75  mage/x-xwindowdu
9fb0: 6d 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  mp"             
9fc0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 79 7a 22    },.    { "xyz"
9fd0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 63 68 65  ,        3, "che
9fe0: 6d 69 63 61 6c 2f 78 2d 70 64 62 22 20 20 20 20  mical/x-pdb"    
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 7d 2c 0a 20 20 20 20 7b 20 22 7a 69 70 22 2c 20  },.    { "zip", 
a010: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
a020: 63 61 74 69 6f 6e 2f 7a 69 70 22 20 20 20 20 20  cation/zip"     
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
a040: 0a 20 20 7d 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e  .  };..  for(i=n
a050: 4e 61 6d 65 2d 31 3b 20 69 3e 30 20 26 26 20 7a  Name-1; i>0 && z
a060: 4e 61 6d 65 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d  Name[i]!='.'; i-
a070: 2d 29 7b 7d 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d  -){}.  z = &zNam
a080: 65 5b 69 2b 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20  e[i+1];.  len = 
a090: 6e 4e 61 6d 65 20 2d 20 69 3b 0a 20 20 69 66 28  nName - i;.  if(
a0a0: 20 6c 65 6e 3c 28 69 6e 74 29 73 69 7a 65 6f 66   len<(int)sizeof
a0b0: 28 7a 53 75 66 66 69 78 29 2d 31 20 29 7b 0a 20  (zSuffix)-1 ){. 
a0c0: 20 20 20 73 74 72 63 70 79 28 7a 53 75 66 66 69     strcpy(zSuffi
a0d0: 78 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  x, z);.    for(i
a0e0: 3d 30 3b 20 7a 53 75 66 66 69 78 5b 69 5d 3b 20  =0; zSuffix[i]; 
a0f0: 69 2b 2b 29 20 7a 53 75 66 66 69 78 5b 69 5d 20  i++) zSuffix[i] 
a100: 3d 20 74 6f 6c 6f 77 65 72 28 7a 53 75 66 66 69  = tolower(zSuffi
a110: 78 5b 69 5d 29 3b 0a 20 20 20 20 66 69 72 73 74  x[i]);.    first
a120: 20 3d 20 30 3b 0a 20 20 20 20 6c 61 73 74 20 3d   = 0;.    last =
a130: 20 73 69 7a 65 6f 66 28 61 4d 69 6d 65 29 2f 73   sizeof(aMime)/s
a140: 69 7a 65 6f 66 28 61 4d 69 6d 65 5b 30 5d 29 3b  izeof(aMime[0]);
a150: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 69 72 73  .    while( firs
a160: 74 3c 3d 6c 61 73 74 20 29 7b 0a 20 20 20 20 20  t<=last ){.     
a170: 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 20   int c;.      i 
a180: 3d 20 28 66 69 72 73 74 2b 6c 61 73 74 29 2f 32  = (first+last)/2
a190: 3b 0a 20 20 20 20 20 20 63 20 3d 20 73 74 72 63  ;.      c = strc
a1a0: 6d 70 28 7a 53 75 66 66 69 78 2c 20 61 4d 69 6d  mp(zSuffix, aMim
a1b0: 65 5b 69 5d 2e 7a 53 75 66 66 69 78 29 3b 0a 20  e[i].zSuffix);. 
a1c0: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
a1d0: 72 65 74 75 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e  return aMime[i].
a1e0: 7a 4d 69 6d 65 74 79 70 65 3b 0a 20 20 20 20 20  zMimetype;.     
a1f0: 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
a200: 20 20 20 20 6c 61 73 74 20 3d 20 69 2d 31 3b 0a      last = i-1;.
a210: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a220: 20 20 20 20 20 66 69 72 73 74 20 3d 20 69 2b 31       first = i+1
a230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a240: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 61 70    }.  return "ap
a250: 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d  plication/octet-
a260: 73 74 72 65 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a  stream";.}../*.*
a270: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
a280: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31  table contains 1
a290: 20 66 6f 72 20 61 6c 6c 20 63 68 61 72 61 63 74   for all charact
a2a0: 65 72 73 20 74 68 61 74 20 61 72 65 20 70 65 72  ers that are per
a2b0: 6d 69 74 74 65 64 20 69 6e 0a 2a 2a 20 74 68 65  mitted in.** the
a2c0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 55 52 4c   part of the URL
a2d0: 20 62 65 66 6f 72 65 20 74 68 65 20 71 75 65 72   before the quer
a2e0: 79 20 70 61 72 61 6d 65 74 65 72 73 20 61 6e 64  y parameters and
a2f0: 20 66 72 61 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   fragment..**.**
a300: 20 41 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74   Allowed charact
a310: 65 72 73 3a 20 20 30 2d 39 61 2d 7a 41 2d 5a 2c  ers:  0-9a-zA-Z,
a320: 2d 2e 2f 3a 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73  -./:_~.**.** Dis
a330: 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65  allowed characte
a340: 72 73 20 69 6e 63 6c 75 64 65 3a 20 20 21 22 23  rs include:  !"#
a350: 24 25 26 27 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d  $%&'()*+;<=>?[\]
a360: 5e 7b 7c 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ^{|}.*/.static c
a370: 6f 6e 73 74 20 63 68 61 72 20 61 6c 6c 6f 77 65  onst char allowe
a380: 64 49 6e 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20  dInName[] = {.  
a390: 20 20 20 20 2f 2a 20 20 78 30 20 20 78 31 20 20      /*  x0  x1  
a3a0: 78 32 20 20 78 33 20 20 78 34 20 20 78 35 20 20  x2  x3  x4  x5  
a3b0: 78 36 20 20 78 37 20 20 78 38 20 20 78 39 20 20  x6  x7  x8  x9  
a3c0: 78 61 20 20 78 62 20 20 78 63 20 20 78 64 20 20  xa  xb  xc  xd  
a3d0: 78 65 20 20 78 66 20 2a 2f 0a 2f 2a 20 30 78 20  xe  xf */./* 0x 
a3e0: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
a3f0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a400: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a410: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a420: 20 30 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30   0,./* 1x */   0
a430: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a440: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a450: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a460: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
a470: 20 32 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   2x */   0,  0, 
a480: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a490: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a4a0: 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20   0,  0,  1,  1, 
a4b0: 20 31 2c 20 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f   1,  1,./* 3x */
a4c0: 20 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31     1,  1,  1,  1
a4d0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
a4e0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
a4f0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a500: 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c 20  ,./* 4x */   0, 
a510: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a520: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a530: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a540: 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 35   1,  1,  1,./* 5
a550: 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31  x */   1,  1,  1
a560: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
a570: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
a580: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a590: 2c 20 20 31 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20  ,  1,./* 6x */  
a5a0: 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   0,  1,  1,  1, 
a5b0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a5c0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a5d0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a   1,  1,  1,  1,.
a5e0: 2f 2a 20 37 78 20 2a 2f 20 20 20 31 2c 20 20 31  /* 7x */   1,  1
a5f0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
a600: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
a610: 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  1,  0,  0,  0
a620: 2c 20 20 31 2c 20 20 30 2c 0a 2f 2a 20 38 78 20  ,  1,  0,./* 8x 
a630: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
a640: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a650: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a660: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a670: 20 30 2c 0a 2f 2a 20 39 78 20 2a 2f 20 20 20 30   0,./* 9x */   0
a680: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a690: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a6a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a6b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
a6c0: 20 41 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   Ax */   0,  0, 
a6d0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a6e0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a6f0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a700: 20 30 2c 20 20 30 2c 0a 2f 2a 20 42 78 20 2a 2f   0,  0,./* Bx */
a710: 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30     0,  0,  0,  0
a720: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a730: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a740: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a750: 2c 0a 2f 2a 20 43 78 20 2a 2f 20 20 20 30 2c 20  ,./* Cx */   0, 
a760: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a770: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a780: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a790: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 44   0,  0,  0,./* D
a7a0: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
a7b0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a7c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a7d0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a7e0: 2c 20 20 30 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20  ,  0,./* Ex */  
a7f0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a800: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a810: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a820: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
a830: 2f 2a 20 46 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* Fx */   0,  0
a840: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a850: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a860: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a870: 2c 20 20 30 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a  ,  0,  0,.};../*
a880: 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64  .** Remove all d
a890: 69 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63  isallowed charac
a8a0: 74 65 72 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ters in the inpu
a8b0: 74 20 73 74 72 69 6e 67 20 7a 5b 5d 2e 20 20 43  t string z[].  C
a8c0: 6f 6e 76 65 72 74 20 61 6e 79 0a 2a 2a 20 64 69  onvert any.** di
a8d0: 73 61 6c 6c 6f 77 65 64 20 63 68 61 72 61 63 74  sallowed charact
a8e0: 65 72 73 20 69 6e 74 6f 20 22 5f 22 2e 0a 2a 2a  ers into "_"..**
a8f0: 0a 2a 2a 20 4e 6f 74 20 74 68 61 74 20 74 68 65  .** Not that the
a900: 20 74 68 72 65 65 20 63 68 61 72 61 63 74 65 72   three character
a910: 20 73 65 71 75 65 6e 63 65 20 22 25 58 58 22 20   sequence "%XX" 
a920: 77 68 65 72 65 20 58 20 69 73 20 61 6e 79 20 62  where X is any b
a930: 79 74 65 20 69 73 0a 2a 2a 20 63 6f 6e 76 65 72  yte is.** conver
a940: 74 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ted into a singl
a950: 65 20 22 5f 22 20 63 68 61 72 61 63 74 65 72 2e  e "_" character.
a960: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
a970: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
a980: 61 63 74 65 72 73 20 63 6f 6e 76 65 72 74 65 64  acters converted
a990: 2e 20 20 41 6e 20 22 25 58 58 22 20 2d 3e 20 22  .  An "%XX" -> "
a9a0: 5f 22 20 63 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a  _" conversion.**
a9b0: 20 63 6f 75 6e 74 73 20 61 73 20 61 20 73 69 6e   counts as a sin
a9c0: 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  gle character..*
a9d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 6e  /.static int san
a9e0: 69 74 69 7a 65 53 74 72 69 6e 67 28 63 68 61 72  itizeString(char
a9f0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61   *z){.  int nCha
aa00: 6e 67 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  nge = 0;.  while
aa10: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  ( *z ){.    if( 
aa20: 21 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b 2a  !allowedInName[*
aa30: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
aa40: 7a 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  z] ){.      if( 
aa50: 2a 7a 3d 3d 27 25 27 20 26 26 20 7a 5b 31 5d 21  *z=='%' && z[1]!
aa60: 3d 30 20 26 26 20 7a 5b 32 5d 21 3d 30 20 29 7b  =0 && z[2]!=0 ){
aa70: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
aa80: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 33 3b          for(i=3;
aa90: 20 28 7a 5b 69 2d 32 5d 20 3d 20 7a 5b 69 5d 29   (z[i-2] = z[i])
aaa0: 21 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  !=0; i++){}.    
aab0: 20 20 7d 0a 20 20 20 20 20 20 2a 7a 20 3d 20 27    }.      *z = '
aac0: 5f 27 3b 0a 20 20 20 20 20 20 6e 43 68 61 6e 67  _';.      nChang
aad0: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  e++;.    }.    z
aae0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
aaf0: 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
ab00: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
ab10: 62 65 72 20 6f 66 20 22 2f 22 20 63 68 61 72 61  ber of "/" chara
ab20: 63 74 65 72 73 20 69 6e 20 61 20 73 74 72 69 6e  cters in a strin
ab30: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
ab40: 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 63 6f   countSlashes(co
ab50: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
ab60: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69  int n = 0;.  whi
ab70: 6c 65 28 20 2a 7a 20 29 20 69 66 28 20 2a 28 7a  le( *z ) if( *(z
ab80: 2b 2b 29 3d 3d 27 2f 27 20 29 20 6e 2b 2b 3b 0a  ++)=='/' ) n++;.
ab90: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
aba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
abb0: 65 20 70 72 6f 63 65 73 73 65 73 20 61 20 73 69  e processes a si
abc0: 6e 67 6c 65 20 48 54 54 50 20 72 65 71 75 65 73  ngle HTTP reques
abd0: 74 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 69 6e  t on standard in
abe0: 70 75 74 20 61 6e 64 0a 2a 2a 20 73 65 6e 64 73  put and.** sends
abf0: 20 74 68 65 20 72 65 70 6c 79 20 74 6f 20 73 74   the reply to st
ac00: 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 20  andard output.  
ac10: 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
ac20: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 0a 2a 2a  is 1 it means.**
ac30: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 68 6f   that we are sho
ac40: 75 6c 64 20 63 6c 6f 73 65 20 74 68 65 20 73 6f  uld close the so
ac50: 63 6b 65 74 20 77 69 74 68 6f 75 74 20 70 72 6f  cket without pro
ac60: 63 65 73 73 69 6e 67 20 61 64 64 69 74 69 6f 6e  cessing addition
ac70: 61 6c 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65  al.** HTTP reque
ac80: 73 74 73 20 61 66 74 65 72 20 74 68 65 20 63 75  sts after the cu
ac90: 72 72 65 6e 74 20 72 65 71 75 65 73 74 20 66 69  rrent request fi
aca0: 6e 69 73 68 65 73 2e 20 20 30 20 6d 65 61 6e 73  nishes.  0 means
acb0: 20 77 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77   we are.** allow
acc0: 65 64 20 74 6f 20 6b 65 65 70 20 74 68 65 20 63  ed to keep the c
acd0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 61  onnection open a
ace0: 6e 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 64  nd to process ad
acf0: 64 69 74 69 6f 6e 61 6c 20 72 65 71 75 65 73 74  ditional request
ad00: 73 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  s..** This routi
ad10: 6e 65 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f  ne may choose to
ad20: 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   close the conne
ad30: 63 74 69 6f 6e 20 65 76 65 6e 20 69 66 20 74 68  ction even if th
ad40: 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  e argument.** is
ad50: 20 30 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68   0..** .** If th
ad60: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 6f  e connection sho
ad70: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 2c 20 74  uld be closed, t
ad80: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  his routine call
ad90: 73 20 65 78 69 74 28 29 20 61 6e 64 0a 2a 2a 20  s exit() and.** 
ada0: 74 68 75 73 20 6e 65 76 65 72 20 72 65 74 75 72  thus never retur
adb0: 6e 73 2e 20 20 49 66 20 74 68 69 73 20 72 6f 75  ns.  If this rou
adc0: 74 69 6e 65 20 64 6f 65 73 20 72 65 74 75 72 6e  tine does return
add0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61   it means that a
ade0: 6e 6f 74 68 65 72 0a 2a 2a 20 48 54 54 50 20 72  nother.** HTTP r
adf0: 65 71 75 65 73 74 20 6d 61 79 20 61 70 70 65 61  equest may appea
ae00: 72 20 6f 6e 20 74 68 65 20 77 69 72 65 2e 0a 2a  r on the wire..*
ae10: 2f 0a 76 6f 69 64 20 50 72 6f 63 65 73 73 4f 6e  /.void ProcessOn
ae20: 65 52 65 71 75 65 73 74 28 69 6e 74 20 66 6f 72  eRequest(int for
ae30: 63 65 43 6c 6f 73 65 29 7b 0a 20 20 69 6e 74 20  ceClose){.  int 
ae40: 69 2c 20 6a 2c 20 6a 30 2c 20 63 3b 0a 20 20 63  i, j, j0, c;.  c
ae50: 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
ae60: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
ae70: 20 74 6f 20 70 61 72 73 65 20 75 70 20 61 20 73   to parse up a s
ae80: 74 72 69 6e 67 20 2a 2f 0a 20 20 73 74 72 75 63  tring */.  struc
ae90: 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20  t stat statbuf; 
aea0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
aeb0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69  ion about the fi
aec0: 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69 65 76  le to be retriev
aed0: 65 64 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e  ed */.  FILE *in
aee0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aef0: 20 20 2f 2a 20 46 6f 72 20 72 65 61 64 69 6e 67    /* For reading
af00: 20 66 72 6f 6d 20 43 47 49 20 73 63 72 69 70 74   from CGI script
af10: 73 20 2a 2f 0a 23 69 66 64 65 66 20 4c 4f 47 5f  s */.#ifdef LOG_
af20: 48 45 41 44 45 52 0a 20 20 46 49 4c 45 20 2a 68  HEADER.  FILE *h
af30: 64 72 4c 6f 67 20 3d 20 30 3b 20 20 20 20 20 20  drLog = 0;      
af40: 20 20 20 2f 2a 20 4c 6f 67 20 66 69 6c 65 20 66     /* Log file f
af50: 6f 72 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64  or complete head
af60: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 23 65  er content */.#e
af70: 6e 64 69 66 0a 20 20 63 68 61 72 20 7a 4c 69 6e  ndif.  char zLin
af80: 65 5b 31 30 30 30 5d 3b 20 20 20 20 20 20 20 20  e[1000];        
af90: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 66 6f 72   /* A buffer for
afa0: 20 69 6e 70 75 74 20 6c 69 6e 65 73 20 6f 72 20   input lines or 
afb0: 66 6f 72 6d 69 6e 67 20 6e 61 6d 65 73 20 2a 2f  forming names */
afc0: 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69  ..  /* Change di
afd0: 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65  rectories to the
afe0: 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54   root of the HTT
aff0: 50 20 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a  P filesystem.  *
b000: 2f 0a 20 20 69 66 28 20 63 68 64 69 72 28 7a 52  /.  if( chdir(zR
b010: 6f 6f 74 5b 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a  oot[0] ? zRoot :
b020: 20 22 2f 22 29 21 3d 30 20 29 7b 0a 20 20 20 20   "/")!=0 ){.    
b030: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b  char zBuf[1000];
b040: 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
b050: 28 31 39 30 2c 20 20 20 2f 2a 20 4c 4f 47 3a 20  (190,   /* LOG: 
b060: 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a  chdir() failed *
b070: 2f 0a 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e  /.         "cann
b080: 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
b090: 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 0a 20 20 20   from [%s]",.   
b0a0: 20 20 20 20 20 20 7a 52 6f 6f 74 2c 20 67 65 74        zRoot, get
b0b0: 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b 0a  cwd(zBuf,999));.
b0c0: 20 20 7d 0a 20 20 6e 52 65 71 75 65 73 74 2b 2b    }.  nRequest++
b0d0: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  ;..  /*.  ** We 
b0e0: 6d 75 73 74 20 72 65 63 65 69 76 65 20 61 20 63  must receive a c
b0f0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 77  omplete header w
b100: 69 74 68 69 6e 20 31 35 20 73 65 63 6f 6e 64 73  ithin 15 seconds
b110: 0a 20 20 2a 2f 0a 20 20 73 69 67 6e 61 6c 28 53  .  */.  signal(S
b120: 49 47 41 4c 52 4d 2c 20 54 69 6d 65 6f 75 74 29  IGALRM, Timeout)
b130: 3b 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 53 45  ;.  signal(SIGSE
b140: 47 56 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20  GV, Timeout);.  
b150: 73 69 67 6e 61 6c 28 53 49 47 50 49 50 45 2c 20  signal(SIGPIPE, 
b160: 54 69 6d 65 6f 75 74 29 3b 0a 20 20 69 66 28 20  Timeout);.  if( 
b170: 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
b180: 72 6d 28 31 35 29 3b 0a 0a 20 20 2f 2a 20 47 65  rm(15);..  /* Ge
b190: 74 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  t the first line
b1a0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 20   of the request 
b1b0: 61 6e 64 20 70 61 72 73 65 20 6f 75 74 20 74 68  and parse out th
b1c0: 65 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 2c 20 74  e.  ** method, t
b1d0: 68 65 20 73 63 72 69 70 74 20 61 6e 64 20 74 68  he script and th
b1e0: 65 20 70 72 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f  e protocol..  */
b1f0: 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69  .  if( fgets(zLi
b200: 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  ne,sizeof(zLine)
b210: 2c 73 74 64 69 6e 29 3d 3d 30 20 29 7b 0a 20 20  ,stdin)==0 ){.  
b220: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
b230: 20 6f 6d 69 74 4c 6f 67 20 3d 20 30 3b 0a 20 20   omitLog = 0;.  
b240: 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c  nIn += strlen(zL
b250: 69 6e 65 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  ine);..  /* Pars
b260: 65 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  e the first line
b270: 20 6f 66 20 74 68 65 20 48 54 54 50 20 72 65 71   of the HTTP req
b280: 75 65 73 74 20 2a 2f 0a 20 20 7a 4d 65 74 68 6f  uest */.  zMetho
b290: 64 20 3d 20 53 74 72 44 75 70 28 47 65 74 46 69  d = StrDup(GetFi
b2a0: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65  rstElement(zLine
b2b0: 2c 26 7a 29 29 3b 0a 20 20 7a 52 65 61 6c 53 63  ,&z));.  zRealSc
b2c0: 72 69 70 74 20 3d 20 7a 53 63 72 69 70 74 20 3d  ript = zScript =
b2d0: 20 53 74 72 44 75 70 28 47 65 74 46 69 72 73 74   StrDup(GetFirst
b2e0: 45 6c 65 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a  Element(z,&z));.
b2f0: 20 20 7a 50 72 6f 74 6f 63 6f 6c 20 3d 20 53 74    zProtocol = St
b300: 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c 65  rDup(GetFirstEle
b310: 6d 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 69  ment(z,&z));.  i
b320: 66 28 20 7a 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20  f( zProtocol==0 
b330: 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 50 72 6f 74  || strncmp(zProt
b340: 6f 63 6f 6c 2c 22 48 54 54 50 2f 22 2c 35 29 21  ocol,"HTTP/",5)!
b350: 3d 30 20 7c 7c 20 73 74 72 6c 65 6e 28 7a 50 72  =0 || strlen(zPr
b360: 6f 74 6f 63 6f 6c 29 21 3d 38 20 29 7b 0a 20 20  otocol)!=8 ){.  
b370: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
b380: 22 34 30 30 20 42 61 64 20 52 65 71 75 65 73 74  "400 Bad Request
b390: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
b3a0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43  printf(.      "C
b3b0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
b3c0: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
b3d0: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20     "\r\n".      
b3e0: 22 54 68 69 73 20 73 65 72 76 65 72 20 64 6f 65  "This server doe
b3f0: 73 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  s not understand
b400: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
b410: 72 6f 74 6f 63 6f 6c 5c 6e 22 0a 20 20 20 20 29  rotocol\n".    )
b420: 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74  ;.    MakeLogEnt
b430: 72 79 28 30 2c 20 32 30 30 29 3b 20 2f 2a 20 4c  ry(0, 200); /* L
b440: 4f 47 3a 20 62 61 64 20 70 72 6f 74 6f 63 6f 6c  OG: bad protocol
b450: 20 69 6e 20 48 54 54 50 20 68 65 61 64 65 72 20   in HTTP header 
b460: 2a 2f 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a  */.    exit(0);.
b470: 20 20 7d 0a 20 20 69 66 28 20 7a 53 63 72 69 70    }.  if( zScrip
b480: 74 5b 30 5d 3d 3d 30 20 29 20 4e 6f 74 46 6f 75  t[0]==0 ) NotFou
b490: 6e 64 28 32 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a  nd(210); /* LOG:
b4a0: 20 45 6d 70 74 79 20 72 65 71 75 65 73 74 20 55   Empty request U
b4b0: 52 49 20 2a 2f 0a 20 20 69 66 28 20 66 6f 72 63  RI */.  if( forc
b4c0: 65 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 63 6c  eClose ){.    cl
b4d0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
b4e0: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  1;.  }else if( z
b4f0: 50 72 6f 74 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20  Protocol[5]<'1' 
b500: 7c 7c 20 7a 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c  || zProtocol[7]<
b510: 27 31 27 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65  '1' ){.    close
b520: 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a  Connection = 1;.
b530: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 76    }..  /* This v
b540: 65 72 79 20 73 69 6d 70 6c 65 20 73 65 72 76 65  ery simple serve
b550: 72 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e  r only understan
b560: 64 73 20 74 68 65 20 47 45 54 2c 20 50 4f 53 54  ds the GET, POST
b570: 0a 20 20 2a 2a 20 61 6e 64 20 48 45 41 44 20 6d  .  ** and HEAD m
b580: 65 74 68 6f 64 73 0a 20 20 2a 2f 0a 20 20 69 66  ethods.  */.  if
b590: 28 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64  ( strcmp(zMethod
b5a0: 2c 22 47 45 54 22 29 21 3d 30 20 26 26 20 73 74  ,"GET")!=0 && st
b5b0: 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 50 4f  rcmp(zMethod,"PO
b5c0: 53 54 22 29 21 3d 30 0a 20 20 20 20 20 20 20 26  ST")!=0.       &
b5d0: 26 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64  & strcmp(zMethod
b5e0: 2c 22 48 45 41 44 22 29 21 3d 30 20 29 7b 0a 20  ,"HEAD")!=0 ){. 
b5f0: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
b600: 28 22 35 30 31 20 4e 6f 74 20 49 6d 70 6c 65 6d  ("501 Not Implem
b610: 65 6e 74 65 64 22 29 3b 0a 20 20 20 20 6e 4f 75  ented");.    nOu
b620: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
b630: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
b640: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
b650: 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20  ".      "\r\n". 
b660: 20 20 20 20 20 22 54 68 65 20 25 73 20 6d 65 74       "The %s met
b670: 68 6f 64 20 69 73 20 6e 6f 74 20 69 6d 70 6c 65  hod is not imple
b680: 6d 65 6e 74 65 64 20 6f 6e 20 74 68 69 73 20 73  mented on this s
b690: 65 72 76 65 72 2e 5c 6e 22 2c 0a 20 20 20 20 20  erver.\n",.     
b6a0: 20 7a 4d 65 74 68 6f 64 29 3b 0a 20 20 20 20 4d   zMethod);.    M
b6b0: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32  akeLogEntry(0, 2
b6c0: 32 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 6e 6b  20); /* LOG: Unk
b6d0: 6e 6f 77 6e 20 72 65 71 75 65 73 74 20 6d 65 74  nown request met
b6e0: 68 6f 64 20 2a 2f 0a 20 20 20 20 65 78 69 74 28  hod */.    exit(
b6f0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  0);.  }..  /* If
b700: 20 74 68 65 72 65 20 69 73 20 61 20 6c 6f 67 20   there is a log 
b710: 66 69 6c 65 20 28 69 66 20 7a 4c 6f 67 46 69 6c  file (if zLogFil
b720: 65 21 3d 30 29 20 61 6e 64 20 69 66 20 74 68 65  e!=0) and if the
b730: 20 70 61 74 68 6e 61 6d 65 20 69 6e 0a 20 20 2a   pathname in.  *
b740: 2a 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  * the first line
b750: 20 6f 66 20 74 68 65 20 68 74 74 70 20 72 65 71   of the http req
b760: 75 65 73 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  uest contains th
b770: 65 20 6d 61 67 69 63 20 73 74 72 69 6e 67 0a 20  e magic string. 
b780: 20 2a 2a 20 22 46 75 6c 6c 48 65 61 64 65 72 4c   ** "FullHeaderL
b790: 6f 67 22 20 74 68 65 6e 20 77 72 69 74 65 20 74  og" then write t
b7a0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64  he complete head
b7b0: 65 72 20 74 65 78 74 20 69 6e 74 6f 20 74 68 65  er text into the
b7c0: 0a 20 20 2a 2a 20 66 69 6c 65 20 25 73 28 7a 4c  .  ** file %s(zL
b7d0: 6f 67 46 69 6c 65 29 2d 68 64 72 2e 20 20 4f 76  ogFile)-hdr.  Ov
b7e0: 65 72 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  erwrite the file
b7f0: 2e 20 20 54 68 69 73 20 69 73 20 66 6f 72 20 70  .  This is for p
b800: 72 6f 74 6f 63 6f 6c 0a 20 20 2a 2a 20 64 65 62  rotocol.  ** deb
b810: 75 67 67 69 6e 67 20 6f 6e 6c 79 20 61 6e 64 20  ugging only and 
b820: 69 73 20 6f 6e 6c 79 20 65 6e 61 62 6c 65 64 20  is only enabled 
b830: 69 66 20 61 6c 74 68 74 74 70 64 20 69 73 20 63  if althttpd is c
b840: 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 20 20 2a  ompiled with.  *
b850: 2a 20 74 68 65 20 2d 44 4c 4f 47 5f 48 45 41 44  * the -DLOG_HEAD
b860: 45 52 3d 31 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a  ER=1 option..  *
b870: 2f 0a 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41  /.#ifdef LOG_HEA
b880: 44 45 52 0a 20 20 69 66 28 20 7a 4c 6f 67 46 69  DER.  if( zLogFi
b890: 6c 65 0a 20 20 20 26 26 20 73 74 72 73 74 72 28  le.   && strstr(
b8a0: 7a 53 63 72 69 70 74 2c 22 46 75 6c 6c 48 65 61  zScript,"FullHea
b8b0: 64 65 72 4c 6f 67 22 29 21 3d 30 0a 20 20 20 26  derLog")!=0.   &
b8c0: 26 20 73 74 72 6c 65 6e 28 7a 4c 6f 67 46 69 6c  & strlen(zLogFil
b8d0: 65 29 3c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  e)<sizeof(zLine)
b8e0: 2d 35 30 0a 20 20 29 7b 0a 20 20 20 20 73 70 72  -50.  ){.    spr
b8f0: 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2d  intf(zLine, "%s-
b900: 68 64 72 22 2c 20 7a 4c 6f 67 46 69 6c 65 29 3b  hdr", zLogFile);
b910: 0a 20 20 20 20 68 64 72 4c 6f 67 20 3d 20 66 6f  .    hdrLog = fo
b920: 70 65 6e 28 7a 4c 69 6e 65 2c 20 22 77 62 22 29  pen(zLine, "wb")
b930: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
b940: 20 2f 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20   /* Get all the 
b950: 6f 70 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20  optional fields 
b960: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20  that follow the 
b970: 66 69 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f  first line..  */
b980: 0a 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a  .  zCookie = 0;.
b990: 20 20 7a 41 75 74 68 54 79 70 65 20 3d 20 30 3b    zAuthType = 0;
b9a0: 0a 20 20 7a 52 65 6d 6f 74 65 55 73 65 72 20 3d  .  zRemoteUser =
b9b0: 20 30 3b 0a 20 20 7a 52 65 66 65 72 65 72 20 3d   0;.  zReferer =
b9c0: 20 30 3b 0a 20 20 7a 49 66 4e 6f 6e 65 4d 61 74   0;.  zIfNoneMat
b9d0: 63 68 20 3d 20 30 3b 0a 20 20 7a 49 66 4d 6f 64  ch = 0;.  zIfMod
b9e0: 69 66 69 65 64 53 69 6e 63 65 20 3d 20 30 3b 0a  ifiedSince = 0;.
b9f0: 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a    while( fgets(z
ba00: 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e  Line,sizeof(zLin
ba10: 65 29 2c 73 74 64 69 6e 29 20 29 7b 0a 20 20 20  e),stdin) ){.   
ba20: 20 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d   char *zFieldNam
ba30: 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61  e;.    char *zVa
ba40: 6c 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 47 5f 48  l;..#ifdef LOG_H
ba50: 45 41 44 45 52 0a 20 20 20 20 69 66 28 20 68 64  EADER.    if( hd
ba60: 72 4c 6f 67 20 29 20 66 70 72 69 6e 74 66 28 68  rLog ) fprintf(h
ba70: 64 72 4c 6f 67 2c 20 22 25 73 22 2c 20 7a 4c 69  drLog, "%s", zLi
ba80: 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ne);.#endif.    
ba90: 6e 49 6e 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c  nIn += strlen(zL
baa0: 69 6e 65 29 3b 0a 20 20 20 20 7a 46 69 65 6c 64  ine);.    zField
bab0: 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45  Name = GetFirstE
bac0: 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56  lement(zLine,&zV
bad0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  al);.    if( zFi
bae0: 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a  eldName==0 || *z
baf0: 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 62  FieldName==0 ) b
bb00: 72 65 61 6b 3b 0a 20 20 20 20 52 65 6d 6f 76 65  reak;.    Remove
bb10: 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29 3b 0a 20  Newline(zVal);. 
bb20: 20 20 20 69 66 28 20 73 74 72 63 61 73 65 63 6d     if( strcasecm
bb30: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 55 73  p(zFieldName,"Us
bb40: 65 72 2d 41 67 65 6e 74 3a 22 29 3d 3d 30 20 29  er-Agent:")==0 )
bb50: 7b 0a 20 20 20 20 20 20 7a 41 67 65 6e 74 20 3d  {.      zAgent =
bb60: 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20   StrDup(zVal);. 
bb70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
bb80: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
bb90: 6d 65 2c 22 41 63 63 65 70 74 3a 22 29 3d 3d 30  me,"Accept:")==0
bba0: 20 29 7b 0a 20 20 20 20 20 20 7a 41 63 63 65 70   ){.      zAccep
bbb0: 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  t = StrDup(zVal)
bbc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bbd0: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
bbe0: 64 4e 61 6d 65 2c 22 41 63 63 65 70 74 2d 45 6e  dName,"Accept-En
bbf0: 63 6f 64 69 6e 67 3a 22 29 3d 3d 30 20 29 7b 0a  coding:")==0 ){.
bc00: 20 20 20 20 20 20 7a 41 63 63 65 70 74 45 6e 63        zAcceptEnc
bc10: 6f 64 69 6e 67 20 3d 20 53 74 72 44 75 70 28 7a  oding = StrDup(z
bc20: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
bc30: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
bc40: 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65  FieldName,"Conte
bc50: 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d 30 20  nt-length:")==0 
bc60: 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e  ){.      zConten
bc70: 74 4c 65 6e 67 74 68 20 3d 20 53 74 72 44 75 70  tLength = StrDup
bc80: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zVal);.    }els
bc90: 65 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70  e if( strcasecmp
bca0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e  (zFieldName,"Con
bcb0: 74 65 6e 74 2d 74 79 70 65 3a 22 29 3d 3d 30 20  tent-type:")==0 
bcc0: 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 6e  ){.      zConten
bcd0: 74 54 79 70 65 20 3d 20 53 74 72 44 75 70 28 7a  tType = StrDup(z
bce0: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
bcf0: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
bd00: 46 69 65 6c 64 4e 61 6d 65 2c 22 52 65 66 65 72  FieldName,"Refer
bd10: 65 72 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  er:")==0 ){.    
bd20: 20 20 7a 52 65 66 65 72 65 72 20 3d 20 53 74 72    zReferer = Str
bd30: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20  Dup(zVal);.     
bd40: 20 69 66 28 20 73 74 72 73 74 72 28 7a 56 61 6c   if( strstr(zVal
bd50: 2c 20 22 64 65 76 69 64 73 2e 6e 65 74 2f 22 29  , "devids.net/")
bd60: 21 3d 30 20 29 7b 20 7a 52 65 66 65 72 65 72 20  !=0 ){ zReferer 
bd70: 3d 20 22 64 65 76 69 64 73 2e 6e 65 74 2e 73 6d  = "devids.net.sm
bd80: 75 74 22 3b 0a 20 20 20 20 20 20 20 20 46 6f 72  ut";.        For
bd90: 62 69 64 64 65 6e 28 32 33 30 29 3b 20 2f 2a 20  bidden(230); /* 
bda0: 4c 4f 47 3a 20 52 65 66 65 72 72 65 72 20 69 73  LOG: Referrer is
bdb0: 20 64 65 76 69 64 73 2e 6e 65 74 20 2a 2f 0a 20   devids.net */. 
bdc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
bdd0: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
bde0: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b  zFieldName,"Cook
bdf0: 69 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ie:")==0 ){.    
be00: 20 20 7a 43 6f 6f 6b 69 65 20 3d 20 53 74 72 41    zCookie = StrA
be10: 70 70 65 6e 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b  ppend(zCookie,";
be20: 20 22 2c 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65   ",zVal);.    }e
be30: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
be40: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 43  mp(zFieldName,"C
be50: 6f 6e 6e 65 63 74 69 6f 6e 3a 22 29 3d 3d 30 20  onnection:")==0 
be60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
be70: 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c 22 63 6c  casecmp(zVal,"cl
be80: 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ose")==0 ){.    
be90: 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74      closeConnect
bea0: 69 6f 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ion = 1;.      }
beb0: 65 6c 73 65 20 69 66 28 20 21 66 6f 72 63 65 43  else if( !forceC
bec0: 6c 6f 73 65 20 26 26 20 73 74 72 63 61 73 65 63  lose && strcasec
bed0: 6d 70 28 7a 56 61 6c 2c 20 22 6b 65 65 70 2d 61  mp(zVal, "keep-a
bee0: 6c 69 76 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  live")==0 ){.   
bef0: 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63       closeConnec
bf00: 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  tion = 0;.      
bf10: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
bf20: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
bf30: 64 4e 61 6d 65 2c 22 48 6f 73 74 3a 22 29 3d 3d  dName,"Host:")==
bf40: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
bf50: 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20  nSquare = 0;.   
bf60: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20     char c;.     
bf70: 20 69 66 28 20 73 61 6e 69 74 69 7a 65 53 74 72   if( sanitizeStr
bf80: 69 6e 67 28 7a 56 61 6c 29 20 29 7b 0a 20 20 20  ing(zVal) ){.   
bf90: 20 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28 32       Forbidden(2
bfa0: 34 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 49 6c  40);  /* LOG: Il
bfb0: 6c 65 67 61 6c 20 63 6f 6e 74 65 6e 74 20 69 6e  legal content in
bfc0: 20 48 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72   HOST: parameter
bfd0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
bfe0: 20 20 7a 48 74 74 70 48 6f 73 74 20 3d 20 53 74    zHttpHost = St
bff0: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
c000: 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20    zServerPort = 
c010: 7a 53 65 72 76 65 72 4e 61 6d 65 20 3d 20 53 74  zServerName = St
c020: 72 44 75 70 28 7a 48 74 74 70 48 6f 73 74 29 3b  rDup(zHttpHost);
c030: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 53  .      while( zS
c040: 65 72 76 65 72 50 6f 72 74 20 26 26 20 28 63 20  erverPort && (c 
c050: 3d 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 29 21  = *zServerPort)!
c060: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
c070: 20 26 26 20 28 63 21 3d 27 3a 27 20 7c 7c 20 69   && (c!=':' || i
c080: 6e 53 71 75 61 72 65 29 20 29 7b 0a 20 20 20 20  nSquare) ){.    
c090: 20 20 20 20 69 66 28 20 63 3d 3d 27 5b 27 20 29      if( c=='[' )
c0a0: 20 69 6e 53 71 75 61 72 65 20 3d 20 31 3b 0a 20   inSquare = 1;. 
c0b0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
c0c0: 27 20 29 20 69 6e 53 71 75 61 72 65 20 3d 20 30  ' ) inSquare = 0
c0d0: 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76 65  ;.        zServe
c0e0: 72 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  rPort++;.      }
c0f0: 0a 20 20 20 20 20 20 69 66 28 20 7a 53 65 72 76  .      if( zServ
c100: 65 72 50 6f 72 74 20 26 26 20 2a 7a 53 65 72 76  erPort && *zServ
c110: 65 72 50 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  erPort ){.      
c120: 20 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 3d    *zServerPort =
c130: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 53 65 72   0;.        zSer
c140: 76 65 72 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20  verPort++;.     
c150: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 52 65   }.      if( zRe
c160: 61 6c 50 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  alPort ){.      
c170: 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20    zServerPort = 
c180: 53 74 72 44 75 70 28 7a 52 65 61 6c 50 6f 72 74  StrDup(zRealPort
c190: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c1a0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
c1b0: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
c1c0: 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 3a 22 29  Authorization:")
c1d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41 75  ==0 ){.      zAu
c1e0: 74 68 54 79 70 65 20 3d 20 47 65 74 46 69 72 73  thType = GetFirs
c1f0: 74 45 6c 65 6d 65 6e 74 28 53 74 72 44 75 70 28  tElement(StrDup(
c200: 7a 56 61 6c 29 2c 20 26 7a 41 75 74 68 41 72 67  zVal), &zAuthArg
c210: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
c220: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
c230: 6c 64 4e 61 6d 65 2c 22 49 66 2d 4e 6f 6e 65 2d  ldName,"If-None-
c240: 4d 61 74 63 68 3a 22 29 3d 3d 30 20 29 7b 0a 20  Match:")==0 ){. 
c250: 20 20 20 20 20 7a 49 66 4e 6f 6e 65 4d 61 74 63       zIfNoneMatc
c260: 68 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  h = StrDup(zVal)
c270: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c280: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
c290: 64 4e 61 6d 65 2c 22 49 66 2d 4d 6f 64 69 66 69  dName,"If-Modifi
c2a0: 65 64 2d 53 69 6e 63 65 3a 22 29 3d 3d 30 20 29  ed-Since:")==0 )
c2b0: 7b 0a 20 20 20 20 20 20 7a 49 66 4d 6f 64 69 66  {.      zIfModif
c2c0: 69 65 64 53 69 6e 63 65 20 3d 20 53 74 72 44 75  iedSince = StrDu
c2d0: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  p(zVal);.    }. 
c2e0: 20 7d 0a 23 69 66 64 65 66 20 4c 4f 47 5f 48 45   }.#ifdef LOG_HE
c2f0: 41 44 45 52 0a 20 20 69 66 28 20 68 64 72 4c 6f  ADER.  if( hdrLo
c300: 67 20 29 20 66 63 6c 6f 73 65 28 68 64 72 4c 6f  g ) fclose(hdrLo
c310: 67 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  g);.#endif..  /*
c320: 20 44 69 73 61 6c 6c 6f 77 20 72 65 71 75 65 73   Disallow reques
c330: 74 73 20 66 72 6f 6d 20 63 65 72 74 61 69 6e 20  ts from certain 
c340: 63 6c 69 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28  clients */.  if(
c350: 20 7a 41 67 65 6e 74 20 29 7b 0a 20 20 20 20 69   zAgent ){.    i
c360: 66 28 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  f( strstr(zAgent
c370: 2c 20 22 57 69 6e 64 6f 77 73 5f 39 22 29 21 3d  , "Windows_9")!=
c380: 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72  0.     || strstr
c390: 28 7a 41 67 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f  (zAgent, "Downlo
c3a0: 61 64 5f 4d 61 73 74 65 72 22 29 21 3d 30 0a 20  ad_Master")!=0. 
c3b0: 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41      || strstr(zA
c3c0: 67 65 6e 74 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29  gent, "Ezooms/")
c3d0: 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73  !=0.     || strs
c3e0: 74 72 28 7a 41 67 65 6e 74 2c 20 22 48 54 54 72  tr(zAgent, "HTTr
c3f0: 61 63 6b 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c  ack")!=0.     ||
c400: 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20   strstr(zAgent, 
c410: 22 41 68 72 65 66 73 42 6f 74 22 29 21 3d 30 0a  "AhrefsBot")!=0.
c420: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46 6f 72      ){.      For
c430: 62 69 64 64 65 6e 28 32 35 30 29 3b 20 20 2f 2a  bidden(250);  /*
c440: 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64   LOG: Disallowed
c450: 20 75 73 65 72 20 61 67 65 6e 74 20 2a 2f 0a 20   user agent */. 
c460: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 30 0a 20     }.  }.#if 0. 
c470: 20 69 66 28 20 7a 52 65 66 65 72 65 72 20 29 7b   if( zReferer ){
c480: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
c490: 74 20 63 68 61 72 20 2a 61 7a 44 69 73 61 6c 6c  t char *azDisall
c4a0: 6f 77 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 22  ow[] = {.      "
c4b0: 73 6b 69 64 72 6f 77 63 72 61 63 6b 2e 63 6f 6d  skidrowcrack.com
c4c0: 22 2c 0a 20 20 20 20 20 20 22 68 6f 73 68 69 79  ",.      "hoshiy
c4d0: 75 75 67 69 2e 74 69 73 74 6f 72 79 2e 63 6f 6d  uugi.tistory.com
c4e0: 22 2c 0a 20 20 20 20 20 20 22 73 6b 69 64 72 6f  ",.      "skidro
c4f0: 77 67 61 6d 65 73 2e 6e 65 74 22 2c 0a 20 20 20  wgames.net",.   
c500: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   };.    int i;. 
c510: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
c520: 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 29  zeof(azDisallow)
c530: 2f 73 69 7a 65 6f 66 28 61 7a 44 69 73 61 6c 6c  /sizeof(azDisall
c540: 6f 77 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ow[0]); i++){.  
c550: 20 20 20 20 69 66 28 20 73 74 72 73 74 72 28 7a      if( strstr(z
c560: 52 65 66 65 72 65 72 2c 20 61 7a 44 69 73 61 6c  Referer, azDisal
c570: 6c 6f 77 5b 69 5d 29 21 3d 30 20 29 7b 0a 20 20  low[i])!=0 ){.  
c580: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 32        NotFound(2
c590: 36 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 44 69  60);  /* LOG: Di
c5a0: 73 61 6c 6c 6f 77 65 64 20 72 65 66 65 72 72 65  sallowed referre
c5b0: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  r */.      }.   
c5c0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
c5d0: 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 65 78 74 72   /* Make an extr
c5e0: 61 20 65 66 66 6f 72 74 20 74 6f 20 67 65 74 20  a effort to get 
c5f0: 61 20 76 61 6c 69 64 20 73 65 72 76 65 72 20 6e  a valid server n
c600: 61 6d 65 20 61 6e 64 20 70 6f 72 74 20 6e 75 6d  ame and port num
c610: 62 65 72 2e 0a 20 20 2a 2a 20 4f 6e 6c 79 20 4e  ber..  ** Only N
c620: 65 74 73 63 61 70 65 20 70 72 6f 76 69 64 65 73  etscape provides
c630: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
c640: 6e 2e 20 20 49 66 20 74 68 65 20 62 72 6f 77 73  n.  If the brows
c650: 65 72 20 69 73 0a 20 20 2a 2a 20 49 6e 74 65 72  er is.  ** Inter
c660: 6e 65 74 20 45 78 70 6c 6f 72 65 72 2c 20 74 68  net Explorer, th
c670: 65 6e 20 77 65 20 68 61 76 65 20 74 6f 20 66 69  en we have to fi
c680: 6e 64 20 6f 75 74 20 74 68 65 20 69 6e 66 6f 72  nd out the infor
c690: 6d 61 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  mation for.  ** 
c6a0: 6f 75 72 73 65 6c 76 65 73 2e 0a 20 20 2a 2f 0a  ourselves..  */.
c6b0: 20 20 69 66 28 20 7a 53 65 72 76 65 72 4e 61 6d    if( zServerNam
c6c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72  e==0 ){.    zSer
c6d0: 76 65 72 4e 61 6d 65 20 3d 20 53 61 66 65 4d 61  verName = SafeMa
c6e0: 6c 6c 6f 63 28 20 31 30 30 20 29 3b 0a 20 20 20  lloc( 100 );.   
c6f0: 20 67 65 74 68 6f 73 74 6e 61 6d 65 28 7a 53 65   gethostname(zSe
c700: 72 76 65 72 4e 61 6d 65 2c 31 30 30 29 3b 0a 20  rverName,100);. 
c710: 20 7d 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72   }.  if( zServer
c720: 50 6f 72 74 3d 3d 30 20 7c 7c 20 2a 7a 53 65 72  Port==0 || *zSer
c730: 76 65 72 50 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  verPort==0 ){.  
c740: 20 20 7a 53 65 72 76 65 72 50 6f 72 74 20 3d 20    zServerPort = 
c750: 44 45 46 41 55 4c 54 5f 50 4f 52 54 3b 0a 20 20  DEFAULT_PORT;.  
c760: 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  }..  /* Remove t
c770: 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67 20  he query string 
c780: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
c790: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 66 69  the requested fi
c7a0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a  le..  */.  for(z
c7b0: 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 20 26 26 20  =zScript; *z && 
c7c0: 2a 7a 21 3d 27 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a  *z!='?'; z++){}.
c7d0: 20 20 69 66 28 20 2a 7a 3d 3d 27 3f 27 20 29 7b    if( *z=='?' ){
c7e0: 0a 20 20 20 20 7a 51 75 65 72 79 53 75 66 66 69  .    zQuerySuffi
c7f0: 78 20 3d 20 53 74 72 44 75 70 28 7a 29 3b 0a 20  x = StrDup(z);. 
c800: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c     *z = 0;.  }el
c810: 73 65 7b 0a 20 20 20 20 7a 51 75 65 72 79 53 75  se{.    zQuerySu
c820: 66 66 69 78 20 3d 20 22 22 3b 0a 20 20 7d 0a 20  ffix = "";.  }. 
c830: 20 7a 51 75 65 72 79 53 74 72 69 6e 67 20 3d 20   zQueryString = 
c840: 2a 7a 51 75 65 72 79 53 75 66 66 69 78 20 3f 20  *zQuerySuffix ? 
c850: 26 7a 51 75 65 72 79 53 75 66 66 69 78 5b 31 5d  &zQuerySuffix[1]
c860: 20 3a 20 7a 51 75 65 72 79 53 75 66 66 69 78 3b   : zQuerySuffix;
c870: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
c880: 66 69 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  file to hold the
c890: 20 50 4f 53 54 20 71 75 65 72 79 20 64 61 74 61   POST query data
c8a0: 2c 20 69 66 20 61 6e 79 2e 20 20 57 65 20 68 61  , if any.  We ha
c8b0: 76 65 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 69 74  ve to.  ** do it
c8c0: 20 74 68 69 73 20 77 61 79 2e 20 20 57 65 20 63   this way.  We c
c8d0: 61 6e 27 74 20 6a 75 73 74 20 70 61 73 73 20 74  an't just pass t
c8e0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
c8f0: 6f 72 20 64 6f 77 6e 20 74 6f 0a 20 20 2a 2a 20  or down to.  ** 
c900: 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73  the child proces
c910: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 66 67  s because the fg
c920: 65 74 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  ets() function m
c930: 61 79 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  ay have already.
c940: 20 20 2a 2a 20 72 65 61 64 20 70 61 72 74 20 6f    ** read part o
c950: 66 20 74 68 65 20 50 4f 53 54 20 64 61 74 61 20  f the POST data 
c960: 69 6e 74 6f 20 69 74 73 20 69 6e 74 65 72 6e 61  into its interna
c970: 6c 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  l buffer..  */. 
c980: 20 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d   if( zMethod[0]=
c990: 3d 27 50 27 20 26 26 20 7a 43 6f 6e 74 65 6e 74  ='P' && zContent
c9a0: 4c 65 6e 67 74 68 21 3d 30 20 29 7b 0a 20 20 20  Length!=0 ){.   
c9b0: 20 69 6e 74 20 6c 65 6e 20 3d 20 61 74 6f 69 28   int len = atoi(
c9c0: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 29 3b  zContentLength);
c9d0: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a  .    FILE *out;.
c9e0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a      char *zBuf;.
c9f0: 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20      int n;..    
ca00: 69 66 28 20 6c 65 6e 3e 4d 41 58 5f 43 4f 4e 54  if( len>MAX_CONT
ca10: 45 4e 54 5f 4c 45 4e 47 54 48 20 29 7b 0a 20 20  ENT_LENGTH ){.  
ca20: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
ca30: 65 28 22 35 30 30 20 52 65 71 75 65 73 74 20 74  e("500 Request t
ca40: 6f 6f 20 6c 61 72 67 65 22 29 3b 0a 20 20 20 20  oo large");.    
ca50: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
ca60: 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65  (.        "Conte
ca70: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c  nt-type: text/pl
ca80: 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20  ain\r\n".       
ca90: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20   "\r\n".        
caa0: 22 54 6f 6f 20 6d 75 63 68 20 50 4f 53 54 20 64  "Too much POST d
cab0: 61 74 61 5c 6e 22 0a 20 20 20 20 20 20 29 3b 0a  ata\n".      );.
cac0: 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74        MakeLogEnt
cad0: 72 79 28 30 2c 20 32 37 30 29 3b 20 2f 2a 20 4c  ry(0, 270); /* L
cae0: 4f 47 3a 20 52 65 71 75 65 73 74 20 74 6f 6f 20  OG: Request too 
caf0: 6c 61 72 67 65 20 2a 2f 0a 20 20 20 20 20 20 65  large */.      e
cb00: 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(0);.    }.  
cb10: 20 20 73 70 72 69 6e 74 66 28 7a 54 6d 70 4e 61    sprintf(zTmpNa
cb20: 6d 42 75 66 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73  mBuf, "/tmp/-pos
cb30: 74 2d 64 61 74 61 2d 58 58 58 58 58 58 22 29 3b  t-data-XXXXXX");
cb40: 0a 20 20 20 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a  .    zTmpNam = z
cb50: 54 6d 70 4e 61 6d 42 75 66 3b 0a 20 20 20 20 69  TmpNamBuf;.    i
cb60: 66 28 20 6d 6b 73 74 65 6d 70 28 7a 54 6d 70 4e  f( mkstemp(zTmpN
cb70: 61 6d 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 4d  am)<0 ){.      M
cb80: 61 6c 66 75 6e 63 74 69 6f 6e 28 32 38 30 2c 20  alfunction(280, 
cb90: 20 2f 2a 20 4c 4f 47 3a 20 6d 6b 73 74 65 6d 70   /* LOG: mkstemp
cba0: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e              "Can
cbc0: 6e 6f 74 20 63 72 65 61 74 65 20 61 20 74 65 6d  not create a tem
cbd0: 70 20 66 69 6c 65 20 69 6e 20 77 68 69 63 68 20  p file in which 
cbe0: 74 6f 20 73 74 6f 72 65 20 50 4f 53 54 20 64 61  to store POST da
cbf0: 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ta");.    }.    
cc00: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 54 6d 70  out = fopen(zTmp
cc10: 4e 61 6d 2c 22 77 22 29 3b 0a 20 20 20 20 69 66  Nam,"w");.    if
cc20: 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
cc30: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
cc40: 22 35 30 30 20 43 61 6e 6e 6f 74 20 63 72 65 61  "500 Cannot crea
cc50: 74 65 20 2f 74 6d 70 20 66 69 6c 65 22 29 3b 0a  te /tmp file");.
cc60: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
cc70: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 43  intf(.        "C
cc80: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
cc90: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
cca0: 20 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20       "\r\n".    
ccb0: 20 20 20 20 22 43 6f 75 6c 64 20 6e 6f 74 20 6f      "Could not o
ccc0: 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77  pen \"%s\" for w
ccd0: 72 69 74 69 6e 67 5c 6e 22 2c 20 7a 54 6d 70 4e  riting\n", zTmpN
cce0: 61 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  am.      );.    
ccf0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
cd00: 2c 20 32 39 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  , 290); /* LOG: 
cd10: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 65  cannot create te
cd20: 6d 70 20 66 69 6c 65 20 66 6f 72 20 50 4f 53 54  mp file for POST
cd30: 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30   */.      exit(0
cd40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  );.    }.    zBu
cd50: 66 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20  f = SafeMalloc( 
cd60: 6c 65 6e 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  len+1 );.    if(
cd70: 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c   useTimeout ) al
cd80: 61 72 6d 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30  arm(15 + len/200
cd90: 30 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61  0);.    n = frea
cda0: 64 28 7a 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64  d(zBuf,1,len,std
cdb0: 69 6e 29 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20  in);.    nIn += 
cdc0: 6e 3b 0a 20 20 20 20 66 77 72 69 74 65 28 7a 42  n;.    fwrite(zB
cdd0: 75 66 2c 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20  uf,1,n,out);.   
cde0: 20 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20   free(zBuf);.   
cdf0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
ce00: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
ce10: 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 74 69  e the running ti
ce20: 6d 65 20 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72  me is not too gr
ce30: 65 61 74 20 2a 2f 0a 20 20 69 66 28 20 75 73 65  eat */.  if( use
ce40: 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28  Timeout ) alarm(
ce50: 31 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  10);..  /* Conve
ce60: 72 74 20 61 6c 6c 20 75 6e 75 73 75 61 6c 20 63  rt all unusual c
ce70: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
ce80: 20 73 63 72 69 70 74 20 6e 61 6d 65 20 69 6e 74   script name int
ce90: 6f 20 22 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o "_"..  **.  **
cea0: 20 54 68 69 73 20 69 73 20 61 20 64 65 66 65 6e   This is a defen
ceb0: 73 65 20 61 67 61 69 6e 73 74 20 76 61 72 69 6f  se against vario
cec0: 75 73 20 61 74 74 61 63 6b 73 2c 20 58 53 53 20  us attacks, XSS 
ced0: 61 74 74 61 63 6b 73 20 69 6e 20 70 61 72 74 69  attacks in parti
cee0: 63 75 6c 61 72 2e 0a 20 20 2a 2f 0a 20 20 73 61  cular..  */.  sa
cef0: 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 7a 53 63  nitizeString(zSc
cf00: 72 69 70 74 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  ript);..  /* Do 
cf10: 6e 6f 74 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f  not allow "/." o
cf20: 72 20 22 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63  r "/-" to to occ
cf30: 75 72 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74  ur anywhere in t
cf40: 68 65 20 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a  he entity name..
cf50: 20 20 2a 2a 20 54 68 69 73 20 70 72 65 76 65 6e    ** This preven
cf60: 74 73 20 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c  ts attacks invol
cf70: 76 69 6e 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c  ving ".." and al
cf80: 73 6f 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  so allows us to 
cf90: 63 72 65 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65  create.  ** file
cfa0: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
cfb0: 73 20 77 68 6f 73 65 20 6e 61 6d 65 73 20 62 65  s whose names be
cfc0: 67 69 6e 20 77 69 74 68 20 22 2d 22 20 6f 72 20  gin with "-" or 
cfd0: 22 2e 22 20 77 68 69 63 68 20 61 72 65 0a 20 20  "." which are.  
cfe0: 2a 2a 20 69 6e 76 69 73 69 62 6c 65 20 74 6f 20  ** invisible to 
cff0: 74 68 65 20 77 65 62 73 65 72 76 65 72 2e 0a 20  the webserver.. 
d000: 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
d010: 6f 6e 3a 20 20 41 6c 6c 6f 77 20 74 68 65 20 22  on:  Allow the "
d020: 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 20 70  /.well-known/" p
d030: 72 65 66 69 78 20 69 6e 20 61 63 63 6f 72 64 61  refix in accorda
d040: 6e 63 65 20 77 69 74 68 0a 20 20 2a 2a 20 52 46  nce with.  ** RF
d050: 43 2d 35 37 38 35 0a 20 20 2a 2f 0a 20 20 66 6f  C-5785.  */.  fo
d060: 72 28 7a 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b  r(z=zScript; *z;
d070: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
d080: 7a 3d 3d 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d  z=='/' && (z[1]=
d090: 3d 27 2e 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d  ='.' || z[1]=='-
d0a0: 27 29 0a 20 20 20 20 20 26 26 20 28 7a 3e 7a 53  ').     && (z>zS
d0b0: 63 72 69 70 74 20 7c 7c 20 73 74 72 6e 63 6d 70  cript || strncmp
d0c0: 28 7a 2c 22 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e  (z,"/.well-known
d0d0: 2f 22 2c 31 33 29 21 3d 30 29 0a 20 20 20 20 29  /",13)!=0).    )
d0e0: 7b 0a 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  {.       NotFoun
d0f0: 64 28 33 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  d(300); /* LOG: 
d100: 50 61 74 68 20 65 6c 65 6d 65 6e 74 20 62 65 67  Path element beg
d110: 69 6e 73 20 77 69 74 68 20 22 2e 22 20 6f 72 20  ins with "." or 
d120: 22 2d 22 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  "-" */.    }.  }
d130: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
d140: 74 20 77 68 61 74 20 74 68 65 20 72 6f 6f 74 20  t what the root 
d150: 6f 66 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  of the filesyste
d160: 6d 20 73 68 6f 75 6c 64 20 62 65 2e 20 20 49 66  m should be.  If
d170: 20 74 68 65 0a 20 20 2a 2a 20 48 54 54 50 5f 48   the.  ** HTTP_H
d180: 4f 53 54 20 70 61 72 61 6d 65 74 65 72 20 65 78  OST parameter ex
d190: 69 73 74 73 20 28 73 74 6f 72 65 64 20 69 6e 20  ists (stored in 
d1a0: 7a 48 74 74 70 48 6f 73 74 29 20 74 68 65 6e 20  zHttpHost) then 
d1b0: 72 65 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  remove the.  ** 
d1c0: 70 6f 72 74 20 6e 75 6d 62 65 72 20 66 72 6f 6d  port number from
d1d0: 20 74 68 65 20 65 6e 64 20 28 69 66 20 61 6e 79   the end (if any
d1e0: 29 2c 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20 63  ), convert all c
d1f0: 68 61 72 61 63 74 65 72 73 20 74 6f 20 6c 6f 77  haracters to low
d200: 65 72 0a 20 20 2a 2a 20 63 61 73 65 2c 20 61 6e  er.  ** case, an
d210: 64 20 63 6f 6e 76 65 72 74 20 61 6c 6c 20 22 2e  d convert all ".
d220: 22 20 74 6f 20 22 5f 22 2e 20 20 54 68 65 6e 20  " to "_".  Then 
d230: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 20 64 69  try to find a di
d240: 72 65 63 74 6f 72 79 0a 20 20 2a 2a 20 77 69 74  rectory.  ** wit
d250: 68 20 74 68 61 74 20 6e 61 6d 65 20 61 6e 64 20  h that name and 
d260: 74 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 2e 77  the extension .w
d270: 65 62 73 69 74 65 2e 20 20 49 66 20 6e 6f 74 20  ebsite.  If not 
d280: 66 6f 75 6e 64 2c 20 6c 6f 6f 6b 0a 20 20 2a 2a  found, look.  **
d290: 20 66 6f 72 20 22 64 65 66 61 75 6c 74 2e 77 65   for "default.we
d2a0: 62 73 69 74 65 22 2e 0a 20 20 2a 2f 0a 20 20 69  bsite"..  */.  i
d2b0: 66 28 20 7a 53 63 72 69 70 74 5b 30 5d 21 3d 27  f( zScript[0]!='
d2c0: 2f 27 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75  /' ){.    NotFou
d2d0: 6e 64 28 33 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a  nd(310); /* LOG:
d2e0: 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 73 74   URI does not st
d2f0: 61 72 74 20 77 69 74 68 20 22 2f 22 20 2a 2f 0a  art with "/" */.
d300: 20 20 7d 0a 20 20 69 66 28 20 73 74 72 6c 65 6e    }.  if( strlen
d310: 28 7a 52 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69  (zRoot)+40 >= si
d320: 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20  zeof(zLine) ){. 
d330: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 32 30      NotFound(320
d340: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 74  ); /* LOG: URI t
d350: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 7d 0a 20  oo long */.  }. 
d360: 20 69 66 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d   if( zHttpHost==
d370: 30 20 7c 7c 20 7a 48 74 74 70 48 6f 73 74 5b 30  0 || zHttpHost[0
d380: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46  ]==0 ){.    NotF
d390: 6f 75 6e 64 28 33 33 30 29 3b 20 20 2f 2a 20 4c  ound(330);  /* L
d3a0: 4f 47 3a 20 4d 69 73 73 69 6e 67 20 48 4f 53 54  OG: Missing HOST
d3b0: 3a 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  : parameter */. 
d3c0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6c 65   }else if( strle
d3d0: 6e 28 7a 48 74 74 70 48 6f 73 74 29 2b 73 74 72  n(zHttpHost)+str
d3e0: 6c 65 6e 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d  len(zRoot)+10 >=
d3f0: 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29   sizeof(zLine) )
d400: 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33  {.    NotFound(3
d410: 34 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 48 4f  40);  /* LOG: HO
d420: 53 54 20 70 61 72 61 6d 65 74 65 72 20 74 6f 6f  ST parameter too
d430: 20 6c 6f 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65   long */.  }else
d440: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  {.    sprintf(zL
d450: 69 6e 65 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52  ine, "%s/%s", zR
d460: 6f 6f 74 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b  oot, zHttpHost);
d470: 0a 20 20 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  .    for(i=strle
d480: 6e 28 7a 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e  n(zRoot)+1; zLin
d490: 65 5b 69 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d  e[i] && zLine[i]
d4a0: 21 3d 27 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20  !=':'; i++){.   
d4b0: 20 20 20 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65     int c = zLine
d4c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  [i];.      if( !
d4d0: 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20  isalnum(c) ){.  
d4e0: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d        zLine[i] =
d4f0: 20 27 5f 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73   '_';.      }els
d500: 65 20 69 66 28 20 69 73 75 70 70 65 72 28 63 29  e if( isupper(c)
d510: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e   ){.        zLin
d520: 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63  e[i] = tolower(c
d530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d540: 0a 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69  .    strcpy(&zLi
d550: 6e 65 5b 69 5d 2c 20 22 2e 77 65 62 73 69 74 65  ne[i], ".website
d560: 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ");.  }.  if( st
d570: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
d580: 66 29 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73  f) || !S_ISDIR(s
d590: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  tatbuf.st_mode) 
d5a0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
d5b0: 4c 69 6e 65 2c 20 22 25 73 2f 64 65 66 61 75 6c  Line, "%s/defaul
d5c0: 74 2e 77 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f  t.website", zRoo
d5d0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74  t);.    if( stat
d5e0: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
d5f0: 20 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61   || !S_ISDIR(sta
d600: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  tbuf.st_mode) ){
d610: 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 6e 64  .      if( stand
d620: 61 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  alone ){.       
d630: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
d640: 22 25 73 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20  "%s", zRoot);.  
d650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d660: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 35 30 29     NotFound(350)
d670: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 2a 2e 77 65 62  ;  /* LOG: *.web
d680: 73 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  site permissions
d690: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
d6a0: 7d 0a 20 20 7d 0a 20 20 7a 48 6f 6d 65 20 3d 20  }.  }.  zHome = 
d6b0: 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 0a  StrDup(zLine);..
d6c0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
d6d0: 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
d6e0: 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
d6f0: 66 69 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a  filesystem.  */.
d700: 20 20 69 66 28 20 63 68 64 69 72 28 7a 48 6f 6d    if( chdir(zHom
d710: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  e)!=0 ){.    cha
d720: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
d730: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 33 36    Malfunction(36
d740: 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69  0,  /* LOG: chdi
d750: 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  r() failed */.  
d760: 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
d770: 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f  hdir to [%s] fro
d780: 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20  m [%s]",.       
d790: 20 20 7a 48 6f 6d 65 2c 20 67 65 74 63 77 64 28    zHome, getcwd(
d7a0: 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a  zBuf,999));.  }.
d7b0: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d7c0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
d7d0: 65 73 79 73 74 65 6d 2e 20 20 57 65 20 6d 69 67  esystem.  We mig
d7e0: 68 74 20 68 61 76 65 20 74 6f 20 61 70 70 65 6e  ht have to appen
d7f0: 64 0a 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20  d.  ** the name 
d800: 22 69 6e 64 65 78 2e 68 74 6d 6c 22 20 69 6e 20  "index.html" in 
d810: 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 69 74  order to find it
d820: 2e 20 20 41 6e 79 20 65 78 63 65 73 73 20 70 61  .  Any excess pa
d830: 74 68 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  th.  ** informat
d840: 69 6f 6e 20 69 73 20 70 75 74 20 69 6e 74 6f 20  ion is put into 
d850: 74 68 65 20 7a 50 61 74 68 49 6e 66 6f 20 76 61  the zPathInfo va
d860: 72 69 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6a  riable..  */.  j
d870: 20 3d 20 6a 30 20 3d 20 28 69 6e 74 29 73 74 72   = j0 = (int)str
d880: 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 20  len(zLine);.  i 
d890: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 53  = 0;.  while( zS
d8a0: 63 72 69 70 74 5b 69 5d 20 29 7b 0a 20 20 20 20  cript[i] ){.    
d8b0: 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69  while( zScript[i
d8c0: 5d 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 7a 53  ] && (i==0 || zS
d8d0: 63 72 69 70 74 5b 69 5d 21 3d 27 2f 27 29 20 29  cript[i]!='/') )
d8e0: 7b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d  {.      zLine[j]
d8f0: 20 3d 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20   = zScript[i];. 
d900: 20 20 20 20 20 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20       i++; j++;. 
d910: 20 20 20 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 6a     }.    zLine[j
d920: 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  ] = 0;.    if( s
d930: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
d940: 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  uf)!=0 ){.      
d950: 69 6e 74 20 73 74 69 6c 6c 53 65 61 72 63 68 69  int stillSearchi
d960: 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 68  ng = 1;.      wh
d970: 69 6c 65 28 20 73 74 69 6c 6c 53 65 61 72 63 68  ile( stillSearch
d980: 69 6e 67 20 26 26 20 69 3e 30 20 26 26 20 6a 3e  ing && i>0 && j>
d990: 6a 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  j0 ){.        wh
d9a0: 69 6c 65 28 20 6a 3e 6a 30 20 26 26 20 7a 4c 69  ile( j>j0 && zLi
d9b0: 6e 65 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20  ne[j-1]!='/' ){ 
d9c0: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 73  j--; }.        s
d9d0: 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 6a 2d 31  trcpy(&zLine[j-1
d9e0: 5d 2c 20 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e 68  ], "/not-found.h
d9f0: 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 69  tml");.        i
da00: 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73  f( stat(zLine,&s
da10: 74 61 74 62 75 66 29 3d 3d 30 20 26 26 20 53 5f  tatbuf)==0 && S_
da20: 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74  ISREG(statbuf.st
da30: 5f 6d 6f 64 65 29 0a 20 20 20 20 20 20 20 20 20  _mode).         
da40: 20 20 20 26 26 20 61 63 63 65 73 73 28 7a 4c 69     && access(zLi
da50: 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ne,R_OK)==0 ){. 
da60: 20 20 20 20 20 20 20 20 20 7a 52 65 61 6c 53 63           zRealSc
da70: 72 69 70 74 20 3d 20 53 74 72 44 75 70 28 26 7a  ript = StrDup(&z
da80: 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20 20 20 20  Line[j0]);.     
da90: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52       Redirect(zR
daa0: 65 61 6c 53 63 72 69 70 74 2c 20 31 2c 20 33 37  ealScript, 1, 37
dab0: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 72 65 64 69  0); /* LOG: redi
dac0: 72 65 63 74 20 74 6f 20 6e 6f 74 2d 66 6f 75 6e  rect to not-foun
dad0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  d */.          r
dae0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d  eturn;.        }
daf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
db00: 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  j--;.        }. 
db10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
db20: 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20   stillSearching 
db30: 29 20 4e 6f 74 46 6f 75 6e 64 28 33 38 30 29 3b  ) NotFound(380);
db40: 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 6e 6f 74   /* LOG: URI not
db50: 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
db60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
db70: 20 69 66 28 20 53 5f 49 53 52 45 47 28 73 74 61   if( S_ISREG(sta
db80: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b  tbuf.st_mode) ){
db90: 0a 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73  .      if( acces
dba0: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b  s(zLine,R_OK) ){
dbb0: 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e  .        NotFoun
dbc0: 64 28 33 39 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  d(390);  /* LOG:
dbd0: 20 46 69 6c 65 20 6e 6f 74 20 72 65 61 64 61 62   File not readab
dbe0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  le */.      }.  
dbf0: 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20      zRealScript 
dc00: 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b  = StrDup(&zLine[
dc10: 6a 30 5d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  j0]);.      brea
dc20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
dc30: 20 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20 7c   zScript[i]==0 |
dc40: 7c 20 7a 53 63 72 69 70 74 5b 69 2b 31 5d 3d 3d  | zScript[i+1]==
dc50: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  0 ){.      int k
dc60: 20 3d 20 6a 3e 30 20 26 26 20 7a 4c 69 6e 65 5b   = j>0 && zLine[
dc70: 6a 2d 31 5d 3d 3d 27 2f 27 20 3f 20 6a 2d 31 20  j-1]=='/' ? j-1 
dc80: 3a 20 6a 3b 0a 20 20 20 20 20 20 73 74 72 63 70  : j;.      strcp
dc90: 79 28 26 7a 4c 69 6e 65 5b 6b 5d 2c 22 2f 69 6e  y(&zLine[k],"/in
dca0: 64 65 78 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20  dex.html");.    
dcb0: 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65    if( stat(zLine
dcc0: 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c 7c  ,&statbuf)!=0 ||
dcd0: 20 21 53 5f 49 53 52 45 47 28 73 74 61 74 62 75   !S_ISREG(statbu
dce0: 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20  f.st_mode) .    
dcf0: 20 20 7c 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e    || access(zLin
dd00: 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  e,R_OK) ){.     
dd10: 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65     strcpy(&zLine
dd20: 5b 6b 5d 2c 22 2f 69 6e 64 65 78 2e 63 67 69 22  [k],"/index.cgi"
dd30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
dd40: 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62  tat(zLine,&statb
dd50: 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52  uf)!=0 || !S_ISR
dd60: 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
dd70: 64 65 29 20 0a 20 20 20 20 20 20 20 20 7c 7c 20  de) .        || 
dd80: 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f  access(zLine,R_O
dd90: 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  K) ){.          
dda0: 4e 6f 74 46 6f 75 6e 64 28 34 30 30 29 3b 20 2f  NotFound(400); /
ddb0: 2a 20 4c 4f 47 3a 20 55 52 49 20 69 73 20 61 20  * LOG: URI is a 
ddc0: 64 69 72 65 63 74 6f 72 79 20 77 2f 6f 20 69 6e  directory w/o in
ddd0: 64 65 78 2e 68 74 6d 6c 20 2a 2f 0a 20 20 20 20  dex.html */.    
dde0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ddf0: 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20      zRealScript 
de00: 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b  = StrDup(&zLine[
de10: 6a 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  j0]);.      if( 
de20: 7a 53 63 72 69 70 74 5b 69 5d 3d 3d 30 20 29 7b  zScript[i]==0 ){
de30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
de40: 68 65 20 72 65 71 75 65 73 74 65 64 20 55 52 4c  he requested URL
de50: 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20 77 69   does not end wi
de60: 74 68 20 22 2f 22 20 62 75 74 20 77 65 20 68 61  th "/" but we ha
de70: 64 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  d to.        ** 
de80: 61 70 70 65 6e 64 20 22 69 6e 64 65 78 2e 68 74  append "index.ht
de90: 6d 6c 22 2c 20 74 68 65 6e 20 61 20 72 65 64 69  ml", then a redi
dea0: 72 65 63 74 20 69 73 20 6e 65 63 65 73 73 61 72  rect is necessar
deb0: 79 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  y.  Otherwise.  
dec0: 20 20 20 20 20 20 2a 2a 20 6e 6f 6e 65 20 6f 66        ** none of
ded0: 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 55 52   the relative UR
dee0: 4c 73 20 69 6e 20 74 68 65 20 64 65 6c 69 76 65  Ls in the delive
def0: 72 65 64 20 64 6f 63 75 6d 65 6e 74 20 77 69 6c  red document wil
df00: 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
df10: 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 20 20 20 20  correct. */.    
df20: 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 52 65      Redirect(zRe
df30: 61 6c 53 63 72 69 70 74 2c 31 2c 34 31 30 29 3b  alScript,1,410);
df40: 20 2f 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63   /* LOG: redirec
df50: 74 20 74 6f 20 61 64 64 20 74 72 61 69 6c 69 6e  t to add trailin
df60: 67 20 2f 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  g / */.        r
df70: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
df80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
df90: 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d  }.    zLine[j] =
dfa0: 20 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20   zScript[i];.   
dfb0: 20 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 7d 0a 20   i++; j++;.  }. 
dfc0: 20 7a 46 69 6c 65 20 3d 20 53 74 72 44 75 70 28   zFile = StrDup(
dfd0: 7a 4c 69 6e 65 29 3b 0a 20 20 7a 50 61 74 68 49  zLine);.  zPathI
dfe0: 6e 66 6f 20 3d 20 53 74 72 44 75 70 28 26 7a 53  nfo = StrDup(&zS
dff0: 63 72 69 70 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e  cript[i]);.  len
e000: 46 69 6c 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46  File = strlen(zF
e010: 69 6c 65 29 3b 0a 20 20 7a 44 69 72 20 3d 20 53  ile);.  zDir = S
e020: 74 72 44 75 70 28 7a 46 69 6c 65 29 3b 0a 20 20  trDup(zFile);.  
e030: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 44 69  for(i=strlen(zDi
e040: 72 29 2d 31 3b 20 69 3e 30 20 26 26 20 7a 44 69  r)-1; i>0 && zDi
e050: 72 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  r[i]!='/'; i--){
e060: 7d 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  };.  if( i==0 ){
e070: 0a 20 20 20 20 20 73 74 72 63 70 79 28 7a 44 69  .     strcpy(zDi
e080: 72 2c 22 2f 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  r,"/");.  }else{
e090: 0a 20 20 20 20 20 7a 44 69 72 5b 69 5d 20 3d 20  .     zDir[i] = 
e0a0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
e0b0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
e0c0: 72 65 20 69 73 20 61 6e 20 61 75 74 68 6f 72 69  re is an authori
e0d0: 7a 61 74 69 6f 6e 20 66 69 6c 65 2e 20 20 49 66  zation file.  If
e0e0: 20 74 68 65 72 65 20 69 73 2c 0a 20 20 2a 2a 20   there is,.  ** 
e0f0: 70 72 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f  process it..  */
e100: 0a 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65  .  sprintf(zLine
e110: 2c 20 22 25 73 2f 2d 61 75 74 68 22 2c 20 7a 44  , "%s/-auth", zD
e120: 69 72 29 3b 0a 20 20 69 66 28 20 61 63 63 65 73  ir);.  if( acces
e130: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30  s(zLine,R_OK)==0
e140: 20 26 26 20 21 43 68 65 63 6b 42 61 73 69 63 41   && !CheckBasicA
e150: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c 69  uthorization(zLi
e160: 6e 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ne) ) return;.. 
e170: 20 2f 2a 20 54 61 6b 65 20 61 70 70 72 6f 70 72   /* Take appropr
e180: 69 61 74 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2f  iate action.  */
e190: 0a 20 20 69 66 28 20 28 73 74 61 74 62 75 66 2e  .  if( (statbuf.
e1a0: 73 74 5f 6d 6f 64 65 20 26 20 30 31 30 30 29 3d  st_mode & 0100)=
e1b0: 3d 30 31 30 30 20 26 26 20 61 63 63 65 73 73 28  =0100 && access(
e1c0: 7a 46 69 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29  zFile,X_OK)==0 )
e1d0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
e1e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 73 20 73  The followings s
e1f0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20  tatic variables 
e200: 61 72 65 20 75 73 65 64 20 74 6f 20 73 65 74 75  are used to setu
e210: 70 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  p the environmen
e220: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  t.    ** for the
e230: 20 43 47 49 20 73 63 72 69 70 74 0a 20 20 20 20   CGI script.    
e240: 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  */.    static ch
e250: 61 72 20 2a 64 65 66 61 75 6c 74 5f 70 61 74 68  ar *default_path
e260: 20 3d 20 22 2f 62 69 6e 3a 2f 75 73 72 2f 62 69   = "/bin:/usr/bi
e270: 6e 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  n";.    static c
e280: 68 61 72 20 2a 67 61 74 65 77 61 79 5f 69 6e 74  har *gateway_int
e290: 65 72 66 61 63 65 20 3d 20 22 43 47 49 2f 31 2e  erface = "CGI/1.
e2a0: 30 22 3b 0a 20 20 20 20 73 74 61 74 69 63 20 73  0";.    static s
e2b0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63 68  truct {.      ch
e2c0: 61 72 20 2a 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20  ar *zEnvName;.  
e2d0: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 45 6e 76      char **pzEnv
e2e0: 56 61 6c 75 65 3b 0a 20 20 20 20 7d 20 63 67 69  Value;.    } cgi
e2f0: 65 6e 76 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  env[] = {.      
e300: 7b 20 22 41 55 54 48 5f 54 59 50 45 22 2c 20 20  { "AUTH_TYPE",  
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 20 26 7a 41 75 74 68 54 79 70 65 20 7d 2c 0a 20   &zAuthType },. 
e330: 20 20 20 20 20 7b 20 22 41 55 54 48 5f 43 4f 4e       { "AUTH_CON
e340: 54 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  TENT",          
e350: 20 20 20 20 20 20 26 7a 41 75 74 68 41 72 67 20        &zAuthArg 
e360: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43 4f 4e 54  },.      { "CONT
e370: 45 4e 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20  ENT_LENGTH",    
e380: 20 20 20 20 20 20 20 20 20 20 26 7a 43 6f 6e 74            &zCont
e390: 65 6e 74 4c 65 6e 67 74 68 20 7d 2c 0a 20 20 20  entLength },.   
e3a0: 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 54 59     { "CONTENT_TY
e3b0: 50 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  PE",            
e3c0: 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 54 79 70      &zContentTyp
e3d0: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 44 4f  e },.      { "DO
e3e0: 43 55 4d 45 4e 54 5f 52 4f 4f 54 22 2c 20 20 20  CUMENT_ROOT",   
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 48 6f              &zHo
e400: 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 47  me },.      { "G
e410: 41 54 45 57 41 59 5f 49 4e 54 45 52 46 41 43 45  ATEWAY_INTERFACE
e420: 22 2c 20 20 20 20 20 20 20 20 20 20 20 26 67 61  ",           &ga
e430: 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65 20  teway_interface 
e440: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
e450: 5f 41 43 43 45 50 54 22 2c 20 20 20 20 20 20 20  _ACCEPT",       
e460: 20 20 20 20 20 20 20 20 20 20 26 7a 41 63 63 65            &zAcce
e470: 70 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48  pt },.      { "H
e480: 54 54 50 5f 41 43 43 45 50 54 5f 45 4e 43 4f 44  TTP_ACCEPT_ENCOD
e490: 49 4e 47 22 2c 20 20 20 20 20 20 20 20 26 7a 41  ING",        &zA
e4a0: 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 7d 2c  cceptEncoding },
e4b0: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 43  .      { "HTTP_C
e4c0: 4f 4f 4b 49 45 22 2c 20 20 20 20 20 20 20 20 20  OOKIE",         
e4d0: 20 20 20 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65          &zCookie
e4e0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
e4f0: 50 5f 48 4f 53 54 22 2c 20 20 20 20 20 20 20 20  P_HOST",        
e500: 20 20 20 20 20 20 20 20 20 20 20 26 7a 48 74 74             &zHtt
e510: 70 48 6f 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b  pHost },.      {
e520: 20 22 48 54 54 50 5f 49 46 5f 4d 4f 44 49 46 49   "HTTP_IF_MODIFI
e530: 45 44 5f 53 49 4e 43 45 22 2c 20 20 20 20 20 20  ED_SINCE",      
e540: 26 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63  &zIfModifiedSinc
e550: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54  e },.      { "HT
e560: 54 50 5f 49 46 5f 4e 4f 4e 45 5f 4d 41 54 43 48  TP_IF_NONE_MATCH
e570: 22 2c 20 20 20 20 20 20 20 20 20 20 26 7a 49 66  ",          &zIf
e580: 4e 6f 6e 65 4d 61 74 63 68 20 7d 2c 0a 20 20 20  NoneMatch },.   
e590: 20 20 20 7b 20 22 48 54 54 50 5f 52 45 46 45 52     { "HTTP_REFER
e5a0: 45 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ER",            
e5b0: 20 20 20 20 26 7a 52 65 66 65 72 65 72 20 7d 2c      &zReferer },
e5c0: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 55  .      { "HTTP_U
e5d0: 53 45 52 5f 41 47 45 4e 54 22 2c 20 20 20 20 20  SER_AGENT",     
e5e0: 20 20 20 20 20 20 20 20 26 7a 41 67 65 6e 74 20          &zAgent 
e5f0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41 54 48  },.      { "PATH
e600: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
e610: 20 20 20 20 20 20 20 20 20 20 26 64 65 66 61 75            &defau
e620: 6c 74 5f 70 61 74 68 20 7d 2c 0a 20 20 20 20 20  lt_path },.     
e630: 20 7b 20 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20   { "PATH_INFO", 
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 26 7a 50 61 74 68 49 6e 66 6f 20 7d 2c 0a    &zPathInfo },.
e660: 20 20 20 20 20 20 7b 20 22 51 55 45 52 59 5f 53        { "QUERY_S
e670: 54 52 49 4e 47 22 2c 20 20 20 20 20 20 20 20 20  TRING",         
e680: 20 20 20 20 20 20 20 26 7a 51 75 65 72 79 53 74         &zQuerySt
e690: 72 69 6e 67 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ring },.      { 
e6a0: 22 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c 20 20  "REMOTE_ADDR",  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e6c0: 7a 52 65 6d 6f 74 65 41 64 64 72 20 7d 2c 0a 20  zRemoteAddr },. 
e6d0: 20 20 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f       { "REQUEST_
e6e0: 4d 45 54 48 4f 44 22 2c 20 20 20 20 20 20 20 20  METHOD",        
e6f0: 20 20 20 20 20 20 26 7a 4d 65 74 68 6f 64 20 7d        &zMethod }
e700: 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 51 55 45  ,.      { "REQUE
e710: 53 54 5f 55 52 49 22 2c 20 20 20 20 20 20 20 20  ST_URI",        
e720: 20 20 20 20 20 20 20 20 20 26 7a 53 63 72 69 70           &zScrip
e730: 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45  t },.      { "RE
e740: 4d 4f 54 45 5f 55 53 45 52 22 2c 20 20 20 20 20  MOTE_USER",     
e750: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
e760: 6d 6f 74 65 55 73 65 72 20 7d 2c 0a 20 20 20 20  moteUser },.    
e770: 20 20 7b 20 22 53 43 52 49 50 54 5f 44 49 52 45    { "SCRIPT_DIRE
e780: 43 54 4f 52 59 22 2c 20 20 20 20 20 20 20 20 20  CTORY",         
e790: 20 20 20 26 7a 44 69 72 20 7d 2c 0a 20 20 20 20     &zDir },.    
e7a0: 20 20 7b 20 22 53 43 52 49 50 54 5f 46 49 4c 45    { "SCRIPT_FILE
e7b0: 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20  NAME",          
e7c0: 20 20 20 26 7a 46 69 6c 65 20 7d 2c 0a 20 20 20     &zFile },.   
e7d0: 20 20 20 7b 20 22 53 43 52 49 50 54 5f 4e 41 4d     { "SCRIPT_NAM
e7e0: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
e7f0: 20 20 20 20 26 7a 52 65 61 6c 53 63 72 69 70 74      &zRealScript
e800: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52   },.      { "SER
e810: 56 45 52 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20  VER_NAME",      
e820: 20 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72             &zSer
e830: 76 65 72 4e 61 6d 65 20 7d 2c 0a 20 20 20 20 20  verName },.     
e840: 20 7b 20 22 53 45 52 56 45 52 5f 50 4f 52 54 22   { "SERVER_PORT"
e850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e860: 20 20 26 7a 53 65 72 76 65 72 50 6f 72 74 20 7d    &zServerPort }
e870: 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56 45  ,.      { "SERVE
e880: 52 5f 50 52 4f 54 4f 43 4f 4c 22 2c 20 20 20 20  R_PROTOCOL",    
e890: 20 20 20 20 20 20 20 20 20 26 7a 50 72 6f 74 6f           &zProto
e8a0: 63 6f 6c 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20  col },.    };.  
e8b0: 20 20 63 68 61 72 20 2a 7a 42 61 73 65 46 69 6c    char *zBaseFil
e8c0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  ename;         /
e8d0: 2a 20 46 69 6c 65 6e 61 6d 65 20 77 69 74 68 6f  * Filename witho
e8e0: 75 74 20 64 69 72 65 63 74 6f 72 79 20 70 72 65  ut directory pre
e8f0: 66 69 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  fix */.    int s
e900: 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68  eenContentLength
e910: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 75 65 20   = 0;   /* True 
e920: 69 66 20 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  if Content-lengt
e930: 68 3a 20 68 65 61 64 65 72 20 73 65 65 6e 20 2a  h: header seen *
e940: 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 73 20 3d  /.    int nRes =
e950: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e960: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
e970: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 20 20 69 6e  ayload */.    in
e980: 74 20 6e 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 20  t nMalloc = 0;  
e990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e9a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
e9b0: 6f 63 61 74 65 64 20 74 6f 20 61 52 65 73 20 2a  ocated to aRes *
e9c0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 61 52 65 73  /.    char *aRes
e9d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
e9e0: 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 2a 2f     /* Payload */
e9f0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 73 20  ..    /* If its 
ea00: 65 78 65 63 75 74 61 62 6c 65 2c 20 69 74 20 6d  executable, it m
ea10: 75 73 74 20 62 65 20 61 20 43 47 49 20 70 72 6f  ust be a CGI pro
ea20: 67 72 61 6d 2e 20 20 53 74 61 72 74 20 62 79 0a  gram.  Start by.
ea30: 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20      ** changing 
ea40: 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20 74  directories to t
ea50: 68 65 20 64 69 72 65 63 74 6f 72 79 20 68 6f 6c  he directory hol
ea60: 64 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  ding the program
ea70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ea80: 20 63 68 64 69 72 28 7a 44 69 72 29 20 29 7b 0a   chdir(zDir) ){.
ea90: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
eaa0: 31 30 30 30 5d 3b 0a 20 20 20 20 20 20 4d 61 6c  1000];.      Mal
eab0: 66 75 6e 63 74 69 6f 6e 28 34 32 30 2c 20 2f 2a  function(420, /*
eac0: 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61   LOG: chdir() fa
ead0: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
eae0: 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72     "cannot chdir
eaf0: 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25   to [%s] from [%
eb00: 73 5d 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  s]", .          
eb10: 20 7a 44 69 72 2c 20 67 65 74 63 77 64 28 7a 42   zDir, getcwd(zB
eb20: 75 66 2c 39 39 39 29 29 3b 0a 20 20 20 20 7d 0a  uf,999));.    }.
eb30: 0a 20 20 20 20 2f 2a 20 53 65 74 75 70 20 74 68  .    /* Setup th
eb40: 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 61 70  e environment ap
eb50: 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a 20 20 20  propriately..   
eb60: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
eb70: 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   i<(int)(sizeof(
eb80: 63 67 69 65 6e 76 29 2f 73 69 7a 65 6f 66 28 63  cgienv)/sizeof(c
eb90: 67 69 65 6e 76 5b 30 5d 29 29 3b 20 69 2b 2b 29  gienv[0])); i++)
eba0: 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 63 67 69  {.      if( *cgi
ebb0: 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61 6c 75  env[i].pzEnvValu
ebc0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 74  e ){.        Set
ebd0: 45 6e 76 28 63 67 69 65 6e 76 5b 69 5d 2e 7a 45  Env(cgienv[i].zE
ebe0: 6e 76 4e 61 6d 65 2c 2a 63 67 69 65 6e 76 5b 69  nvName,*cgienv[i
ebf0: 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 29 3b 0a 20  ].pzEnvValue);. 
ec00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ec10: 20 69 66 28 20 75 73 65 48 74 74 70 73 20 29 7b   if( useHttps ){
ec20: 0a 20 20 20 20 20 20 70 75 74 65 6e 76 28 22 48  .      putenv("H
ec30: 54 54 50 53 3d 6f 6e 22 29 3b 0a 20 20 20 20 7d  TTPS=on");.    }
ec40: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
ec50: 41 62 6f 72 74 20 77 69 74 68 20 61 6e 20 65 72  Abort with an er
ec60: 72 6f 72 20 69 66 20 74 68 65 20 43 47 49 20 73  ror if the CGI s
ec70: 63 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c  cript is writabl
ec80: 65 20 62 79 20 61 6e 79 6f 6e 65 20 6f 74 68 65  e by anyone othe
ec90: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 69 74  r.    ** than it
eca0: 73 20 6f 77 6e 65 72 2e 0a 20 20 20 20 2a 2f 0a  s owner..    */.
ecb0: 20 20 20 20 69 66 28 20 73 74 61 74 62 75 66 2e      if( statbuf.
ecc0: 73 74 5f 6d 6f 64 65 20 26 20 30 30 32 32 20 29  st_mode & 0022 )
ecd0: 7b 0a 20 20 20 20 20 20 43 67 69 53 63 72 69 70  {.      CgiScrip
ece0: 74 57 72 69 74 61 62 6c 65 28 29 3b 0a 20 20 20  tWritable();.   
ecf0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 74   }..    /* For t
ed00: 68 65 20 50 4f 53 54 20 6d 65 74 68 6f 64 20 61  he POST method a
ed10: 6c 6c 20 69 6e 70 75 74 20 68 61 73 20 62 65 65  ll input has bee
ed20: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 74  n written to a t
ed30: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
ed40: 20 20 20 2a 2a 20 73 6f 20 77 65 20 68 61 76 65     ** so we have
ed50: 20 74 6f 20 72 65 64 69 72 65 63 74 20 69 6e 70   to redirect inp
ed60: 75 74 20 74 6f 20 74 68 65 20 43 47 49 20 73 63  ut to the CGI sc
ed70: 72 69 70 74 20 66 72 6f 6d 20 74 68 61 74 20 66  ript from that f
ed80: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
ed90: 69 66 28 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d  if( zMethod[0]==
eda0: 27 50 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  'P' ){.      if(
edb0: 20 64 75 70 28 30 29 3c 30 20 29 7b 0a 20 20 20   dup(0)<0 ){.   
edc0: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
edd0: 28 34 33 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 64  (430,  /* LOG: d
ede0: 75 70 28 30 29 20 66 61 69 6c 65 64 20 2a 2f 0a  up(0) failed */.
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64      "Unable to d
ee10: 75 70 6c 69 63 61 74 69 6f 6e 20 66 69 6c 65 20  uplication file 
ee20: 64 65 73 63 72 69 70 74 6f 72 20 30 22 29 3b 0a  descriptor 0");.
ee30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
ee40: 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20 6f 70  ose(0);.      op
ee50: 65 6e 28 7a 54 6d 70 4e 61 6d 2c 20 4f 5f 52 44  en(zTmpNam, O_RD
ee60: 4f 4e 4c 59 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ONLY);.    }..  
ee70: 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
ee80: 46 69 6c 65 29 2d 31 3b 20 69 3e 3d 30 20 26 26  File)-1; i>=0 &&
ee90: 20 7a 46 69 6c 65 5b 69 5d 21 3d 27 2f 27 3b 20   zFile[i]!='/'; 
eea0: 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 42 61 73 65  i--){}.    zBase
eeb0: 46 69 6c 65 6e 61 6d 65 20 3d 20 26 7a 46 69 6c  Filename = &zFil
eec0: 65 5b 69 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20  e[i+1];.    if( 
eed0: 69 3e 3d 30 20 26 26 20 73 74 72 6e 63 6d 70 28  i>=0 && strncmp(
eee0: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 22 6e  zBaseFilename,"n
eef0: 70 68 2d 22 2c 34 29 3d 3d 30 20 29 7b 0a 20 20  ph-",4)==0 ){.  
ef00: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 61      /* If the na
ef10: 6d 65 20 6f 66 20 74 68 65 20 43 47 49 20 73 63  me of the CGI sc
ef20: 72 69 70 74 20 62 65 67 69 6e 73 20 77 69 74 68  ript begins with
ef30: 20 22 6e 70 68 2d 22 20 74 68 65 6e 20 77 65 20   "nph-" then we 
ef40: 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 61  are.      ** dea
ef50: 6c 69 6e 67 20 77 69 74 68 20 61 20 22 6e 6f 6e  ling with a "non
ef60: 2d 70 61 72 73 65 64 20 68 65 61 64 65 72 73 22  -parsed headers"
ef70: 20 43 47 49 20 73 63 72 69 70 74 2e 20 20 4a 75   CGI script.  Ju
ef80: 73 74 20 65 78 65 63 28 29 0a 20 20 20 20 20 20  st exec().      
ef90: 2a 2a 20 69 74 20 64 69 72 65 63 74 6c 79 20 61  ** it directly a
efa0: 6e 64 20 6c 65 74 20 69 74 20 68 61 6e 64 6c 65  nd let it handle
efb0: 20 61 6c 6c 20 69 74 73 20 6f 77 6e 20 68 65 61   all its own hea
efc0: 64 65 72 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a  der generation..
efd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 65        */.      e
efe0: 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e 61  xecl(zBaseFilena
eff0: 6d 65 2c 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  me,zBaseFilename
f000: 2c 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20  ,(char*)0);.    
f010: 20 20 2f 2a 20 4e 4f 54 45 3a 20 4e 6f 20 6c 6f    /* NOTE: No lo
f020: 67 20 65 6e 74 72 79 20 77 72 69 74 74 65 6e 20  g entry written 
f030: 66 6f 72 20 6e 70 68 2d 20 73 63 72 69 70 74 73  for nph- scripts
f040: 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30   */.      exit(0
f050: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f060: 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 68 65   Fall thru to he
f070: 72 65 20 6f 6e 6c 79 20 69 66 20 74 68 69 73 20  re only if this 
f080: 70 72 6f 63 65 73 73 20 28 74 68 65 20 73 65 72  process (the ser
f090: 76 65 72 29 20 69 73 20 67 6f 69 6e 67 0a 20 20  ver) is going.  
f0a0: 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 61 6e 64    ** to read and
f0b0: 20 61 75 67 6d 65 6e 74 20 74 68 65 20 68 65 61   augment the hea
f0c0: 64 65 72 20 73 65 6e 74 20 62 61 63 6b 20 62 79  der sent back by
f0d0: 20 74 68 65 20 43 47 49 20 70 72 6f 63 65 73 73   the CGI process
f0e0: 2e 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20  ..    ** Open a 
f0f0: 70 69 70 65 20 74 6f 20 72 65 63 65 69 76 65 20  pipe to receive 
f100: 74 68 65 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  the output from 
f110: 74 68 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e  the CGI process.
f120: 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20 66 6f    Then.    ** fo
f130: 72 6b 20 74 68 65 20 43 47 49 20 70 72 6f 63 65  rk the CGI proce
f140: 73 73 2e 20 20 4f 6e 63 65 20 65 76 65 72 79 74  ss.  Once everyt
f150: 68 69 6e 67 20 69 73 20 64 6f 6e 65 2c 20 77 65  hing is done, we
f160: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
f170: 2a 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 74  * able to read t
f180: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 43 47 49  he output of CGI
f190: 20 6f 6e 20 74 68 65 20 22 69 6e 22 20 73 74 72   on the "in" str
f1a0: 65 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eam..    */.    
f1b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 78 5b 32  {.      int px[2
f1c0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 69 70  ];.      if( pip
f1d0: 65 28 70 78 29 20 29 7b 0a 20 20 20 20 20 20 20  e(px) ){.       
f1e0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 34 34 30   Malfunction(440
f1f0: 2c 20 2f 2a 20 4c 4f 47 3a 20 70 69 70 65 28 29  , /* LOG: pipe()
f200: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f220: 55 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  Unable to create
f230: 20 61 20 70 69 70 65 20 66 6f 72 20 74 68 65 20   a pipe for the 
f240: 43 47 49 20 70 72 6f 67 72 61 6d 22 29 3b 0a 20  CGI program");. 
f250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f260: 20 66 6f 72 6b 28 29 3d 3d 30 20 29 7b 0a 20 20   fork()==0 ){.  
f270: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 30        close(px[0
f280: 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73  ]);.        clos
f290: 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  e(1);.        if
f2a0: 28 20 64 75 70 28 70 78 5b 31 5d 29 21 3d 31 20  ( dup(px[1])!=1 
f2b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 61 6c  ){.          Mal
f2c0: 66 75 6e 63 74 69 6f 6e 28 34 35 30 2c 20 2f 2a  function(450, /*
f2d0: 20 4c 4f 47 3a 20 64 75 70 28 31 29 20 66 61 69   LOG: dup(1) fai
f2e0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
f2f0: 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20          "Unable 
f300: 74 6f 20 64 75 70 6c 69 63 61 74 65 20 66 69 6c  to duplicate fil
f310: 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 20  e descriptor %d 
f320: 74 6f 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20  to 1",.         
f330: 20 20 20 20 20 20 20 20 70 78 5b 31 5d 29 3b 0a          px[1]);.
f340: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f350: 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b 0a    close(px[1]);.
f360: 20 20 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42          execl(zB
f370: 61 73 65 46 69 6c 65 6e 61 6d 65 2c 20 7a 42 61  aseFilename, zBa
f380: 73 65 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61  seFilename, (cha
f390: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20 65  r*)0);.        e
f3a0: 78 69 74 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(0);.      }.
f3b0: 20 20 20 20 20 20 63 6c 6f 73 65 28 70 78 5b 31        close(px[1
f3c0: 5d 29 3b 0a 20 20 20 20 20 20 69 6e 20 3d 20 66  ]);.      in = f
f3d0: 64 6f 70 65 6e 28 70 78 5b 30 5d 2c 20 22 72 22  dopen(px[0], "r"
f3e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f3f0: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
f400: 43 67 69 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  CgiError();.    
f410: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 61  }..    /* Read a
f420: 6e 64 20 70 72 6f 63 65 73 73 20 74 68 65 20 66  nd process the f
f430: 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65  irst line of the
f440: 20 68 65 61 64 65 72 20 72 65 74 75 72 6e 65 64   header returned
f450: 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 43   by the.    ** C
f460: 47 49 20 73 63 72 69 70 74 2e 0a 20 20 20 20 2a  GI script..    *
f470: 2f 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d  /.    if( useTim
f480: 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35 29  eout ) alarm(15)
f490: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 67 65  ;.    while( fge
f4a0: 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28  ts(zLine,sizeof(
f4b0: 7a 4c 69 6e 65 29 2c 69 6e 29 20 26 26 20 21 69  zLine),in) && !i
f4c0: 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 30 5d 29  sspace(zLine[0])
f4d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
f4e0: 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c  rncasecmp(zLine,
f4f0: 22 4c 6f 63 61 74 69 6f 6e 3a 22 2c 39 29 3d 3d  "Location:",9)==
f500: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 74 61  0 ){.        Sta
f510: 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30 32 20  rtResponse("302 
f520: 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20 20 20  Redirect");.    
f530: 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e      RemoveNewlin
f540: 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20  e(zLine);.      
f550: 20 20 7a 20 3d 20 26 7a 4c 69 6e 65 5b 31 30 5d    z = &zLine[10]
f560: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
f570: 20 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b 20   isspace(*z) ){ 
f580: 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 6e  z++; }.        n
f590: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c  Out += printf("L
f5a0: 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 22  ocation: %s\r\n"
f5b0: 2c 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ,z);.      }else
f5c0: 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70   if( strncasecmp
f5d0: 28 7a 4c 69 6e 65 2c 22 53 74 61 74 75 73 3a 22  (zLine,"Status:"
f5e0: 2c 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,7)==0 ){.      
f5f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
f600: 20 66 6f 72 28 69 3d 37 3b 20 69 73 73 70 61 63   for(i=7; isspac
f610: 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b  e(zLine[i]); i++
f620: 29 7b 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  ){}.        nOut
f630: 20 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 20 25   += printf("%s %
f640: 73 22 2c 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 26  s", zProtocol, &
f650: 7a 4c 69 6e 65 5b 69 5d 29 3b 0a 20 20 20 20 20  zLine[i]);.     
f660: 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65 70 6c     strncpy(zRepl
f670: 79 53 74 61 74 75 73 2c 20 26 7a 4c 69 6e 65 5b  yStatus, &zLine[
f680: 69 5d 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  i], 3);.        
f690: 7a 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20  zReplyStatus[3] 
f6a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74 61  = 0;.        sta
f6b0: 74 75 73 53 65 6e 74 20 3d 20 31 3b 0a 20 20 20  tusSent = 1;.   
f6c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6d0: 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d    if( strncasecm
f6e0: 70 28 7a 4c 69 6e 65 2c 20 22 43 6f 6e 74 65 6e  p(zLine, "Conten
f6f0: 74 2d 6c 65 6e 67 74 68 3a 22 2c 20 31 34 29 3d  t-length:", 14)=
f700: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f710: 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  seenContentLengt
f720: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  h = 1;.        }
f730: 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52 65  .        StartRe
f740: 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29  sponse("200 OK")
f750: 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b  ;.        nOut +
f760: 3d 20 70 72 69 6e 74 66 28 22 25 73 22 2c 7a 4c  = printf("%s",zL
f770: 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ine);.      }.  
f780: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
f790: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
f7a0: 20 74 68 72 75 20 77 69 74 68 6f 75 74 20 63 68   thru without ch
f7b0: 61 6e 67 65 20 6f 72 20 61 6e 61 6c 79 73 69 73  ange or analysis
f7c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 53 74 61  ..    */.    Sta
f7d0: 72 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20  rtResponse("200 
f7e0: 4f 4b 22 29 3b 0a 20 20 20 20 69 66 28 20 75 73  OK");.    if( us
f7f0: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
f800: 28 36 30 2a 35 29 3b 0a 20 20 20 20 69 66 28 20  (60*5);.    if( 
f810: 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  seenContentLengt
f820: 68 20 29 7b 0a 20 20 20 20 20 20 6e 4f 75 74 20  h ){.      nOut 
f830: 2b 3d 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20  += printf("%s", 
f840: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 77 68  zLine);.      wh
f850: 69 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69  ile( (c = getc(i
f860: 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20  n))!=EOF ){.    
f870: 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f 75      putc(c,stdou
f880: 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  t);.        nOut
f890: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
f8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65  }else{.      nRe
f8b0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4d 61  s = 0;.      nMa
f8c0: 6c 6c 6f 63 20 3d 20 31 30 30 30 3b 0a 20 20 20  lloc = 1000;.   
f8d0: 20 20 20 61 52 65 73 20 3d 20 6d 61 6c 6c 6f 63     aRes = malloc
f8e0: 28 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20  (nMalloc+1);.   
f8f0: 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20 29     if( aRes==0 )
f900: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 36 30 30   Malfunction(600
f910: 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 3a  ,"Out of memory:
f920: 20 25 64 20 62 79 74 65 73 22 2c 20 6e 4d 61 6c   %d bytes", nMal
f930: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  loc);.      whil
f940: 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29  e( (c = getc(in)
f950: 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  )!=EOF ){.      
f960: 20 20 69 66 28 20 6e 52 65 73 3e 3d 6e 4d 61 6c    if( nRes>=nMal
f970: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  loc ){.         
f980: 20 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 4d 61 6c 6c   nMalloc = nMall
f990: 6f 63 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  oc*2;.          
f9a0: 61 52 65 73 20 3d 20 72 65 61 6c 6c 6f 63 28 61  aRes = realloc(a
f9b0: 52 65 73 2c 20 6e 4d 61 6c 6c 6f 63 2b 31 29 3b  Res, nMalloc+1);
f9c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
f9d0: 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Res==0 ){.      
f9e0: 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69         Malfuncti
f9f0: 6f 6e 28 36 31 30 2c 20 22 4f 75 74 20 6f 66 20  on(610, "Out of 
fa00: 6d 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65 73  memory: %d bytes
fa10: 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  ", nMalloc);.   
fa20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fa30: 20 7d 0a 20 20 20 20 20 20 20 20 61 52 65 73 5b   }.        aRes[
fa40: 6e 52 65 73 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  nRes++] = c;.   
fa50: 20 20 20 7d 0a 20 20 20 20 20 20 61 52 65 73 5b     }.      aRes[
fa60: 6e 52 65 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20  nRes] = 0;.     
fa70: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
fa80: 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a  "Content-length:
fa90: 20 25 64 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c 20   %d\r\n\r\n%s", 
faa0: 6e 52 65 73 2c 20 61 52 65 73 29 3b 0a 20 20 20  nRes, aRes);.   
fab0: 20 20 20 66 72 65 65 28 61 52 65 73 29 3b 0a 20     free(aRes);. 
fac0: 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28     }.    fclose(
fad0: 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  in);.  }else if(
fae0: 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a 52   countSlashes(zR
faf0: 65 61 6c 53 63 72 69 70 74 29 21 3d 63 6f 75 6e  ealScript)!=coun
fb00: 74 53 6c 61 73 68 65 73 28 7a 53 63 72 69 70 74  tSlashes(zScript
fb10: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ) ){.    /* If t
fb20: 68 65 20 72 65 71 75 65 73 74 20 55 52 49 20 66  he request URI f
fb30: 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e  or static conten
fb40: 74 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65 72  t contains mater
fb50: 69 61 6c 20 70 61 73 74 20 74 68 65 0a 20 20 20  ial past the.   
fb60: 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65   ** actual conte
fb70: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72 65  nt file name, re
fb80: 70 6f 72 74 20 74 68 61 74 20 61 73 20 61 20 34  port that as a 4
fb90: 30 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  04 error. */.   
fba0: 20 4e 6f 74 46 6f 75 6e 64 28 34 36 30 29 3b 20   NotFound(460); 
fbb0: 2f 2a 20 4c 4f 47 3a 20 45 78 63 65 73 73 20 55  /* LOG: Excess U
fbc0: 52 49 20 63 6f 6e 74 65 6e 74 20 70 61 73 74 20  RI content past 
fbd0: 73 74 61 74 69 63 20 66 69 6c 65 20 6e 61 6d 65  static file name
fbe0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
fbf0: 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74 20   /* If it isn't 
fc00: 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e 20  executable then 
fc10: 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 61  it.    ** must a
fc20: 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68 61   simple file tha
fc30: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f  t needs to be co
fc40: 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e 0a  pied to output..
fc50: 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74      */.    const
fc60: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 54   char *zContentT
fc70: 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79 70  ype = GetMimeTyp
fc80: 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c 65  e(zFile, lenFile
fc90: 29 3b 0a 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  );.    time_t t;
fca0: 0a 20 20 20 20 63 68 61 72 20 7a 45 54 61 67 5b  .    char zETag[
fcb0: 31 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20 7a  100];..    if( z
fcc0: 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b 28  TmpNam ) unlink(
fcd0: 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 73 70  zTmpNam);.    sp
fce0: 72 69 6e 74 66 28 7a 45 54 61 67 2c 20 22 6d 25  rintf(zETag, "m%
fcf0: 78 73 25 78 22 2c 20 28 69 6e 74 29 73 74 61 74  xs%x", (int)stat
fd00: 62 75 66 2e 73 74 5f 6d 74 69 6d 65 2c 20 28 69  buf.st_mtime, (i
fd10: 6e 74 29 73 74 61 74 62 75 66 2e 73 74 5f 73 69  nt)statbuf.st_si
fd20: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 43 6f 6d  ze);.    if( Com
fd30: 70 61 72 65 45 74 61 67 73 28 7a 49 66 4e 6f 6e  pareEtags(zIfNon
fd40: 65 4d 61 74 63 68 2c 7a 45 54 61 67 29 3d 3d 30  eMatch,zETag)==0
fd50: 0a 20 20 20 20 20 7c 7c 20 28 7a 49 66 4d 6f 64  .     || (zIfMod
fd60: 69 66 69 65 64 53 69 6e 63 65 21 3d 30 0a 20 20  ifiedSince!=0.  
fd70: 20 20 20 20 20 20 20 20 26 26 20 28 74 20 3d 20          && (t = 
fd80: 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65 28  ParseRfc822Date(
fd90: 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65  zIfModifiedSince
fda0: 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20 26  ))>0.          &
fdb0: 26 20 74 3e 3d 73 74 61 74 62 75 66 2e 73 74 5f  & t>=statbuf.st_
fdc0: 6d 74 69 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20  mtime).    ){.  
fdd0: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
fde0: 65 28 22 33 30 34 20 4e 6f 74 20 4d 6f 64 69 66  e("304 Not Modif
fdf0: 69 65 64 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75  ied");.      nOu
fe00: 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 4c 61  t += DateTag("La
fe10: 73 74 2d 4d 6f 64 69 66 69 65 64 22 2c 20 73 74  st-Modified", st
fe20: 61 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65 29 3b  atbuf.st_mtime);
fe30: 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  .      nOut += p
fe40: 72 69 6e 74 66 28 22 43 61 63 68 65 2d 43 6f 6e  rintf("Cache-Con
fe50: 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 25 64  trol: max-age=%d
fe60: 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29 3b 0a 20  \r\n", mxAge);. 
fe70: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
fe80: 6e 74 66 28 22 45 54 61 67 3a 20 5c 22 25 73 5c  ntf("ETag: \"%s\
fe90: 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b 0a  "\r\n", zETag);.
fea0: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
feb0: 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20 20  intf("\r\n");.  
fec0: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
fed0: 74 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f  t);.      MakeLo
fee0: 67 45 6e 74 72 79 28 30 2c 20 34 37 30 29 3b 20  gEntry(0, 470); 
fef0: 20 2f 2a 20 4c 4f 47 3a 20 45 54 61 67 20 43 61   /* LOG: ETag Ca
ff00: 63 68 65 20 48 69 74 20 2a 2f 0a 20 20 20 20 20  che Hit */.     
ff10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
ff20: 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46     in = fopen(zF
ff30: 69 6c 65 2c 22 72 22 29 3b 0a 20 20 20 20 69 66  ile,"r");.    if
ff40: 28 20 69 6e 3d 3d 30 20 29 20 4e 6f 74 46 6f 75  ( in==0 ) NotFou
ff50: 6e 64 28 34 38 30 29 3b 20 2f 2a 20 4c 4f 47 3a  nd(480); /* LOG:
ff60: 20 66 6f 70 65 6e 28 29 20 66 61 69 6c 65 64 20   fopen() failed 
ff70: 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65  for static conte
ff80: 6e 74 20 2a 2f 0a 20 20 20 20 53 74 61 72 74 52  nt */.    StartR
ff90: 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22  esponse("200 OK"
ffa0: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44  );.    nOut += D
ffb0: 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64  ateTag("Last-Mod
ffc0: 69 66 69 65 64 22 2c 20 73 74 61 74 62 75 66 2e  ified", statbuf.
ffd0: 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 6e  st_mtime);.    n
ffe0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
fff0: 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61  ache-Control: ma
10000 78 2d 61 67 65 3d 25 64 5c 72 5c 6e 22 2c 20 6d  x-age=%d\r\n", m
10010 78 41 67 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20  xAge);.    nOut 
10020 2b 3d 20 70 72 69 6e 74 66 28 22 45 54 61 67 3a  += printf("ETag:
10030 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 20 7a 45   \"%s\"\r\n", zE
10040 54 61 67 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  Tag);.    nOut +
10050 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e  = printf("Conten
10060 74 2d 74 79 70 65 3a 20 25 73 5c 72 5c 6e 22 2c  t-type: %s\r\n",
10070 7a 43 6f 6e 74 65 6e 74 54 79 70 65 29 3b 0a 20  zContentType);. 
10080 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
10090 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  f("Content-lengt
100a0 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 22 2c 28  h: %d\r\n\r\n",(
100b0 69 6e 74 29 73 74 61 74 62 75 66 2e 73 74 5f 73  int)statbuf.st_s
100c0 69 7a 65 29 3b 0a 20 20 20 20 66 66 6c 75 73 68  ize);.    fflush
100d0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 69 66  (stdout);.    if
100e0 28 20 73 74 72 63 6d 70 28 7a 4d 65 74 68 6f 64  ( strcmp(zMethod
100f0 2c 22 48 45 41 44 22 29 3d 3d 30 20 29 7b 0a 20  ,"HEAD")==0 ){. 
10100 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72       MakeLogEntr
10110 79 28 30 2c 20 32 29 3b 20 2f 2a 20 4c 4f 47 3a  y(0, 2); /* LOG:
10120 20 4e 6f 72 6d 61 6c 20 48 45 41 44 20 72 65 70   Normal HEAD rep
10130 6c 79 20 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f  ly */.      fclo
10140 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 66 66  se(in);.      ff
10150 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
10160 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
10170 7d 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d  }.    if( useTim
10180 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30 20  eout ) alarm(30 
10190 2b 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  + statbuf.st_siz
101a0 65 2f 31 30 30 30 29 3b 0a 23 69 66 64 65 66 20  e/1000);.#ifdef 
101b0 6c 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20 20 20  linux.    {.    
101c0 20 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 20 3d    off_t offset =
101d0 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b   0;.      nOut +
101e0 3d 20 73 65 6e 64 66 69 6c 65 28 66 69 6c 65 6e  = sendfile(filen
101f0 6f 28 73 74 64 6f 75 74 29 2c 20 66 69 6c 65 6e  o(stdout), filen
10200 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65 74 2c 20  o(in), &offset, 
10210 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29  statbuf.st_size)
10220 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
10230 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 67 65    while( (c = ge
10240 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a  tc(in))!=EOF ){.
10250 20 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64        putc(c,std
10260 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74  out);.      nOut
10270 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ++;.    }.#endif
10280 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
10290 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28 73 74  .  }.  fflush(st
102a0 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67  dout);.  MakeLog
102b0 45 6e 74 72 79 28 30 2c 20 30 29 3b 20 20 2f 2a  Entry(0, 0);  /*
102c0 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 72 65 70   LOG: Normal rep
102d0 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  ly */..  /* The 
102e0 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d 75 73  next request mus
102f0 74 20 61 72 72 69 76 65 20 77 69 74 68 69 6e 20  t arrive within 
10300 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20 77 65  30 seconds or we
10310 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e 6e 65   close the conne
10320 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f 6d 69  ction.  */.  omi
10330 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66 28 20  tLog = 1;.  if( 
10340 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61  useTimeout ) ala
10350 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65 66 69  rm(30);.}..#defi
10360 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20  ne MAX_PARALLEL 
10370 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  50  /* Number of
10380 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 63 68   simultaneous ch
10390 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ildren */../*.**
103a0 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20 66 6f   All possible fo
103b0 72 6d 73 20 6f 66 20 61 6e 20 49 50 20 61 64 64  rms of an IP add
103c0 72 65 73 73 2e 20 20 4e 65 65 64 65 64 20 74 6f  ress.  Needed to
103d0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 47 43 43   work around GCC
103e0 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c 69 61 73   strict.** alias
103f0 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 74 79  ing rules..*/.ty
10400 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a 20 20  pedef union {.  
10410 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 20  struct sockaddr 
10420 73 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sa;             
10430 20 2f 2a 20 41 62 73 74 72 61 63 74 20 73 75 70   /* Abstract sup
10440 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20 73 74 72  erclass */.  str
10450 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20  uct sockaddr_in 
10460 73 61 34 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  sa4;          /*
10470 20 49 50 76 34 20 2a 2f 0a 20 20 73 74 72 75 63   IPv4 */.  struc
10480 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36 20 73  t sockaddr_in6 s
10490 61 36 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  a6;         /* I
104a0 50 76 36 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  Pv6 */.  struct 
104b0 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72 61 67 65  sockaddr_storage
104c0 20 73 61 73 3b 20 20 20 20 20 2f 2a 20 53 68 6f   sas;     /* Sho
104d0 75 6c 64 20 62 65 20 74 68 65 20 6d 61 78 69 6d  uld be the maxim
104e0 75 6d 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  um of the above 
104f0 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73 73 3b 0a  3 */.} address;.
10500 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
10510 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72 20   an HTTP server 
10520 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e 69 6e 67  daemon listening
10530 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72 74 2e 0a   on port iPort..
10540 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20 63 6f 6e  **.** As new con
10550 6e 65 63 74 69 6f 6e 73 20 61 72 72 69 76 65 2c  nections arrive,
10560 20 66 6f 72 6b 20 61 20 63 68 69 6c 64 20 61 6e   fork a child an
10570 64 20 6c 65 74 20 63 68 69 6c 64 20 72 65 74 75  d let child retu
10580 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20 74 68 69  rn.** out of thi
10590 73 20 70 72 6f 63 65 64 75 72 65 20 63 61 6c 6c  s procedure call
105a0 2e 20 20 54 68 65 20 63 68 69 6c 64 20 77 69 6c  .  The child wil
105b0 6c 20 68 61 6e 64 6c 65 20 74 68 65 20 72 65 71  l handle the req
105c0 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20 70 61 72  uest..** The par
105d0 65 6e 74 20 6e 65 76 65 72 20 72 65 74 75 72 6e  ent never return
105e0 73 20 66 72 6f 6d 20 74 68 69 73 20 70 72 6f 63  s from this proc
105f0 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  edure..**.** Ret
10600 75 72 6e 20 30 20 74 6f 20 65 61 63 68 20 63 68  urn 0 to each ch
10610 69 6c 64 20 61 73 20 69 74 20 72 75 6e 73 2e 20  ild as it runs. 
10620 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 65 73   If unable to es
10630 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20 6c 69 73  tablish a.** lis
10640 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 2c 20 72  tening socket, r
10650 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
10660 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73 65 72 76  */.int http_serv
10670 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
10680 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63 61 6c 4f  Port, int localO
10690 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c 69 73 74  nly){.  int list
106a0 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20 20 20 20  ener[20];       
106b0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 72 76       /* The serv
106c0 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f 0a 20 20  er sockets */.  
106d0 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20  int connection; 
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106f0 41 20 73 6f 63 6b 65 74 20 66 6f 72 20 65 61 63  A socket for eac
10700 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6e  h individual con
10710 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 64 5f  nection */.  fd_
10720 73 65 74 20 72 65 61 64 66 64 73 3b 20 20 20 20  set readfds;    
10730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
10740 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
10750 74 6f 72 73 20 66 6f 72 20 73 65 6c 65 63 74 28  tors for select(
10760 29 20 2a 2f 0a 20 20 61 64 64 72 65 73 73 20 69  ) */.  address i
10770 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  naddr;          
10780 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65 20 61 64      /* Remote ad
10790 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f 63 6b 6c  dress */.  sockl
107a0 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b 20 20 20  en_t lenaddr;   
107b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
107c0 68 20 6f 66 20 74 68 65 20 69 6e 61 64 64 72 20  h of the inaddr 
107d0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
107e0 6e 74 20 63 68 69 6c 64 3b 20 20 20 20 20 20 20  nt child;       
107f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10800 49 44 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ID of the child 
10810 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e 74  process */.  int
10820 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20 30 3b 20   nchildren = 0; 
10830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10840 62 65 72 20 6f 66 20 63 68 69 6c 64 20 70 72 6f  ber of child pro
10850 63 65 73 73 65 73 20 2a 2f 0a 20 20 73 74 72 75  cesses */.  stru
10860 63 74 20 74 69 6d 65 76 61 6c 20 64 65 6c 61 79  ct timeval delay
10870 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ;        /* How 
10880 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20 69 6e 73  long to wait ins
10890 69 64 65 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a  ide select() */.
108a0 20 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b 20 20    int opt = 1;  
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
108c0 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20 66 6c 61  * setsockopt fla
108d0 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64  g */.  struct ad
108e0 64 72 69 6e 66 6f 20 73 48 69 6e 74 73 3b 20 20  drinfo sHints;  
108f0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 68      /* Address h
10900 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ints */.  struct
10910 20 61 64 64 72 69 6e 66 6f 20 2a 70 41 64 64 72   addrinfo *pAddr
10920 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20 20 69  s, *p; /* */.  i
10930 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10950 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
10960 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20  int i, n;.  int 
10970 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20 20 0a 20  maxFd = -1;.  . 
10980 20 6d 65 6d 73 65 74 28 26 73 48 69 6e 74 73 2c   memset(&sHints,
10990 20 30 2c 20 73 69 7a 65 6f 66 28 73 48 69 6e 74   0, sizeof(sHint
109a0 73 29 29 3b 0a 20 20 69 66 28 20 69 70 76 34 4f  s));.  if( ipv4O
109b0 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74  nly ){.    sHint
109c0 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46  s.ai_family = PF
109d0 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a 70 72 69  _INET;.    /*pri
109e0 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c 79 5c 6e  ntf("ipv4 only\n
109f0 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ");*/.  }else if
10a00 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b 0a 20 20  ( ipv6Only ){.  
10a10 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d 69    sHints.ai_fami
10a20 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36 3b 0a 20  ly = PF_INET6;. 
10a30 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76     /*printf("ipv
10a40 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20  6 only\n");*/.  
10a50 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48 69 6e 74  }else{.    sHint
10a60 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46  s.ai_family = PF
10a70 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a 20 20 73  _UNSPEC;.  }.  s
10a80 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74 79 70  Hints.ai_socktyp
10a90 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41 4d 3b  e = SOCK_STREAM;
10aa0 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 6c 61  .  sHints.ai_fla
10ab0 67 73 20 3d 20 41 49 5f 50 41 53 53 49 56 45 3b  gs = AI_PASSIVE;
10ac0 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 70 72 6f  .  sHints.ai_pro
10ad0 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20 72 63 20  tocol = 0;.  rc 
10ae0 3d 20 67 65 74 61 64 64 72 69 6e 66 6f 28 6c 6f  = getaddrinfo(lo
10af0 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63 61 6c  calOnly ? "local
10b00 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f 72 74 2c  host": 0, zPort,
10b10 20 26 73 48 69 6e 74 73 2c 20 26 70 41 64 64 72   &sHints, &pAddr
10b20 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  s);.  if( rc ){.
10b30 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
10b40 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 67  rr, "could not g
10b50 65 74 20 61 64 64 72 20 69 6e 66 6f 3a 20 25 73  et addr info: %s
10b60 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
10b70 72 63 21 3d 45 41 49 5f 53 59 53 54 45 4d 20 3f  rc!=EAI_SYSTEM ?
10b80 20 67 61 69 5f 73 74 72 65 72 72 6f 72 28 72 63   gai_strerror(rc
10b90 29 20 3a 20 73 74 72 65 72 72 6f 72 28 65 72 72  ) : strerror(err
10ba0 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  no));.    return
10bb0 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 3d   1;.  }.  for(n=
10bc0 30 2c 20 70 3d 70 41 64 64 72 73 3b 20 6e 3c 28  0, p=pAddrs; n<(
10bd0 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c 69 73 74  int)(sizeof(list
10be0 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28 6c 69 73  ener)/sizeof(lis
10bf0 74 65 6e 65 72 5b 30 5d 29 29 20 26 26 20 70 21  tener[0])) && p!
10c00 3d 30 3b 0a 20 20 20 20 20 20 20 20 70 3d 70 2d  =0;.        p=p-
10c10 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20 20 6c  >ai_next){.    l
10c20 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20 73 6f 63  istener[n] = soc
10c30 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69 6c 79  ket(p->ai_family
10c40 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79 70 65  , p->ai_socktype
10c50 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63 6f 6c  , p->ai_protocol
10c60 29 3b 0a 20 20 20 20 69 66 28 20 6c 69 73 74 65  );.    if( liste
10c70 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20 20 20  ner[n]>=0 ){.   
10c80 20 20 20 2f 2a 20 69 66 20 77 65 20 63 61 6e 27     /* if we can'
10c90 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69 63 65  t terminate nice
10ca0 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61 6c 6c  ly, at least all
10cb0 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20 74 6f  ow the socket to
10cc0 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a 20 20   be reused */.  
10cd0 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c      setsockopt(l
10ce0 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f 4c 5f  istener[n], SOL_
10cf0 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45 55 53 45  SOCKET, SO_REUSE
10d00 41 44 44 52 2c 26 6f 70 74 2c 20 73 69 7a 65 6f  ADDR,&opt, sizeo
10d10 66 28 6f 70 74 29 29 3b 0a 20 20 20 20 20 20 0a  f(opt));.      .
10d20 23 69 66 20 64 65 66 69 6e 65 64 28 49 50 56 36  #if defined(IPV6
10d30 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20 20 20 69  _V6ONLY).      i
10d40 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69 6c 79 3d  f( p->ai_family=
10d50 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a 20 20 20  =AF_INET6 ){.   
10d60 20 20 20 20 20 69 6e 74 20 76 36 6f 6e 6c 79 20       int v6only 
10d70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65 74  = 1;.        set
10d80 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72  sockopt(listener
10d90 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f 49 50 56  [n], IPPROTO_IPV
10da0 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c 59 2c 0a  6, IPV6_V6ONLY,.
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20 73 69 7a      &v6only, siz
10dd0 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b 0a 20 20  eof(v6only));.  
10de0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
10df0 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 62 69     .      if( bi
10e00 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  nd(listener[n], 
10e10 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70 2d 3e 61  p->ai_addr, p->a
10e20 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20 29 7b 0a  i_addrlen)<0 ){.
10e30 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
10e40 62 69 6e 64 20 66 61 69 6c 65 64 3a 20 25 73 5c  bind failed: %s\
10e50 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  n", strerror(err
10e60 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  no));.        cl
10e70 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29  ose(listener[n])
10e80 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
10e90 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
10ea0 20 20 69 66 28 20 6c 69 73 74 65 6e 28 6c 69 73    if( listen(lis
10eb0 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c 30 20  tener[n], 20)<0 
10ec0 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
10ed0 66 28 22 6c 69 73 74 65 6e 28 29 20 66 61 69 6c  f("listen() fail
10ee0 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65 72  ed: %s\n", strer
10ef0 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20 20  ror(errno));.   
10f00 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65       close(liste
10f10 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20  ner[n]);.       
10f20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
10f30 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20   }.      n++;.  
10f40 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
10f50 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
10f60 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f  f(stderr, "canno
10f70 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f 63 6b 65  t open any socke
10f80 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74 75  ts\n");.    retu
10f90 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  rn 1;.  }..  whi
10fa0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
10fb0 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41 58 5f 50   nchildren>MAX_P
10fc0 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20 20 20 20  ARALLEL ){.     
10fd0 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e 20 69 66   /* Slow down if
10fe0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
10ff0 20 61 72 72 69 76 69 6e 67 20 74 6f 6f 20 66 61   arriving too fa
11000 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 6c 65 65  st */.      slee
11010 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d 4d 41 58  p( nchildren-MAX
11020 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a 20 20 20  _PARALLEL );.   
11030 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f   }.    delay.tv_
11040 73 65 63 20 3d 20 36 30 3b 0a 20 20 20 20 64 65  sec = 60;.    de
11050 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d 20 30 3b  lay.tv_usec = 0;
11060 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28 26 72 65  .    FD_ZERO(&re
11070 61 64 66 64 73 29 3b 0a 20 20 20 20 66 6f 72 28  adfds);.    for(
11080 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
11090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 69        assert( li
110a0 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20 29 3b 0a  stener[i]>=0 );.
110b0 20 20 20 20 20 20 46 44 5f 53 45 54 28 20 6c 69        FD_SET( li
110c0 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65 61 64  stener[i], &read
110d0 66 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fds);.      if( 
110e0 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d 61 78 46  listener[i]>maxF
110f0 64 20 29 20 6d 61 78 46 64 20 3d 20 6c 69 73 74  d ) maxFd = list
11100 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  ener[i];.    }. 
11110 20 20 20 73 65 6c 65 63 74 28 20 6d 61 78 46 64     select( maxFd
11120 2b 31 2c 20 26 72 65 61 64 66 64 73 2c 20 30 2c  +1, &readfds, 0,
11130 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20 20 20   0, &delay);.   
11140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
11150 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 46  ++){.      if( F
11160 44 5f 49 53 53 45 54 28 6c 69 73 74 65 6e 65 72  D_ISSET(listener
11170 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29 20 29  [i], &readfds) )
11180 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 61 64 64  {.        lenadd
11190 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e 61 64 64  r = sizeof(inadd
111a0 72 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 6e  r);.        conn
111b0 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70 74 28  ection = accept(
111c0 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 69 6e  listener[i], &in
111d0 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e 61 64 64  addr.sa, &lenadd
111e0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
111f0 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20 29 7b  connection>=0 ){
11200 0a 20 20 20 20 20 20 20 20 20 20 63 68 69 6c 64  .          child
11210 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20 20 20   = fork();.     
11220 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 21 3d       if( child!=
11230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
11240 20 69 66 28 20 63 68 69 6c 64 3e 30 20 29 20 6e   if( child>0 ) n
11250 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20 20 20  children++;.    
11260 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f          close(co
11270 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
11280 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66         /* printf
11290 28 22 73 75 62 70 72 6f 63 65 73 73 20 25 64 20  ("subprocess %d 
112a0 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c 20 63  started...\n", c
112b0 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73 74  hild); fflush(st
112c0 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20 20  dout); */.      
112d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
112e0 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72 72 20         int nErr 
112f0 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20 20 20 20  = 0, fd;.       
11300 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20       close(0);. 
11310 20 20 20 20 20 20 20 20 20 20 20 66 64 20 3d 20             fd = 
11320 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b  dup(connection);
11330 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
11340 20 66 64 21 3d 30 20 29 20 6e 45 72 72 2b 2b 3b   fd!=0 ) nErr++;
11350 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
11360 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  se(1);.         
11370 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e     fd = dup(conn
11380 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ection);.       
11390 20 20 20 20 20 69 66 28 20 66 64 21 3d 31 20 29       if( fd!=1 )
113a0 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
113b0 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65       close(conne
113c0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ction);.        
113d0 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b      return nErr;
113e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
113f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11400 20 20 20 20 20 2f 2a 20 42 75 72 79 20 64 65 61       /* Bury dea
11410 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 20 20  d children */.  
11420 20 20 20 20 77 68 69 6c 65 28 20 28 63 68 69 6c      while( (chil
11430 64 20 3d 20 77 61 69 74 70 69 64 28 30 2c 20 30  d = waitpid(0, 0
11440 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30 20 29 7b  , WNOHANG))>0 ){
11450 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  .        /* prin
11460 74 66 28 22 70 72 6f 63 65 73 73 20 25 64 20 65  tf("process %d e
11470 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20  nds\n", child); 
11480 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20  fflush(stdout); 
11490 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63 68 69 6c  */.        nchil
114a0 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  dren--;.      }.
114b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e      }.  }.  /* N
114c0 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 20 20 0a  OT REACHED */  .
114d0 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 0a 69    exit(1);.}...i
114e0 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
114f0 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
11500 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
11510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11520 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
11530 20 63 68 61 72 20 2a 7a 50 65 72 6d 55 73 65 72   char *zPermUser
11540 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 52 75   = 0;      /* Ru
11550 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68 20 74 68  n daemon with th
11560 69 73 20 75 73 65 72 27 73 20 70 65 72 6d 69 73  is user's permis
11570 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  sions */.  const
11580 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d 20 30   char *zPort = 0
11590 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e  ;    /* Implemen
115a0 74 20 61 6e 20 48 54 54 50 20 73 65 72 76 65 72  t an HTTP server
115b0 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e   process */.  in
115c0 74 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20  t useChrootJail 
115d0 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  = 1;    /* True 
115e0 74 6f 20 75 73 65 20 61 20 63 68 61 6e 67 65 2d  to use a change-
115f0 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20 20 73  root jail */.  s
11600 74 72 75 63 74 20 70 61 73 73 77 64 20 2a 70 77  truct passwd *pw
11610 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e 66 6f  d = 0;   /* Info
11620 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
11630 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20  e user */..  /* 
11640 52 65 63 6f 72 64 20 74 68 65 20 74 69 6d 65 20  Record the time 
11650 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  when processing 
11660 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 67  begins..  */.  g
11670 65 74 74 69 6d 65 6f 66 64 61 79 28 26 62 65 67  ettimeofday(&beg
11680 69 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f  inTime, 0);..  /
11690 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e 64 2d  * Parse command-
116a0 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 0a 20  line arguments. 
116b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61 72 67   */.  while( arg
116c0 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d 5b 30  c>1 && argv[1][0
116d0 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 63 68  ]=='-' ){.    ch
116e0 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31 5d 3b  ar *z = argv[1];
116f0 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72 67 20  .    char *zArg 
11700 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72 67 76  = argc>=3 ? argv
11710 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20 20 69  [2] : "0";.    i
11720 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  f( z[0]=='-' && 
11730 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[1]=='-' ) z++;
11740 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
11750 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20 29 7b  z,"-user")==0 ){
11760 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73 65 72  .      zPermUser
11770 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d 65 6c   = zArg;.    }el
11780 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
11790 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b 0a 20  "-root")==0 ){. 
117a0 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a 41 72       zRoot = zAr
117b0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
117c0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f 67 66   strcmp(z,"-logf
117d0 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ile")==0 ){.    
117e0 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a 41 72    zLogFile = zAr
117f0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  g;.    }else if(
11800 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 61 78 2d   strcmp(z,"-max-
11810 61 67 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  age")==0 ){.    
11820 20 20 6d 78 41 67 65 20 3d 20 61 74 6f 69 28 7a    mxAge = atoi(z
11830 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Arg);.    }else 
11840 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 68  if( strcmp(z,"-h
11850 74 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ttps")==0 ){.   
11860 20 20 20 75 73 65 48 74 74 70 73 20 3d 20 61 74     useHttps = at
11870 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20 20 20  oi(zArg);.      
11880 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74 70 73  zHttp = useHttps
11890 20 3f 20 22 68 74 74 70 73 22 20 3a 20 22 68 74   ? "https" : "ht
118a0 74 70 22 3b 0a 20 20 20 20 20 20 69 66 28 20 75  tp";.      if( u
118b0 73 65 48 74 74 70 73 20 29 20 7a 52 65 6d 6f 74  seHttps ) zRemot
118c0 65 41 64 64 72 20 3d 20 67 65 74 65 6e 76 28 22  eAddr = getenv("
118d0 52 45 4d 4f 54 45 5f 48 4f 53 54 22 29 3b 0a 20  REMOTE_HOST");. 
118e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
118f0 63 6d 70 28 7a 2c 20 22 2d 70 6f 72 74 22 29 3d  cmp(z, "-port")=
11900 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 6f 72  =0 ){.      zPor
11910 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  t = zArg;.      
11920 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 31 3b 0a  standalone = 1;.
11930 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11940 72 63 6d 70 28 7a 2c 20 22 2d 66 61 6d 69 6c 79  rcmp(z, "-family
11950 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
11960 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 20  f( strcmp(zArg, 
11970 22 69 70 76 34 22 29 3d 3d 30 20 29 7b 0a 20 20  "ipv4")==0 ){.  
11980 20 20 20 20 20 20 69 70 76 34 4f 6e 6c 79 20 3d        ipv4Only =
11990 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
119a0 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c  if( strcmp(zArg,
119b0 20 22 69 70 76 36 22 29 3d 3d 30 20 29 7b 0a 20   "ipv6")==0 ){. 
119c0 20 20 20 20 20 20 20 69 70 76 36 4f 6e 6c 79 20         ipv6Only 
119d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
119e0 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e  {.        Malfun
119f0 63 74 69 6f 6e 28 35 30 30 2c 20 20 2f 2a 20 4c  ction(500,  /* L
11a00 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50 20 70  OG: unknown IP p
11a10 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 20  rotocol */.     
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11a30 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f  unknown IP proto
11a40 63 6f 6c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 41  col: [%s]\n", zA
11a50 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
11a60 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11a70 70 28 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d 3d 30  p(z, "-jail")==0
11a80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74   ){.      if( at
11a90 6f 69 28 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20  oi(zArg)==0 ){. 
11aa0 20 20 20 20 20 20 20 75 73 65 43 68 72 6f 6f 74         useChroot
11ab0 4a 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jail = 0;.      
11ac0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
11ad0 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64 65 62 75  strcmp(z, "-debu
11ae0 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
11af0 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29 20 29  if( atoi(zArg) )
11b00 7b 0a 20 20 20 20 20 20 20 20 75 73 65 54 69 6d  {.        useTim
11b10 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eout = 0;.      
11b20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
11b30 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64 61 74 65  strcmp(z, "-date
11b40 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
11b50 20 20 20 54 65 73 74 50 61 72 73 65 52 66 63 38     TestParseRfc8
11b60 32 32 44 61 74 65 28 29 3b 0a 20 20 20 20 20 20  22Date();.      
11b70 70 72 69 6e 74 66 28 22 4f 6b 5c 6e 22 29 3b 0a  printf("Ok\n");.
11b80 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20        exit(0);. 
11b90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ba0 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 31 30 2c  Malfunction(510,
11bb0 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77 6e   /* LOG: unknown
11bc0 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
11bd0 67 75 6d 65 6e 74 20 6f 6e 20 6c 61 75 6e 63 68  gument on launch
11be0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
11bf0 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 61        "unknown a
11c00 72 67 75 6d 65 6e 74 3a 20 5b 25 73 5d 5c 6e 22  rgument: [%s]\n"
11c10 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , z);.    }.    
11c20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 20 20 61  argv += 2;.    a
11c30 72 67 63 20 2d 3d 20 32 3b 0a 20 20 7d 0a 20 20  rgc -= 2;.  }.  
11c40 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29 7b 0a  if( zRoot==0 ){.
11c50 20 20 20 20 69 66 28 20 73 74 61 6e 64 61 6c 6f      if( standalo
11c60 6e 65 20 29 7b 0a 20 20 20 20 20 20 7a 52 6f 6f  ne ){.      zRoo
11c70 74 20 3d 20 22 2e 22 3b 0a 20 20 20 20 7d 65 6c  t = ".";.    }el
11c80 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  se{.      Malfun
11c90 63 74 69 6f 6e 28 35 32 30 2c 20 2f 2a 20 4c 4f  ction(520, /* LO
11ca0 47 3a 20 2d 2d 72 6f 6f 74 20 61 72 67 75 6d 65  G: --root argume
11cb0 6e 74 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nt missing */.  
11cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cd0 22 6e 6f 20 2d 2d 72 6f 6f 74 20 73 70 65 63 69  "no --root speci
11ce0 66 69 65 64 22 29 3b 0a 20 20 20 20 7d 0a 20 20  fied");.    }.  
11cf0 7d 0a 20 20 0a 20 20 2f 2a 20 43 68 61 6e 67 65  }.  .  /* Change
11d00 20 64 69 72 65 63 74 6f 72 69 65 73 20 74 6f 20   directories to 
11d10 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
11d20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65 6d 2e  HTTP filesystem.
11d30 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 72 65 61    Then.  ** crea
11d40 74 65 20 61 20 63 68 72 6f 6f 74 20 6a 61 69 6c  te a chroot jail
11d50 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69   there..  */.  i
11d60 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 29 21  f( chdir(zRoot)!
11d70 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e  =0 ){.    Malfun
11d80 63 74 69 6f 6e 28 35 33 30 2c 20 2f 2a 20 4c 4f  ction(530, /* LO
11d90 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c 65  G: chdir() faile
11da0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
11db0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 61       "cannot cha
11dc0 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
11dd0 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29 3b 0a   [%s]", zRoot);.
11de0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 69 6e    }..  /* Get in
11df0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
11e00 74 68 65 20 75 73 65 72 20 69 66 20 61 76 61 69  the user if avai
11e10 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 7a  lable */.  if( z
11e20 50 65 72 6d 55 73 65 72 20 29 20 70 77 64 20 3d  PermUser ) pwd =
11e30 20 67 65 74 70 77 6e 61 6d 28 7a 50 65 72 6d 55   getpwnam(zPermU
11e40 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e 74 65  ser);..  /* Ente
11e50 72 20 74 68 65 20 63 68 72 6f 6f 74 20 6a 61 69  r the chroot jai
11e60 6c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a  l if requested *
11e70 2f 20 20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55  /  .  if( zPermU
11e80 73 65 72 20 26 26 20 75 73 65 43 68 72 6f 6f 74  ser && useChroot
11e90 4a 61 69 6c 20 26 26 20 67 65 74 75 69 64 28 29  Jail && getuid()
11ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63  ==0 ){.    if( c
11eb0 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29 7b 0a  hroot(".")<0 ){.
11ec0 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f        Malfunctio
11ed0 6e 28 35 34 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63  n(540, /* LOG: c
11ee0 68 72 6f 6f 74 28 29 20 66 61 69 6c 65 64 20 2a  hroot() failed *
11ef0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
11f00 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63      "unable to c
11f10 72 65 61 74 65 20 63 68 72 6f 6f 74 20 6a 61 69  reate chroot jai
11f20 6c 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  l");.    }else{.
11f30 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22 22        zRoot = ""
11f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11f50 2a 20 41 63 74 69 76 61 74 65 20 74 68 65 20 73  * Activate the s
11f60 65 72 76 65 72 2c 20 69 66 20 72 65 71 75 65 73  erver, if reques
11f70 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 50 6f  ted */.  if( zPo
11f80 72 74 20 26 26 20 68 74 74 70 5f 73 65 72 76 65  rt && http_serve
11f90 72 28 7a 50 6f 72 74 2c 20 30 29 20 29 7b 0a 20  r(zPort, 0) ){. 
11fa0 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35     Malfunction(5
11fb0 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 72 76  50, /* LOG: serv
11fc0 65 72 20 73 74 61 72 74 75 70 20 66 61 69 6c 65  er startup faile
11fd0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
11fe0 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
11ff0 73 74 61 72 74 20 73 65 72 76 65 72 22 29 3b 0a  start server");.
12000 20 20 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 72    }..  /* Drop r
12010 6f 6f 74 20 70 72 69 76 69 6c 65 67 65 73 2e 0a  oot privileges..
12020 20 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72 6d    */.  if( zPerm
12030 55 73 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20  User ){.    if( 
12040 70 77 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pwd ){.      if(
12050 20 73 65 74 67 69 64 28 70 77 64 2d 3e 70 77 5f   setgid(pwd->pw_
12060 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gid) ){.        
12070 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 36 30 2c  Malfunction(560,
12080 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 67 69 64 28   /* LOG: setgid(
12090 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20  ) failed */.    
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 22 63 61 6e 6e 6f 74 20 73 65 74 20 67 72 6f 75  "cannot set grou
120c0 70 2d 69 64 20 74 6f 20 25 64 22 2c 20 70 77 64  p-id to %d", pwd
120d0 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20 20 20  ->pw_gid);.     
120e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 65 74   }.      if( set
120f0 75 69 64 28 70 77 64 2d 3e 70 77 5f 75 69 64 29  uid(pwd->pw_uid)
12100 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
12110 75 6e 63 74 69 6f 6e 28 35 37 30 2c 20 2f 2a 20  unction(570, /* 
12120 4c 4f 47 3a 20 73 65 74 75 69 64 28 29 20 66 61  LOG: setuid() fa
12130 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
12140 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
12150 6e 6f 74 20 73 65 74 20 75 73 65 72 2d 69 64 20  not set user-id 
12160 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70 77 5f  to %d", pwd->pw_
12170 75 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uid);.      }.  
12180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
12190 61 6c 66 75 6e 63 74 69 6f 6e 28 35 38 30 2c 20  alfunction(580, 
121a0 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20  /* LOG: unknown 
121b0 75 73 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  user */.        
121c0 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 73 75            "no su
121d0 63 68 20 75 73 65 72 20 5b 25 73 5d 22 2c 20 7a  ch user [%s]", z
121e0 50 65 72 6d 55 73 65 72 29 3b 0a 20 20 20 20 7d  PermUser);.    }
121f0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 75 69  .  }.  if( getui
12200 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 4d 61  d()==0 ){.    Ma
12210 6c 66 75 6e 63 74 69 6f 6e 28 35 39 30 2c 20 2f  lfunction(590, /
12220 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 72 75  * LOG: cannot ru
12230 6e 20 61 73 20 72 6f 6f 74 20 2a 2f 0a 20 20 20  n as root */.   
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
12250 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f 6f 74  nnot run as root
12260 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ");.  }..  /* Ge
12270 74 20 74 68 65 20 49 50 20 61 64 64 72 65 73 73  t the IP address
12280 20 66 72 6f 6d 20 77 68 65 6e 63 65 20 74 68 65   from whence the
12290 20 72 65 71 75 65 73 74 20 6f 72 69 67 69 6e 61   request origina
122a0 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  tes.  */.  if( z
122b0 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20 29 7b  RemoteAddr==0 ){
122c0 0a 20 20 20 20 61 64 64 72 65 73 73 20 72 65 6d  .    address rem
122d0 6f 74 65 41 64 64 72 3b 0a 20 20 20 20 75 6e 73  oteAddr;.    uns
122e0 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65 20 3d  igned int size =
122f0 20 73 69 7a 65 6f 66 28 72 65 6d 6f 74 65 41 64   sizeof(remoteAd
12300 64 72 29 3b 0a 20 20 20 20 63 68 61 72 20 7a 48  dr);.    char zH
12310 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f 53 54 5d 3b  ost[NI_MAXHOST];
12320 0a 20 20 20 20 69 66 28 20 67 65 74 70 65 65 72  .    if( getpeer
12330 6e 61 6d 65 28 30 2c 20 26 72 65 6d 6f 74 65 41  name(0, &remoteA
12340 64 64 72 2e 73 61 2c 20 26 73 69 7a 65 29 3e 3d  ddr.sa, &size)>=
12350 30 20 29 7b 0a 20 20 20 20 20 20 67 65 74 6e 61  0 ){.      getna
12360 6d 65 69 6e 66 6f 28 26 72 65 6d 6f 74 65 41 64  meinfo(&remoteAd
12370 64 72 2e 73 61 2c 20 73 69 7a 65 2c 20 7a 48 6f  dr.sa, size, zHo
12380 73 74 2c 20 73 69 7a 65 6f 66 28 7a 48 6f 73 74  st, sizeof(zHost
12390 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  ), 0, 0,.       
123a0 20 20 20 20 20 20 20 20 20 20 20 4e 49 5f 4e 55             NI_NU
123b0 4d 45 52 49 43 48 4f 53 54 29 3b 0a 20 20 20 20  MERICHOST);.    
123c0 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20    zRemoteAddr = 
123d0 53 74 72 44 75 70 28 7a 48 6f 73 74 29 3b 0a 20  StrDup(zHost);. 
123e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
123f0 52 65 6d 6f 74 65 41 64 64 72 21 3d 30 0a 20 20  RemoteAddr!=0.  
12400 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 52 65 6d   && strncmp(zRem
12410 6f 74 65 41 64 64 72 2c 20 22 3a 3a 66 66 66 66  oteAddr, "::ffff
12420 3a 22 2c 20 37 29 3d 3d 30 0a 20 20 20 26 26 20  :", 7)==0.   && 
12430 73 74 72 63 68 72 28 7a 52 65 6d 6f 74 65 41 64  strchr(zRemoteAd
12440 64 72 2b 37 2c 20 27 3a 27 29 3d 3d 30 0a 20 20  dr+7, ':')==0.  
12450 20 26 26 20 73 74 72 63 68 72 28 7a 52 65 6d 6f   && strchr(zRemo
12460 74 65 41 64 64 72 2b 37 2c 20 27 2e 27 29 21 3d  teAddr+7, '.')!=
12470 30 0a 20 20 29 7b 0a 20 20 20 20 7a 52 65 6d 6f  0.  ){.    zRemo
12480 74 65 41 64 64 72 20 2b 3d 20 37 3b 0a 20 20 7d  teAddr += 7;.  }
12490 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
124a0 68 65 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20  he input stream 
124b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
124c0 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  100; i++){.    P
124d0 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
124e0 28 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f 63 65  (0);.  }.  Proce
124f0 73 73 4f 6e 65 52 65 71 75 65 73 74 28 31 29 3b  ssOneRequest(1);
12500 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 23  .  exit(0);.}..#
12510 69 66 20 30 0a 2f 2a 20 43 6f 70 79 2f 70 61 73  if 0./* Copy/pas
12520 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  te the following
12530 20 74 65 78 74 20 69 6e 74 6f 20 53 51 4c 69 74   text into SQLit
12540 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  e to generate th
12550 65 20 78 72 65 66 0a 2a 2a 20 74 61 62 6c 65 20  e xref.** table 
12560 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
12570 6c 6c 20 65 72 72 6f 72 20 63 6f 64 65 73 2e 0a  ll error codes..
12580 2a 2f 0a 42 45 47 49 4e 3b 0a 43 52 45 41 54 45  */.BEGIN;.CREATE
12590 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
125a0 49 53 54 53 20 78 72 65 66 28 6c 69 6e 65 6e 6f  ISTS xref(lineno
125b0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
125c0 20 4b 45 59 2c 20 64 65 73 63 20 54 45 58 54 29   KEY, desc TEXT)
125d0 3b 0a 44 45 4c 45 54 45 20 46 52 4f 4d 20 58 72  ;.DELETE FROM Xr
125e0 65 66 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ef;.INSERT INTO 
125f0 78 72 65 66 20 56 41 4c 55 45 53 28 31 30 30 2c  xref VALUES(100,
12600 27 4d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64  'Malloc() failed
12610 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12620 78 72 65 66 20 56 41 4c 55 45 53 28 31 31 30 2c  xref VALUES(110,
12630 27 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 27  'Not authorized'
12640 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12650 72 65 66 20 56 41 4c 55 45 53 28 31 32 30 2c 27  ref VALUES(120,'
12660 43 47 49 20 45 72 72 6f 72 27 29 3b 0a 49 4e 53  CGI Error');.INS
12670 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12680 4c 55 45 53 28 31 33 30 2c 27 54 69 6d 65 6f 75  LUES(130,'Timeou
12690 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  t');.INSERT INTO
126a0 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 34 30   xref VALUES(140
126b0 2c 27 43 47 49 20 73 63 72 69 70 74 20 69 73 20  ,'CGI script is 
126c0 77 72 69 74 61 62 6c 65 27 29 3b 0a 49 4e 53 45  writable');.INSE
126d0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
126e0 55 45 53 28 31 35 30 2c 27 43 61 6e 6e 6f 74 20  UES(150,'Cannot 
126f0 6f 70 65 6e 20 2d 61 75 74 68 20 66 69 6c 65 27  open -auth file'
12700 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12710 72 65 66 20 56 41 4c 55 45 53 28 31 36 30 2c 27  ref VALUES(160,'
12720 68 74 74 70 20 72 65 71 75 65 73 74 20 6f 6e 20  http request on 
12730 68 74 74 70 73 2d 6f 6e 6c 79 20 70 61 67 65 27  https-only page'
12740 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12750 72 65 66 20 56 41 4c 55 45 53 28 31 37 30 2c 27  ref VALUES(170,'
12760 2d 61 75 74 68 20 72 65 64 69 72 65 63 74 27 29  -auth redirect')
12770 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12780 65 66 20 56 41 4c 55 45 53 28 31 38 30 2c 27 6d  ef VALUES(180,'m
12790 61 6c 66 6f 72 6d 65 64 20 65 6e 74 72 79 20 69  alformed entry i
127a0 6e 20 2d 61 75 74 68 20 66 69 6c 65 27 29 3b 0a  n -auth file');.
127b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
127c0 20 56 41 4c 55 45 53 28 31 39 30 2c 27 63 68 64   VALUES(190,'chd
127d0 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  ir() failed');.I
127e0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
127f0 56 41 4c 55 45 53 28 32 30 30 2c 27 62 61 64 20  VALUES(200,'bad 
12800 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48 54 54 50  protocol in HTTP
12810 20 68 65 61 64 65 72 27 29 3b 0a 49 4e 53 45 52   header');.INSER
12820 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12830 45 53 28 32 31 30 2c 27 45 6d 70 74 79 20 72 65  ES(210,'Empty re
12840 71 75 65 73 74 20 55 52 49 27 29 3b 0a 49 4e 53  quest URI');.INS
12850 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12860 4c 55 45 53 28 32 32 30 2c 27 55 6e 6b 6e 6f 77  LUES(220,'Unknow
12870 6e 20 72 65 71 75 65 73 74 20 6d 65 74 68 6f 64  n request method
12880 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12890 78 72 65 66 20 56 41 4c 55 45 53 28 32 33 30 2c  xref VALUES(230,
128a0 27 52 65 66 65 72 72 65 72 20 69 73 20 64 65 76  'Referrer is dev
128b0 69 64 73 2e 6e 65 74 27 29 3b 0a 49 4e 53 45 52  ids.net');.INSER
128c0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
128d0 45 53 28 32 34 30 2c 27 49 6c 6c 65 67 61 6c 20  ES(240,'Illegal 
128e0 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54 3a  content in HOST:
128f0 20 70 61 72 61 6d 65 74 65 72 27 29 3b 0a 49 4e   parameter');.IN
12900 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12910 41 4c 55 45 53 28 32 35 30 2c 27 44 69 73 61 6c  ALUES(250,'Disal
12920 6c 6f 77 65 64 20 75 73 65 72 20 61 67 65 6e 74  lowed user agent
12930 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12940 78 72 65 66 20 56 41 4c 55 45 53 28 32 36 30 2c  xref VALUES(260,
12950 27 44 69 73 61 6c 6c 6f 77 65 64 20 72 65 66 65  'Disallowed refe
12960 72 72 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49  rrer');.INSERT I
12970 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
12980 32 37 30 2c 27 52 65 71 75 65 73 74 20 74 6f 6f  270,'Request too
12990 20 6c 61 72 67 65 27 29 3b 0a 49 4e 53 45 52 54   large');.INSERT
129a0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
129b0 53 28 32 38 30 2c 27 6d 6b 73 74 65 6d 70 28 29  S(280,'mkstemp()
129c0 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
129d0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
129e0 45 53 28 32 39 30 2c 27 63 61 6e 6e 6f 74 20 63  ES(290,'cannot c
129f0 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 20  reate temp file 
12a00 66 6f 72 20 50 4f 53 54 20 63 6f 6e 74 65 6e 74  for POST content
12a10 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12a20 78 72 65 66 20 56 41 4c 55 45 53 28 33 30 30 2c  xref VALUES(300,
12a30 27 50 61 74 68 20 65 6c 65 6d 65 6e 74 20 62 65  'Path element be
12a40 67 69 6e 73 20 77 69 74 68 20 2e 20 6f 72 20 2d  gins with . or -
12a50 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12a60 78 72 65 66 20 56 41 4c 55 45 53 28 33 31 30 2c  xref VALUES(310,
12a70 27 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 73 74  'URI does not st
12a80 61 72 74 20 77 69 74 68 20 2f 27 29 3b 0a 49 4e  art with /');.IN
12a90 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12aa0 41 4c 55 45 53 28 33 32 30 2c 27 55 52 49 20 74  ALUES(320,'URI t
12ab0 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e 53 45 52  oo long');.INSER
12ac0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12ad0 45 53 28 33 33 30 2c 27 4d 69 73 73 69 6e 67 20  ES(330,'Missing 
12ae0 48 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72 27  HOST: parameter'
12af0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12b00 72 65 66 20 56 41 4c 55 45 53 28 33 34 30 2c 27  ref VALUES(340,'
12b10 48 4f 53 54 20 70 61 72 61 6d 65 74 65 72 20 74  HOST parameter t
12b20 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e 53 45 52  oo long');.INSER
12b30 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12b40 45 53 28 33 35 30 2c 27 2a 2e 77 65 62 73 69 74  ES(350,'*.websit
12b50 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 27 29 3b  e permissions');
12b60 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12b70 66 20 56 41 4c 55 45 53 28 33 36 30 2c 27 63 68  f VALUES(360,'ch
12b80 64 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b 0a  dir() failed');.
12b90 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
12ba0 20 56 41 4c 55 45 53 28 33 37 30 2c 27 72 65 64   VALUES(370,'red
12bb0 69 72 65 63 74 20 74 6f 20 6e 6f 74 2d 66 6f 75  irect to not-fou
12bc0 6e 64 20 70 61 67 65 27 29 3b 0a 49 4e 53 45 52  nd page');.INSER
12bd0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12be0 45 53 28 33 38 30 2c 27 55 52 49 20 6e 6f 74 20  ES(380,'URI not 
12bf0 66 6f 75 6e 64 27 29 3b 0a 49 4e 53 45 52 54 20  found');.INSERT 
12c00 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12c10 28 33 39 30 2c 27 46 69 6c 65 20 6e 6f 74 20 72  (390,'File not r
12c20 65 61 64 61 62 6c 65 27 29 3b 0a 49 4e 53 45 52  eadable');.INSER
12c30 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12c40 45 53 28 34 30 30 2c 27 55 52 49 20 69 73 20 61  ES(400,'URI is a
12c50 20 64 69 72 65 63 74 6f 72 79 20 77 2f 6f 20 69   directory w/o i
12c60 6e 64 65 78 2e 68 74 6d 6c 27 29 3b 0a 49 4e 53  ndex.html');.INS
12c70 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12c80 4c 55 45 53 28 34 31 30 2c 27 72 65 64 69 72 65  LUES(410,'redire
12c90 63 74 20 74 6f 20 61 64 64 20 74 72 61 69 6c 69  ct to add traili
12ca0 6e 67 20 2f 27 29 3b 0a 49 4e 53 45 52 54 20 49  ng /');.INSERT I
12cb0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
12cc0 34 32 30 2c 27 63 68 64 69 72 28 29 20 66 61 69  420,'chdir() fai
12cd0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
12ce0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34  TO xref VALUES(4
12cf0 33 30 2c 27 64 75 70 28 30 29 20 66 61 69 6c 65  30,'dup(0) faile
12d00 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  d');.INSERT INTO
12d10 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 34 30   xref VALUES(440
12d20 2c 27 70 69 70 65 28 29 20 66 61 69 6c 65 64 27  ,'pipe() failed'
12d30 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12d40 72 65 66 20 56 41 4c 55 45 53 28 34 35 30 2c 27  ref VALUES(450,'
12d50 64 75 70 28 31 29 20 66 61 69 6c 65 64 27 29 3b  dup(1) failed');
12d60 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12d70 66 20 56 41 4c 55 45 53 28 34 36 30 2c 27 45 78  f VALUES(460,'Ex
12d80 63 65 73 73 20 55 52 49 20 63 6f 6e 74 65 6e 74  cess URI content
12d90 20 70 61 73 74 20 73 74 61 74 69 63 20 66 69 6c   past static fil
12da0 65 20 6e 61 6d 65 27 29 3b 0a 49 4e 53 45 52 54  e name');.INSERT
12db0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
12dc0 53 28 34 37 30 2c 27 45 54 61 67 20 43 61 63 68  S(470,'ETag Cach
12dd0 65 20 48 69 74 27 29 3b 0a 49 4e 53 45 52 54 20  e Hit');.INSERT 
12de0 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12df0 28 34 38 30 2c 27 66 6f 70 65 6e 28 29 20 66 61  (480,'fopen() fa
12e00 69 6c 65 64 20 66 6f 72 20 73 74 61 74 69 63 20  iled for static 
12e10 63 6f 6e 74 65 6e 74 27 29 3b 0a 49 4e 53 45 52  content');.INSER
12e20 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12e30 45 53 28 32 2c 27 4e 6f 72 6d 61 6c 20 48 45 41  ES(2,'Normal HEA
12e40 44 20 72 65 70 6c 79 27 29 3b 0a 49 4e 53 45 52  D reply');.INSER
12e50 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12e60 45 53 28 30 2c 27 4e 6f 72 6d 61 6c 20 72 65 70  ES(0,'Normal rep
12e70 6c 79 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ly');.INSERT INT
12e80 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 30  O xref VALUES(50
12e90 30 2c 27 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72  0,'unknown IP pr
12ea0 6f 74 6f 63 6f 6c 27 29 3b 0a 49 4e 53 45 52 54  otocol');.INSERT
12eb0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
12ec0 53 28 35 31 30 2c 27 75 6e 6b 6e 6f 77 6e 20 63  S(510,'unknown c
12ed0 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75  ommand-line argu
12ee0 6d 65 6e 74 20 6f 6e 20 6c 61 75 6e 63 68 27 29  ment on launch')
12ef0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12f00 65 66 20 56 41 4c 55 45 53 28 35 32 30 2c 27 2d  ef VALUES(520,'-
12f10 2d 72 6f 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d  -root argument m
12f20 69 73 73 69 6e 67 27 29 3b 0a 49 4e 53 45 52 54  issing');.INSERT
12f30 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
12f40 53 28 35 33 30 2c 27 63 68 64 69 72 28 29 20 66  S(530,'chdir() f
12f50 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20  ailed');.INSERT 
12f60 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12f70 28 35 34 30 2c 27 63 68 72 6f 6f 74 28 29 20 66  (540,'chroot() f
12f80 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20  ailed');.INSERT 
12f90 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12fa0 28 35 35 30 2c 27 73 65 72 76 65 72 20 73 74 61  (550,'server sta
12fb0 72 74 75 70 20 66 61 69 6c 65 64 27 29 3b 0a 49  rtup failed');.I
12fc0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
12fd0 56 41 4c 55 45 53 28 35 36 30 2c 27 73 65 74 67  VALUES(560,'setg
12fe0 69 64 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  id() failed');.I
12ff0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
13000 56 41 4c 55 45 53 28 35 37 30 2c 27 73 65 74 75  VALUES(570,'setu
13010 69 64 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  id() failed');.I
13020 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
13030 56 41 4c 55 45 53 28 35 38 30 2c 27 75 6e 6b 6e  VALUES(580,'unkn
13040 6f 77 6e 20 75 73 65 72 27 29 3b 0a 49 4e 53 45  own user');.INSE
13050 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
13060 55 45 53 28 35 39 30 2c 27 63 61 6e 6e 6f 74 20  UES(590,'cannot 
13070 72 75 6e 20 61 73 20 72 6f 6f 74 27 29 3b 0a 49  run as root');.I
13080 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
13090 56 41 4c 55 45 53 28 36 30 30 2c 27 6d 61 6c 6c  VALUES(600,'mall
130a0 6f 63 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  oc() failed');.I
130b0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
130c0 56 41 4c 55 45 53 28 36 31 30 2c 27 6d 61 6c 6c  VALUES(610,'mall
130d0 6f 63 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 43  oc() failed');.C
130e0 4f 4d 4d 49 54 3b 0a 23 65 6e 64 69 66 20 2f 2a  OMMIT;.#endif /*
130f0 20 53 51 4c 20 2a 2f 0a                           SQL */.