Documentation Source Text

Hex Artifact Content
Login

Artifact 5cb76b63919462c8e5bf89412ea83cc9270ccf323e6bddd295bec2972b85b951:


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 74 69 6d 65 5f 74 29 28 6e 44 61 79 2a 32 34  (time_t)(nDay*24
5080: 20 2b 20 68 6f 75 72 29 2a 36 30 20 2b 20 6d 69   + hour)*60 + mi
5090: 6e 29 2a 36 30 20 2b 20 73 65 63 3b 0a 20 20 20  n)*60 + sec;.   
50a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
50b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
50c0: 0a 2a 2a 20 54 65 73 74 20 70 72 6f 63 65 64 75  .** Test procedu
50d0: 72 65 20 66 6f 72 20 50 61 72 73 65 52 66 63 38  re for ParseRfc8
50e0: 32 32 44 61 74 65 0a 2a 2f 0a 76 6f 69 64 20 54  22Date.*/.void T
50f0: 65 73 74 50 61 72 73 65 52 66 63 38 32 32 44 61  estParseRfc822Da
5100: 74 65 28 76 6f 69 64 29 7b 0a 20 20 74 69 6d 65  te(void){.  time
5110: 5f 74 20 74 31 2c 20 74 32 3b 0a 20 20 66 6f 72  _t t1, t2;.  for
5120: 28 74 31 3d 30 3b 20 74 31 3c 30 78 37 66 66 66  (t1=0; t1<0x7fff
5130: 66 66 66 66 3b 20 74 31 20 2b 3d 20 31 32 37 29  ffff; t1 += 127)
5140: 7b 0a 20 20 20 20 74 32 20 3d 20 50 61 72 73 65  {.    t2 = Parse
5150: 52 66 63 38 32 32 44 61 74 65 28 52 66 63 38 32  Rfc822Date(Rfc82
5160: 32 44 61 74 65 28 74 31 29 29 3b 0a 20 20 20 20  2Date(t1));.    
5170: 61 73 73 65 72 74 28 20 74 31 3d 3d 74 32 20 29  assert( t1==t2 )
5180: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
5190: 72 69 6e 74 20 74 68 65 20 66 69 72 73 74 20 6c  rint the first l
51a0: 69 6e 65 20 6f 66 20 61 20 72 65 73 70 6f 6e 73  ine of a respons
51b0: 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  e followed by th
51c0: 65 20 73 65 72 76 65 72 20 74 79 70 65 2e 0a 2a  e server type..*
51d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 74  /.static void St
51e0: 61 72 74 52 65 73 70 6f 6e 73 65 28 63 6f 6e 73  artResponse(cons
51f0: 74 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 43  t char *zResultC
5200: 6f 64 65 29 7b 0a 20 20 74 69 6d 65 5f 74 20 6e  ode){.  time_t n
5210: 6f 77 3b 0a 20 20 74 69 6d 65 28 26 6e 6f 77 29  ow;.  time(&now)
5220: 3b 0a 20 20 69 66 28 20 73 74 61 74 75 73 53 65  ;.  if( statusSe
5230: 6e 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6e  nt ) return;.  n
5240: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 25  Out += printf("%
5250: 73 20 25 73 5c 72 5c 6e 22 2c 20 7a 50 72 6f 74  s %s\r\n", zProt
5260: 6f 63 6f 6c 2c 20 7a 52 65 73 75 6c 74 43 6f 64  ocol, zResultCod
5270: 65 29 3b 0a 20 20 73 74 72 6e 63 70 79 28 7a 52  e);.  strncpy(zR
5280: 65 70 6c 79 53 74 61 74 75 73 2c 20 7a 52 65 73  eplyStatus, zRes
5290: 75 6c 74 43 6f 64 65 2c 20 33 29 3b 0a 20 20 7a  ultCode, 3);.  z
52a0: 52 65 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d  ReplyStatus[3] =
52b0: 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 70 6c 79   0;.  if( zReply
52c0: 53 74 61 74 75 73 5b 30 5d 3e 3d 27 34 27 20 29  Status[0]>='4' )
52d0: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
52e0: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 20  ction = 1;.  }. 
52f0: 20 69 66 28 20 63 6c 6f 73 65 43 6f 6e 6e 65 63   if( closeConnec
5300: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 6e 4f 75 74  tion ){.    nOut
5310: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 6e   += printf("Conn
5320: 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65 5c 72 5c  ection: close\r\
5330: 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n");.  }else{.  
5340: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
5350: 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65  ("Connection: ke
5360: 65 70 2d 61 6c 69 76 65 5c 72 5c 6e 22 29 3b 0a  ep-alive\r\n");.
5370: 20 20 7d 0a 20 20 6e 4f 75 74 20 2b 3d 20 44 61    }.  nOut += Da
5380: 74 65 54 61 67 28 22 44 61 74 65 22 2c 20 6e 6f  teTag("Date", no
5390: 77 29 3b 0a 20 20 73 74 61 74 75 73 53 65 6e 74  w);.  statusSent
53a0: 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 1;.}../*.** T
53b0: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
53c0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
53d0: 73 75 63 68 20 64 6f 63 75 6d 65 6e 74 0a 2a 2f  such document.*/
53e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4e 6f 74  .static void Not
53f0: 46 6f 75 6e 64 28 69 6e 74 20 6c 69 6e 65 6e 6f  Found(int lineno
5400: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
5410: 73 65 28 22 34 30 34 20 4e 6f 74 20 46 6f 75 6e  se("404 Not Foun
5420: 64 22 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70  d");.  nOut += p
5430: 72 69 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74  rintf(.    "Cont
5440: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 68  ent-type: text/h
5450: 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72  tml\r\n".    "\r
5460: 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61 64 3e 3c  \n".    "<head><
5470: 74 69 74 6c 65 20 6c 69 6e 65 6e 6f 3d 5c 22 25  title lineno=\"%
5480: 64 5c 22 3e 4e 6f 74 20 46 6f 75 6e 64 3c 2f 74  d\">Not Found</t
5490: 69 74 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a  itle></head>\n".
54a0: 20 20 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 44      "<body><h1>D
54b0: 6f 63 75 6d 65 6e 74 20 4e 6f 74 20 46 6f 75 6e  ocument Not Foun
54c0: 64 3c 2f 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54  d</h1>\n".    "T
54d0: 68 65 20 64 6f 63 75 6d 65 6e 74 20 25 73 20 69  he document %s i
54e0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
54f0: 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72 5c 6e  on this server\n
5500: 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e  ".    "</body>\n
5510: 22 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 53 63 72 69  ", lineno, zScri
5520: 70 74 29 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e  pt);.  MakeLogEn
5530: 74 72 79 28 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  try(0, lineno);.
5540: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a    exit(0);.}../*
5550: 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69  .** Tell the cli
5560: 65 6e 74 20 74 68 61 74 20 74 68 65 79 20 61 72  ent that they ar
5570: 65 20 6e 6f 74 20 77 65 6c 63 6f 6d 65 64 20 68  e not welcomed h
5580: 65 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ere..*/.static v
5590: 6f 69 64 20 46 6f 72 62 69 64 64 65 6e 28 69 6e  oid Forbidden(in
55a0: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 53 74 61  t lineno){.  Sta
55b0: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 33 20  rtResponse("403 
55c0: 46 6f 72 62 69 64 64 65 6e 22 29 3b 0a 20 20 6e  Forbidden");.  n
55d0: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20  Out += printf(. 
55e0: 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65     "Content-type
55f0: 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e  : text/plain\r\n
5600: 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20  ".    "\r\n".   
5610: 20 22 41 63 63 65 73 73 20 64 65 6e 69 65 64 5c   "Access denied\
5620: 6e 22 0a 20 20 29 3b 0a 20 20 63 6c 6f 73 65 43  n".  );.  closeC
5630: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20  onnection = 1;. 
5640: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
5650: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 65 78 69 74   lineno);.  exit
5660: 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65  (0);.}../*.** Te
5670: 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74 68  ll the client th
5680: 61 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  at authorization
5690: 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
56a0: 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 64 6f  access the.** do
56b0: 63 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  cument..*/.stati
56c0: 63 20 76 6f 69 64 20 4e 6f 74 41 75 74 68 6f 72  c void NotAuthor
56d0: 69 7a 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20  ized(const char 
56e0: 2a 7a 52 65 61 6c 6d 29 7b 0a 20 20 53 74 61 72  *zRealm){.  Star
56f0: 74 52 65 73 70 6f 6e 73 65 28 22 34 30 31 20 41  tResponse("401 A
5700: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 52 65 71  uthorization Req
5710: 75 69 72 65 64 22 29 3b 0a 20 20 6e 4f 75 74 20  uired");.  nOut 
5720: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
5730: 57 57 57 2d 41 75 74 68 65 6e 74 69 63 61 74 65  WWW-Authenticate
5740: 3a 20 42 61 73 69 63 20 72 65 61 6c 6d 3d 5c 22  : Basic realm=\"
5750: 25 73 5c 22 5c 72 5c 6e 22 0a 20 20 20 20 22 43  %s\"\r\n".    "C
5760: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
5770: 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20 20  t/html\r\n".    
5780: 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65 61  "\r\n".    "<hea
5790: 64 3e 3c 74 69 74 6c 65 3e 4e 6f 74 20 41 75 74  d><title>Not Aut
57a0: 68 6f 72 69 7a 65 64 3c 2f 74 69 74 6c 65 3e 3c  horized</title><
57b0: 2f 68 65 61 64 3e 5c 6e 22 0a 20 20 20 20 22 3c  /head>\n".    "<
57c0: 62 6f 64 79 3e 3c 68 31 3e 34 30 31 20 4e 6f 74  body><h1>401 Not
57d0: 20 41 75 74 68 6f 72 69 7a 65 64 3c 2f 68 31 3e   Authorized</h1>
57e0: 5c 6e 22 0a 20 20 20 20 22 41 20 6c 6f 67 69 6e  \n".    "A login
57f0: 20 61 6e 64 20 70 61 73 73 77 6f 72 64 20 61 72   and password ar
5800: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  e required for t
5810: 68 69 73 20 64 6f 63 75 6d 65 6e 74 5c 6e 22 0a  his document\n".
5820: 20 20 20 20 22 3c 2f 62 6f 64 79 3e 5c 6e 22 2c      "</body>\n",
5830: 20 7a 52 65 61 6c 6d 29 3b 0a 20 20 4d 61 6b 65   zRealm);.  Make
5840: 4c 6f 67 45 6e 74 72 79 28 30 2c 20 31 31 30 29  LogEntry(0, 110)
5850: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 74 20 61  ;  /* LOG: Not a
5860: 75 74 68 6f 72 69 7a 65 64 20 2a 2f 0a 7d 0a 0a  uthorized */.}..
5870: 2f 2a 0a 2a 2a 20 54 65 6c 6c 20 74 68 65 20 63  /*.** Tell the c
5880: 6c 69 65 6e 74 20 74 68 61 74 20 74 68 65 72 65  lient that there
5890: 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20   is an error in 
58a0: 74 68 65 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73  the script..*/.s
58b0: 74 61 74 69 63 20 76 6f 69 64 20 43 67 69 45 72  tatic void CgiEr
58c0: 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 53 74 61  ror(void){.  Sta
58d0: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
58e0: 45 72 72 6f 72 22 29 3b 0a 20 20 6e 4f 75 74 20  Error");.  nOut 
58f0: 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 22  += printf(.    "
5900: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
5910: 78 74 2f 68 74 6d 6c 5c 72 5c 6e 22 0a 20 20 20  xt/html\r\n".   
5920: 20 22 5c 72 5c 6e 22 0a 20 20 20 20 22 3c 68 65   "\r\n".    "<he
5930: 61 64 3e 3c 74 69 74 6c 65 3e 43 47 49 20 50 72  ad><title>CGI Pr
5940: 6f 67 72 61 6d 20 45 72 72 6f 72 3c 2f 74 69 74  ogram Error</tit
5950: 6c 65 3e 3c 2f 68 65 61 64 3e 5c 6e 22 0a 20 20  le></head>\n".  
5960: 20 20 22 3c 62 6f 64 79 3e 3c 68 31 3e 43 47 49    "<body><h1>CGI
5970: 20 50 72 6f 67 72 61 6d 20 45 72 72 6f 72 3c 2f   Program Error</
5980: 68 31 3e 5c 6e 22 0a 20 20 20 20 22 54 68 65 20  h1>\n".    "The 
5990: 43 47 49 20 70 72 6f 67 72 61 6d 20 25 73 20 67  CGI program %s g
59a0: 65 6e 65 72 61 74 65 64 20 61 6e 20 65 72 72 6f  enerated an erro
59b0: 72 5c 6e 22 0a 20 20 20 20 22 3c 2f 62 6f 64 79  r\n".    "</body
59c0: 3e 5c 6e 22 2c 20 7a 53 63 72 69 70 74 29 3b 0a  >\n", zScript);.
59d0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
59e0: 2c 20 31 32 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  , 120);  /* LOG:
59f0: 20 43 47 49 20 45 72 72 6f 72 20 2a 2f 0a 20 20   CGI Error */.  
5a00: 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(0);.}../*.*
5a10: 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
5a20: 20 69 66 20 77 65 20 74 69 6d 65 6f 75 74 20 6f   if we timeout o
5a30: 72 20 63 61 74 63 68 20 73 6f 6d 65 20 6f 74 68  r catch some oth
5a40: 65 72 20 6b 69 6e 64 20 6f 66 20 73 69 67 6e 61  er kind of signa
5a50: 6c 2e 0a 2a 2a 20 4c 6f 67 20 61 6e 20 65 72 72  l..** Log an err
5a60: 6f 72 20 63 6f 64 65 20 77 68 69 63 68 20 69 73  or code which is
5a70: 20 39 30 30 2b 69 53 69 67 20 61 6e 64 20 74 68   900+iSig and th
5a80: 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74  en quit..*/.stat
5a90: 69 63 20 76 6f 69 64 20 54 69 6d 65 6f 75 74 28  ic void Timeout(
5aa0: 69 6e 74 20 69 53 69 67 29 7b 0a 20 20 69 66 28  int iSig){.  if(
5ab0: 20 21 64 65 62 75 67 46 6c 61 67 20 29 7b 0a 20   !debugFlag ){. 
5ac0: 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 20 26     if( zScript &
5ad0: 26 20 7a 53 63 72 69 70 74 5b 30 5d 20 29 7b 0a  & zScript[0] ){.
5ae0: 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b        char zBuf[
5af0: 31 30 5d 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b  10];.      zBuf[
5b00: 30 5d 20 3d 20 27 39 27 3b 0a 20 20 20 20 20 20  0] = '9';.      
5b10: 7a 42 75 66 5b 31 5d 20 3d 20 27 30 27 20 2b 20  zBuf[1] = '0' + 
5b20: 28 69 53 69 67 2f 31 30 29 25 31 30 3b 0a 20 20  (iSig/10)%10;.  
5b30: 20 20 20 20 7a 42 75 66 5b 32 5d 20 3d 20 27 30      zBuf[2] = '0
5b40: 27 20 2b 20 69 53 69 67 25 31 30 3b 0a 20 20 20  ' + iSig%10;.   
5b50: 20 20 20 7a 42 75 66 5b 33 5d 20 3d 20 30 3b 0a     zBuf[3] = 0;.
5b60: 20 20 20 20 20 20 73 74 72 63 70 79 28 7a 52 65        strcpy(zRe
5b70: 70 6c 79 53 74 61 74 75 73 2c 20 7a 42 75 66 29  plyStatus, zBuf)
5b80: 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45  ;.      MakeLogE
5b90: 6e 74 72 79 28 30 2c 20 31 33 30 29 3b 20 20 2f  ntry(0, 130);  /
5ba0: 2a 20 4c 4f 47 3a 20 54 69 6d 65 6f 75 74 20 2a  * LOG: Timeout *
5bb0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 69 74  /.    }.    exit
5bc0: 28 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (0);.  }.}../*.*
5bd0: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e  * Tell the clien
5be0: 74 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  t that there is 
5bf0: 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
5c00: 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69  script..*/.stati
5c10: 63 20 76 6f 69 64 20 43 67 69 53 63 72 69 70 74  c void CgiScript
5c20: 57 72 69 74 61 62 6c 65 28 76 6f 69 64 29 7b 0a  Writable(void){.
5c30: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
5c40: 22 35 30 30 20 43 47 49 20 43 6f 6e 66 69 67 75  "500 CGI Configu
5c50: 72 61 74 69 6f 6e 20 45 72 72 6f 72 22 29 3b 0a  ration Error");.
5c60: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
5c70: 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74  (.    "Content-t
5c80: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
5c90: 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c 6e 22 0a  r\n".    "\r\n".
5ca0: 20 20 20 20 22 54 68 65 20 43 47 49 20 70 72 6f      "The CGI pro
5cb0: 67 72 61 6d 20 25 73 20 69 73 20 77 72 69 74 61  gram %s is writa
5cc0: 62 6c 65 20 62 79 20 75 73 65 72 73 20 6f 74 68  ble by users oth
5cd0: 65 72 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65  er than its owne
5ce0: 72 2e 5c 6e 22 2c 0a 20 20 20 20 7a 52 65 61 6c  r.\n",.    zReal
5cf0: 53 63 72 69 70 74 29 3b 0a 20 20 4d 61 6b 65 4c  Script);.  MakeL
5d00: 6f 67 45 6e 74 72 79 28 30 2c 20 31 34 30 29 3b  ogEntry(0, 140);
5d10: 20 20 2f 2a 20 4c 4f 47 3a 20 43 47 49 20 73 63    /* LOG: CGI sc
5d20: 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c 65  ript is writable
5d30: 20 2a 2f 0a 20 20 65 78 69 74 28 30 29 3b 20 20   */.  exit(0);  
5d40: 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54       .}../*.** T
5d50: 65 6c 6c 20 74 68 65 20 63 6c 69 65 6e 74 20 74  ell the client t
5d60: 68 61 74 20 74 68 65 20 73 65 72 76 65 72 20 6d  hat the server m
5d70: 61 6c 66 75 6e 63 74 69 6f 6e 65 64 2e 0a 2a 2f  alfunctioned..*/
5d80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 4d 61 6c  .static void Mal
5d90: 66 75 6e 63 74 69 6f 6e 28 69 6e 74 20 6c 69 6e  function(int lin
5da0: 65 6e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  enum, const char
5db0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
5dc0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
5dd0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5de0: 6f 72 6d 61 74 29 3b 0a 20 20 53 74 61 72 74 52  ormat);.  StartR
5df0: 65 73 70 6f 6e 73 65 28 22 35 30 30 20 53 65 72  esponse("500 Ser
5e00: 76 65 72 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 22  ver Malfunction"
5e10: 29 3b 0a 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  );.  nOut += pri
5e20: 6e 74 66 28 0a 20 20 20 20 22 43 6f 6e 74 65 6e  ntf(.    "Conten
5e30: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
5e40: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 22 5c 72 5c  in\r\n".    "\r\
5e50: 6e 22 0a 20 20 20 20 22 57 65 62 20 73 65 72 76  n".    "Web serv
5e60: 65 72 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 65 64  er malfunctioned
5e70: 3b 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 25  ; error number %
5e80: 64 5c 6e 5c 6e 22 2c 20 6c 69 6e 65 6e 75 6d 29  d\n\n", linenum)
5e90: 3b 0a 20 20 69 66 28 20 7a 46 6f 72 6d 61 74 20  ;.  if( zFormat 
5ea0: 29 7b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 76  ){.    nOut += v
5eb0: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
5ec0: 61 70 29 3b 0a 20 20 7d 0a 20 20 4d 61 6b 65 4c  ap);.  }.  MakeL
5ed0: 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69 6e 65 6e  ogEntry(0, linen
5ee0: 75 6d 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 20  um);.  exit(0); 
5ef0: 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
5f00: 44 6f 20 61 20 73 65 72 76 65 72 20 72 65 64 69  Do a server redi
5f10: 72 65 63 74 20 74 6f 20 74 68 65 20 64 6f 63 75  rect to the docu
5f20: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 2e 20  ment specified. 
5f30: 20 54 68 65 20 64 6f 63 75 6d 65 6e 74 0a 2a 2a   The document.**
5f40: 20 6e 61 6d 65 20 6e 6f 74 20 63 6f 6e 74 61 69   name not contai
5f50: 6e 20 73 63 68 65 6d 65 20 6f 72 20 6e 65 74 77  n scheme or netw
5f60: 6f 72 6b 20 6c 6f 63 61 74 69 6f 6e 20 6f 72 20  ork location or 
5f70: 74 68 65 20 71 75 65 72 79 20 73 74 72 69 6e 67  the query string
5f80: 2e 0a 2a 2a 20 49 74 20 77 69 6c 6c 20 62 65 20  ..** It will be 
5f90: 6a 75 73 74 20 74 68 65 20 70 61 74 68 2e 0a 2a  just the path..*
5fa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 52 65  /.static void Re
5fb0: 64 69 72 65 63 74 28 63 6f 6e 73 74 20 63 68 61  direct(const cha
5fc0: 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 69  r *zPath, int fi
5fd0: 6e 69 73 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nish, int lineno
5fe0: 29 7b 0a 20 20 53 74 61 72 74 52 65 73 70 6f 6e  ){.  StartRespon
5ff0: 73 65 28 22 33 30 32 20 54 65 6d 70 6f 72 61 72  se("302 Temporar
6000: 79 20 52 65 64 69 72 65 63 74 22 29 3b 0a 20 20  y Redirect");.  
6010: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d  if( zServerPort=
6020: 3d 30 20 7c 7c 20 7a 53 65 72 76 65 72 50 6f 72  =0 || zServerPor
6030: 74 5b 30 5d 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  t[0]==0 || strcm
6040: 70 28 7a 53 65 72 76 65 72 50 6f 72 74 2c 22 38  p(zServerPort,"8
6050: 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 4f  0")==0 ){.    nO
6060: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f  ut += printf("Lo
6070: 63 61 74 69 6f 6e 3a 20 25 73 3a 2f 2f 25 73 25  cation: %s://%s%
6080: 73 25 73 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20  s%s\r\n",.      
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 48 74               zHt
60a0: 74 70 2c 20 7a 53 65 72 76 65 72 4e 61 6d 65 2c  tp, zServerName,
60b0: 20 7a 50 61 74 68 2c 20 7a 51 75 65 72 79 53 75   zPath, zQuerySu
60c0: 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffix);.  }else{.
60d0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
60e0: 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73  tf("Location: %s
60f0: 3a 2f 2f 25 73 3a 25 73 25 73 25 73 5c 72 5c 6e  ://%s:%s%s%s\r\n
6100: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6110: 20 20 20 20 20 20 7a 48 74 74 70 2c 20 7a 53 65        zHttp, zSe
6120: 72 76 65 72 4e 61 6d 65 2c 20 7a 53 65 72 76 65  rverName, zServe
6130: 72 50 6f 72 74 2c 20 7a 50 61 74 68 2c 20 7a 51  rPort, zPath, zQ
6140: 75 65 72 79 53 75 66 66 69 78 29 3b 0a 20 20 7d  uerySuffix);.  }
6150: 0a 20 20 69 66 28 20 66 69 6e 69 73 68 20 29 7b  .  if( finish ){
6160: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
6170: 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e  ntf("Content-len
6180: 67 74 68 3a 20 30 5c 72 5c 6e 22 29 3b 0a 20 20  gth: 0\r\n");.  
6190: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
61a0: 28 22 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 4d 61  ("\r\n");.    Ma
61b0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 6c 69  keLogEntry(0, li
61c0: 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 20 20 66 66 6c  neno);.  }.  ffl
61d0: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a 0a  ush(stdout);.}..
61e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
61f0: 69 6f 6e 20 74 72 65 61 74 73 20 69 74 73 20 69  ion treats its i
6200: 6e 70 75 74 20 61 73 20 61 20 62 61 73 65 2d 36  nput as a base-6
6210: 34 20 73 74 72 69 6e 67 20 61 6e 64 20 72 65 74  4 string and ret
6220: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 64 65 63 6f  urns the.** deco
6230: 64 65 64 20 76 61 6c 75 65 20 6f 66 20 74 68 61  ded value of tha
6240: 74 20 73 74 72 69 6e 67 2e 20 20 43 68 61 72 61  t string.  Chara
6250: 63 74 65 72 73 20 6f 66 20 69 6e 70 75 74 20 74  cters of input t
6260: 68 61 74 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 76  hat are not.** v
6270: 61 6c 69 64 20 62 61 73 65 2d 36 34 20 63 68 61  alid base-64 cha
6280: 72 61 63 74 65 72 73 20 28 73 75 63 68 20 61 73  racters (such as
6290: 20 73 70 61 63 65 73 20 61 6e 64 20 6e 65 77 6c   spaces and newl
62a0: 69 6e 65 73 29 20 61 72 65 20 69 67 6e 6f 72 65  ines) are ignore
62b0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 44 65 63 6f 64  d..*/.void Decod
62c0: 65 36 34 28 63 68 61 72 20 2a 7a 36 34 29 7b 0a  e64(char *z64){.
62d0: 20 20 63 68 61 72 20 2a 7a 44 61 74 61 3b 0a 20    char *zData;. 
62e0: 20 69 6e 74 20 6e 36 34 3b 0a 20 20 69 6e 74 20   int n64;.  int 
62f0: 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 61 2c 20 62  i, j;.  int a, b
6300: 2c 20 63 2c 20 64 3b 0a 20 20 73 74 61 74 69 63  , c, d;.  static
6310: 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30 3b   int isInit = 0;
6320: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 74 72  .  static int tr
6330: 61 6e 73 5b 31 32 38 5d 3b 0a 20 20 73 74 61 74  ans[128];.  stat
6340: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
6350: 20 7a 42 61 73 65 5b 5d 20 3d 20 0a 20 20 20 20   zBase[] = .    
6360: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
6370: 50 51 52 53 54 55 56 57 58 59 5a 61 62 63 64 65  PQRSTUVWXYZabcde
6380: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
6390: 76 77 78 79 7a 30 31 32 33 34 35 36 37 38 39 2b  vwxyz0123456789+
63a0: 2f 22 3b 0a 0a 20 20 69 66 28 20 21 69 73 49 6e  /";..  if( !isIn
63b0: 69 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  it ){.    for(i=
63c0: 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 7b 20  0; i<128; i++){ 
63d0: 74 72 61 6e 73 5b 69 5d 20 3d 20 30 3b 20 7d 0a  trans[i] = 0; }.
63e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 42 61      for(i=0; zBa
63f0: 73 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 74 72 61  se[i]; i++){ tra
6400: 6e 73 5b 7a 42 61 73 65 5b 69 5d 20 26 20 30 78  ns[zBase[i] & 0x
6410: 37 66 5d 20 3d 20 69 3b 20 7d 0a 20 20 20 20 69  7f] = i; }.    i
6420: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
6430: 20 6e 36 34 20 3d 20 73 74 72 6c 65 6e 28 7a 36   n64 = strlen(z6
6440: 34 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 36 34  4);.  while( n64
6450: 3e 30 20 26 26 20 7a 36 34 5b 6e 36 34 2d 31 5d  >0 && z64[n64-1]
6460: 3d 3d 27 3d 27 20 29 20 6e 36 34 2d 2d 3b 0a 20  =='=' ) n64--;. 
6470: 20 7a 44 61 74 61 20 3d 20 7a 36 34 3b 0a 20 20   zData = z64;.  
6480: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 2b 33 3c 6e  for(i=j=0; i+3<n
6490: 36 34 3b 20 69 2b 3d 34 29 7b 0a 20 20 20 20 61  64; i+=4){.    a
64a0: 20 3d 20 74 72 61 6e 73 5b 7a 36 34 5b 69 5d 20   = trans[z64[i] 
64b0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 62 20 3d  & 0x7f];.    b =
64c0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 31 5d 20   trans[z64[i+1] 
64d0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 63 20 3d  & 0x7f];.    c =
64e0: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 32 5d 20   trans[z64[i+2] 
64f0: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 64 20 3d  & 0x7f];.    d =
6500: 20 74 72 61 6e 73 5b 7a 36 34 5b 69 2b 33 5d 20   trans[z64[i+3] 
6510: 26 20 30 78 37 66 5d 3b 0a 20 20 20 20 7a 44 61  & 0x7f];.    zDa
6520: 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28 61 3c 3c 32  ta[j++] = ((a<<2
6530: 29 20 26 20 30 78 66 63 29 20 7c 20 28 28 62 3e  ) & 0xfc) | ((b>
6540: 3e 34 29 20 26 20 30 78 30 33 29 3b 0a 20 20 20  >4) & 0x03);.   
6550: 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d 20 28 28   zData[j++] = ((
6560: 62 3c 3c 34 29 20 26 20 30 78 66 30 29 20 7c 20  b<<4) & 0xf0) | 
6570: 28 28 63 3e 3e 32 29 20 26 20 30 78 30 66 29 3b  ((c>>2) & 0x0f);
6580: 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20  .    zData[j++] 
6590: 3d 20 28 28 63 3c 3c 36 29 20 26 20 30 78 63 30  = ((c<<6) & 0xc0
65a0: 29 20 7c 20 28 64 20 26 20 30 78 33 66 29 3b 0a  ) | (d & 0x3f);.
65b0: 20 20 7d 0a 20 20 69 66 28 20 69 2b 32 3c 6e 36    }.  if( i+2<n6
65c0: 34 20 29 7b 0a 20 20 20 20 61 20 3d 20 74 72 61  4 ){.    a = tra
65d0: 6e 73 5b 7a 36 34 5b 69 5d 20 26 20 30 78 37 66  ns[z64[i] & 0x7f
65e0: 5d 3b 0a 20 20 20 20 62 20 3d 20 74 72 61 6e 73  ];.    b = trans
65f0: 5b 7a 36 34 5b 69 2b 31 5d 20 26 20 30 78 37 66  [z64[i+1] & 0x7f
6600: 5d 3b 0a 20 20 20 20 63 20 3d 20 74 72 61 6e 73  ];.    c = trans
6610: 5b 7a 36 34 5b 69 2b 32 5d 20 26 20 30 78 37 66  [z64[i+2] & 0x7f
6620: 5d 3b 0a 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b  ];.    zData[j++
6630: 5d 20 3d 20 28 28 61 3c 3c 32 29 20 26 20 30 78  ] = ((a<<2) & 0x
6640: 66 63 29 20 7c 20 28 28 62 3e 3e 34 29 20 26 20  fc) | ((b>>4) & 
6650: 30 78 30 33 29 3b 0a 20 20 20 20 7a 44 61 74 61  0x03);.    zData
6660: 5b 6a 2b 2b 5d 20 3d 20 28 28 62 3c 3c 34 29 20  [j++] = ((b<<4) 
6670: 26 20 30 78 66 30 29 20 7c 20 28 28 63 3e 3e 32  & 0xf0) | ((c>>2
6680: 29 20 26 20 30 78 30 66 29 3b 0a 20 20 7d 65 6c  ) & 0x0f);.  }el
6690: 73 65 20 69 66 28 20 69 2b 31 3c 6e 36 34 20 29  se if( i+1<n64 )
66a0: 7b 0a 20 20 20 20 61 20 3d 20 74 72 61 6e 73 5b  {.    a = trans[
66b0: 7a 36 34 5b 69 5d 20 26 20 30 78 37 66 5d 3b 0a  z64[i] & 0x7f];.
66c0: 20 20 20 20 62 20 3d 20 74 72 61 6e 73 5b 7a 36      b = trans[z6
66d0: 34 5b 69 2b 31 5d 20 26 20 30 78 37 66 5d 3b 0a  4[i+1] & 0x7f];.
66e0: 20 20 20 20 7a 44 61 74 61 5b 6a 2b 2b 5d 20 3d      zData[j++] =
66f0: 20 28 28 61 3c 3c 32 29 20 26 20 30 78 66 63 29   ((a<<2) & 0xfc)
6700: 20 7c 20 28 28 62 3e 3e 34 29 20 26 20 30 78 30   | ((b>>4) & 0x0
6710: 33 29 3b 0a 20 20 7d 0a 20 20 7a 44 61 74 61 5b  3);.  }.  zData[
6720: 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  j] = 0;.}../*.**
6730: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
6740: 20 62 61 73 69 63 20 61 75 74 68 6f 72 69 7a 61   basic authoriza
6750: 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73  tion credentials
6760: 20 61 72 65 20 70 72 6f 76 69 64 65 64 20 66 6f   are provided fo
6770: 72 0a 2a 2a 20 74 68 65 20 75 73 65 72 20 61 63  r.** the user ac
6780: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 69  cording to the i
6790: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 7a 41  nformation in zA
67a0: 75 74 68 46 69 6c 65 2e 20 20 52 65 74 75 72 6e  uthFile.  Return
67b0: 20 74 72 75 65 0a 2a 2a 20 69 66 20 61 75 74 68   true.** if auth
67c0: 6f 72 69 7a 65 64 2e 20 20 52 65 74 75 72 6e 20  orized.  Return 
67d0: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 61 75 74  false if not aut
67e0: 68 6f 72 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  horized..**.** F
67f0: 69 6c 65 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ile format:.**.*
6800: 2a 20 20 20 20 2a 20 20 42 6c 61 6e 6b 20 6c 69  *    *  Blank li
6810: 6e 65 73 20 61 6e 64 20 6c 69 6e 65 73 20 74 68  nes and lines th
6820: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 27 23  at begin with '#
6830: 27 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 2a 2a  ' are ignored.**
6840: 20 20 20 20 2a 20 20 22 68 74 74 70 2d 72 65 64      *  "http-red
6850: 69 72 65 63 74 22 20 66 6f 72 63 65 73 20 61 20  irect" forces a 
6860: 72 65 64 69 72 65 63 74 20 74 6f 20 48 54 54 50  redirect to HTTP
6870: 53 20 69 66 20 6e 6f 74 20 74 68 65 72 65 20 61  S if not there a
6880: 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 2a 20 20  lready.**    *  
6890: 22 68 74 74 70 73 2d 6f 6e 6c 79 22 20 64 69 73  "https-only" dis
68a0: 61 6c 6c 6f 77 73 20 6f 70 65 72 61 74 69 6f 6e  allows operation
68b0: 20 69 6e 20 48 54 54 50 0a 2a 2a 20 20 20 20 2a   in HTTP.**    *
68c0: 20 20 22 75 73 65 72 20 4e 41 4d 45 20 4c 4f 47    "user NAME LOG
68d0: 49 4e 3a 50 41 53 53 57 4f 52 44 22 20 63 68 65  IN:PASSWORD" che
68e0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 4c 4f  cks to see if LO
68f0: 47 49 4e 3a 50 41 53 53 57 4f 52 44 20 0a 2a 2a  GIN:PASSWORD .**
6900: 20 20 20 20 20 20 20 61 75 74 68 6f 72 69 7a 61         authoriza
6910: 74 69 6f 6e 20 63 72 65 64 65 6e 74 69 61 6c 73  tion credentials
6920: 20 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20 61   are provided, a
6930: 6e 64 20 69 66 20 73 6f 20 73 65 74 73 20 74 68  nd if so sets th
6940: 65 0a 2a 2a 20 20 20 20 20 20 20 52 45 4d 4f 54  e.**       REMOT
6950: 45 5f 55 53 45 52 20 74 6f 20 4e 41 4d 45 2e 0a  E_USER to NAME..
6960: 2a 2a 20 20 20 20 2a 20 20 22 72 65 61 6c 6d 20  **    *  "realm 
6970: 54 45 58 54 22 20 73 65 74 73 20 74 68 65 20 72  TEXT" sets the r
6980: 65 61 6c 6d 20 74 6f 20 54 45 58 54 2e 0a 2a 2f  ealm to TEXT..*/
6990: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 68 65 63  .static int Chec
69a0: 6b 42 61 73 69 63 41 75 74 68 6f 72 69 7a 61 74  kBasicAuthorizat
69b0: 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ion(const char *
69c0: 7a 41 75 74 68 46 69 6c 65 29 7b 0a 20 20 46 49  zAuthFile){.  FI
69d0: 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a  LE *in;.  char *
69e0: 7a 52 65 61 6c 6d 20 3d 20 22 75 6e 6b 6e 6f 77  zRealm = "unknow
69f0: 6e 20 72 65 61 6c 6d 22 3b 0a 20 20 63 68 61 72  n realm";.  char
6a00: 20 2a 7a 4c 6f 67 69 6e 50 73 77 64 3b 0a 20 20   *zLoginPswd;.  
6a10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
6a20: 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 30 5d 3b  har zLine[2000];
6a30: 0a 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ..  in = fopen(z
6a40: 41 75 74 68 46 69 6c 65 2c 20 22 72 22 29 3b 0a  AuthFile, "r");.
6a50: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
6a60: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 31 35 30 29     NotFound(150)
6a70: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 61 6e 6e 6f  ;  /* LOG: Canno
6a80: 74 20 6f 70 65 6e 20 2d 61 75 74 68 20 66 69 6c  t open -auth fil
6a90: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
6aa0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 75  0;.  }.  if( zAu
6ab0: 74 68 41 72 67 20 29 20 44 65 63 6f 64 65 36 34  thArg ) Decode64
6ac0: 28 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 77 68  (zAuthArg);.  wh
6ad0: 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
6ae0: 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c  , sizeof(zLine),
6af0: 20 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72   in) ){.    char
6b00: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20   *zFieldName;.  
6b10: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20    char *zVal;.. 
6b20: 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20     zFieldName = 
6b30: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
6b40: 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20  zLine,&zVal);.  
6b50: 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65    if( zFieldName
6b60: 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61  ==0 || *zFieldNa
6b70: 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  me==0 ) continue
6b80: 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64  ;.    if( zField
6b90: 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27 20 29 20 63  Name[0]=='#' ) c
6ba0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 52 65 6d  ontinue;.    Rem
6bb0: 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56 61 6c 29  oveNewline(zVal)
6bc0: 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
6bd0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 20 22 72 65  (zFieldName, "re
6be0: 61 6c 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  alm")==0 ){.    
6bf0: 20 20 7a 52 65 61 6c 6d 20 3d 20 53 74 72 44 75    zRealm = StrDu
6c00: 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  p(zVal);.    }el
6c10: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
6c20: 69 65 6c 64 4e 61 6d 65 2c 22 75 73 65 72 22 29  ieldName,"user")
6c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6c40: 20 7a 41 75 74 68 41 72 67 3d 3d 30 20 29 20 63   zAuthArg==0 ) c
6c50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7a  ontinue;.      z
6c60: 4e 61 6d 65 20 3d 20 47 65 74 46 69 72 73 74 45  Name = GetFirstE
6c70: 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a 56  lement(zVal, &zV
6c80: 61 6c 29 3b 0a 20 20 20 20 20 20 7a 4c 6f 67 69  al);.      zLogi
6c90: 6e 50 73 77 64 20 3d 20 47 65 74 46 69 72 73 74  nPswd = GetFirst
6ca0: 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20 26 7a  Element(zVal, &z
6cb0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
6cc0: 7a 4c 6f 67 69 6e 50 73 77 64 3d 3d 30 20 29 20  zLoginPswd==0 ) 
6cd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6ce0: 69 66 28 20 7a 41 75 74 68 41 72 67 20 26 26 20  if( zAuthArg && 
6cf0: 73 74 72 63 6d 70 28 7a 41 75 74 68 41 72 67 2c  strcmp(zAuthArg,
6d00: 7a 4c 6f 67 69 6e 50 73 77 64 29 3d 3d 30 20 29  zLoginPswd)==0 )
6d10: 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 6d 6f 74  {.        zRemot
6d20: 65 55 73 65 72 20 3d 20 53 74 72 44 75 70 28 7a  eUser = StrDup(z
6d30: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 66  Name);.        f
6d40: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
6d50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6d60: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
6d70: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64  f( strcmp(zField
6d80: 4e 61 6d 65 2c 22 68 74 74 70 73 2d 6f 6e 6c 79  Name,"https-only
6d90: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
6da0: 66 28 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a  f( !useHttps ){.
6db0: 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64          NotFound
6dc0: 28 31 36 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20  (160);  /* LOG: 
6dd0: 20 68 74 74 70 20 72 65 71 75 65 73 74 20 6f 6e   http request on
6de0: 20 68 74 74 70 73 2d 6f 6e 6c 79 20 70 61 67 65   https-only page
6df0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 63 6c 6f   */.        fclo
6e00: 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  se(in);.        
6e10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6e20: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
6e30: 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  strcmp(zFieldNam
6e40: 65 2c 22 68 74 74 70 2d 72 65 64 69 72 65 63 74  e,"http-redirect
6e50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
6e60: 66 28 20 21 75 73 65 48 74 74 70 73 20 29 7b 0a  f( !useHttps ){.
6e70: 20 20 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20          zHttp = 
6e80: 22 68 74 74 70 73 22 3b 0a 20 20 20 20 20 20 20  "https";.       
6e90: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
6ea0: 22 25 73 25 73 22 2c 20 7a 53 63 72 69 70 74 2c  "%s%s", zScript,
6eb0: 20 7a 50 61 74 68 49 6e 66 6f 29 3b 0a 20 20 20   zPathInfo);.   
6ec0: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 4c       Redirect(zL
6ed0: 69 6e 65 2c 20 31 2c 20 31 37 30 29 3b 20 2f 2a  ine, 1, 170); /*
6ee0: 20 4c 4f 47 3a 20 2d 61 75 74 68 20 72 65 64 69   LOG: -auth redi
6ef0: 72 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  rect */.        
6f00: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
6f10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6f20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6f30: 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  .      NotFound(
6f40: 31 38 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 20  180);  /* LOG:  
6f50: 6d 61 6c 66 6f 72 6d 65 64 20 65 6e 74 72 79 20  malformed entry 
6f60: 69 6e 20 2d 61 75 74 68 20 66 69 6c 65 20 2a 2f  in -auth file */
6f70: 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  .      fclose(in
6f80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6f90: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  0;.    }.  }.  f
6fa0: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 4e 6f 74  close(in);.  Not
6fb0: 41 75 74 68 6f 72 69 7a 65 64 28 7a 52 65 61 6c  Authorized(zReal
6fc0: 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  m);.  return 0;.
6fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73 73 20 74  }../*.** Guess t
6fe0: 68 65 20 6d 69 6d 65 2d 74 79 70 65 20 6f 66 20  he mime-type of 
6ff0: 61 20 64 6f 63 75 6d 65 6e 74 20 62 61 73 65 64  a document based
7000: 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e 0a 2a 2f   on its name..*/
7010: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 47 65 74  .const char *Get
7020: 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73 74 20 63  MimeType(const c
7030: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
7040: 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20  nName){.  const 
7050: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69  char *z;.  int i
7060: 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 2c 20 6c  ;.  int first, l
7070: 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  ast;.  int len;.
7080: 20 20 63 68 61 72 20 7a 53 75 66 66 69 78 5b 32    char zSuffix[2
7090: 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74 61 62 6c  0];..  /* A tabl
70a0: 65 20 6f 66 20 6d 69 6d 65 74 79 70 65 73 20 62  e of mimetypes b
70b0: 61 73 65 64 20 6f 6e 20 66 69 6c 65 20 73 75 66  ased on file suf
70c0: 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20 53 75 66  fixes. .  ** Suf
70d0: 66 69 78 65 73 20 6d 75 73 74 20 62 65 20 69 6e  fixes must be in
70e0: 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 73 6f   sorted order so
70f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 64 6f 20   that we can do 
7100: 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a 20 73 65  a binary.  ** se
7110: 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65  arch to find the
7120: 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20 2a 2f 0a   mime-type.  */.
7130: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
7140: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
7150: 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b  t char *zSuffix;
7160: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
7170: 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20  le suffix */.   
7180: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
7190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
71a0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 66  ength of the suf
71b0: 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  fix */.    const
71c0: 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74 79 70 65   char *zMimetype
71d0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 72  ;     /* The cor
71e0: 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69 6d 65 74  responding mimet
71f0: 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d 69 6d 65  ype */.  } aMime
7200: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 69  [] = {.    { "ai
7210: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
7220: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73  pplication/posts
7230: 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20 20  cript"          
7240: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 22    },.    { "aif"
7250: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
7260: 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20  io/x-aiff"      
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 63 22 2c  },.    { "aifc",
7290: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
72a0: 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20 20  /x-aiff"        
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
72c0: 0a 20 20 20 20 7b 20 22 61 69 66 66 22 2c 20 20  .    { "aiff",  
72d0: 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 78       4, "audio/x
72e0: 2d 61 69 66 66 22 20 20 20 20 20 20 20 20 20 20  -aiff"          
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7300: 20 20 20 7b 20 22 61 72 6a 22 2c 20 20 20 20 20     { "arj",     
7310: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7320: 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70 72 65 73  on/x-arj-compres
7330: 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20 20 20  sed"      },.   
7340: 20 7b 20 22 61 73 63 22 2c 20 20 20 20 20 20 20   { "asc",       
7350: 20 33 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   3, "text/plain"
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7380: 20 22 61 73 66 22 2c 20 20 20 20 20 20 20 20 33   "asf",        3
7390: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73  , "video/x-ms-as
73a0: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
73b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
73c0: 61 73 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  asx",        3, 
73d0: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61 73 78 22  "video/x-ms-asx"
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 75      },.    { "au
7400: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
7410: 75 64 69 6f 2f 75 6c 61 77 22 20 20 20 20 20 20  udio/ulaw"      
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 76 69 22    },.    { "avi"
7440: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
7450: 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22 20 20 20  eo/x-msvideo"   
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74 22 2c 20  },.    { "bat", 
7480: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7490: 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70  cation/x-msdos-p
74a0: 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c  rogram"       },
74b0: 0a 20 20 20 20 7b 20 22 62 63 70 69 6f 22 2c 20  .    { "bcpio", 
74c0: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
74d0: 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22 20 20 20  tion/x-bcpio"   
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
74f0: 20 20 20 7b 20 22 62 69 6e 22 2c 20 20 20 20 20     { "bin",     
7500: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7510: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
7520: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7530: 20 7b 20 22 63 22 2c 20 20 20 20 20 20 20 20 20   { "c",         
7540: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7570: 20 22 63 63 22 2c 20 20 20 20 20 20 20 20 20 32   "cc",         2
7580: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
75b0: 63 63 61 64 22 2c 20 20 20 20 20 20 20 34 2c 20  ccad",       4, 
75c0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 63 6c 61  "application/cla
75d0: 72 69 73 63 61 64 22 20 20 20 20 20 20 20 20 20  riscad"         
75e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 64      },.    { "cd
75f0: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
7600: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74  pplication/x-net
7610: 63 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20  cdf"            
7620: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 61 73    },.    { "clas
7630: 73 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  s",      5, "app
7640: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
7650: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
7660: 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64 22 2c 20  },.    { "cod", 
7670: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7680: 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69 6d 2e 63  cation/vnd.rim.c
7690: 6f 64 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  od"           },
76a0: 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c 20 20 20  .    { "com",   
76b0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
76c0: 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d 70 72 6f  tion/x-msdos-pro
76d0: 67 72 61 6d 22 20 20 20 20 20 20 20 7d 2c 0a 20  gram"       },. 
76e0: 20 20 20 7b 20 22 63 70 69 6f 22 2c 20 20 20 20     { "cpio",    
76f0: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
7700: 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20 20 20 20  on/x-cpio"      
7710: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7720: 20 7b 20 22 63 70 74 22 2c 20 20 20 20 20 20 20   { "cpt",       
7730: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7740: 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70 72 6f 22  /mac-compactpro"
7750: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7760: 20 22 63 73 68 22 2c 20 20 20 20 20 20 20 20 33   "csh",        3
7770: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7780: 2d 63 73 68 22 20 20 20 20 20 20 20 20 20 20 20  -csh"           
7790: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
77a0: 63 73 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  css",        3, 
77b0: 22 74 65 78 74 2f 63 73 73 22 20 20 20 20 20 20  "text/css"      
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 63      },.    { "dc
77e0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
77f0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72  pplication/x-dir
7800: 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20  ector"          
7810: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 65 62 22    },.    { "deb"
7820: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7830: 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65 62 69 61  lication/x-debia
7840: 6e 2d 70 61 63 6b 61 67 65 22 20 20 20 20 20 20  n-package"      
7850: 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 22 2c 20  },.    { "dir", 
7860: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7870: 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f  cation/x-directo
7880: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  r"            },
7890: 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20 20 20 20  .    { "dl",    
78a0: 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 64       2, "video/d
78b0: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
78d0: 20 20 20 7b 20 22 64 6d 73 22 2c 20 20 20 20 20     { "dms",     
78e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
78f0: 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22  on/octet-stream"
7900: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7910: 20 7b 20 22 64 6f 63 22 2c 20 20 20 20 20 20 20   { "doc",       
7920: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7930: 2f 6d 73 77 6f 72 64 22 20 20 20 20 20 20 20 20  /msword"        
7940: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7950: 20 22 64 72 77 22 2c 20 20 20 20 20 20 20 20 33   "drw",        3
7960: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64  , "application/d
7970: 72 61 66 74 69 6e 67 22 20 20 20 20 20 20 20 20  rafting"        
7980: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7990: 64 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dvi",        3, 
79a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
79b0: 76 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20  vi"             
79c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 77      },.    { "dw
79d0: 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  g",        3, "a
79e0: 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63 61 64 22  pplication/acad"
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 66 22    },.    { "dxf"
7a10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7a20: 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22 20 20 20  lication/dxf"   
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72 22 2c 20  },.    { "dxr", 
7a50: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7a60: 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65 63 74 6f  cation/x-directo
7a70: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  r"            },
7a80: 0a 20 20 20 20 7b 20 22 65 70 73 22 2c 20 20 20  .    { "eps",   
7a90: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7aa0: 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69 70 74 22  tion/postscript"
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7ac0: 20 20 20 7b 20 22 65 74 78 22 2c 20 20 20 20 20     { "etx",     
7ad0: 20 20 20 33 2c 20 22 74 65 78 74 2f 78 2d 73 65     3, "text/x-se
7ae0: 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20 20  text"           
7af0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7b00: 20 7b 20 22 65 78 65 22 2c 20 20 20 20 20 20 20   { "exe",       
7b10: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7b20: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
7b30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7b40: 20 22 65 7a 22 2c 20 20 20 20 20 20 20 20 20 32   "ez",         2
7b50: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61  , "application/a
7b60: 6e 64 72 65 77 2d 69 6e 73 65 74 22 20 20 20 20  ndrew-inset"    
7b70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7b80: 66 22 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20  f",          1, 
7b90: 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20  "text/plain"    
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 39      },.    { "f9
7bc0: 30 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  0",        3, "t
7bd0: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 69 22    },.    { "fli"
7c00: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
7c10: 65 6f 2f 66 6c 69 22 20 20 20 20 20 20 20 20 20  eo/fli"         
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76 22 2c 20  },.    { "flv", 
7c40: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
7c50: 2f 66 6c 76 22 20 20 20 20 20 20 20 20 20 20 20  /flv"           
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7c70: 0a 20 20 20 20 7b 20 22 67 69 66 22 2c 20 20 20  .    { "gif",   
7c80: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 67       3, "image/g
7c90: 69 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  if"             
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7cb0: 20 20 20 7b 20 22 67 6c 22 2c 20 20 20 20 20 20     { "gl",      
7cc0: 20 20 20 32 2c 20 22 76 69 64 65 6f 2f 67 6c 22     2, "video/gl"
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7cf0: 20 7b 20 22 67 74 61 72 22 2c 20 20 20 20 20 20   { "gtar",      
7d00: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
7d10: 2f 78 2d 67 74 61 72 22 20 20 20 20 20 20 20 20  /x-gtar"        
7d20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7d30: 20 22 67 7a 22 2c 20 20 20 20 20 20 20 20 20 32   "gz",         2
7d40: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
7d50: 2d 67 7a 69 70 22 20 20 20 20 20 20 20 20 20 20  -gzip"          
7d60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7d70: 68 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  hdf",        3, 
7d80: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 68  "application/x-h
7d90: 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  df"             
7da0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 68      },.    { "hh
7db0: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 74  ",         2, "t
7dc0: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7de0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 71 78 22    },.    { "hqx"
7df0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7e00: 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d 62 69 6e  lication/mac-bin
7e10: 68 65 78 34 30 22 20 20 20 20 20 20 20 20 20 20  hex40"          
7e20: 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c 20 20 20  },.    { "h",   
7e30: 20 20 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f         1, "text/
7e40: 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20 20  plain"          
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7e60: 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c 20 20 20  .    { "htm",   
7e70: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 68 74       3, "text/ht
7e80: 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d  ml; charset=utf-
7e90: 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  8"          },. 
7ea0: 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20 20 20 20     { "html",    
7eb0: 20 20 20 34 2c 20 22 74 65 78 74 2f 68 74 6d 6c     4, "text/html
7ec0: 3b 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 22  ; charset=utf-8"
7ed0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7ee0: 20 7b 20 22 69 63 65 22 2c 20 20 20 20 20 20 20   { "ice",       
7ef0: 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72 65 6e 63   3, "x-conferenc
7f00: 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22 20 20 20  e/x-cooltalk"   
7f10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7f20: 20 22 69 65 66 22 2c 20 20 20 20 20 20 20 20 33   "ief",        3
7f30: 2c 20 22 69 6d 61 67 65 2f 69 65 66 22 20 20 20  , "image/ief"   
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7f60: 69 67 65 73 22 2c 20 20 20 20 20 20 20 34 2c 20  iges",       4, 
7f70: 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20  "model/iges"    
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 67      },.    { "ig
7fa0: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  s",        3, "m
7fb0: 6f 64 65 6c 2f 69 67 65 73 22 20 20 20 20 20 20  odel/iges"      
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 73 22    },.    { "ips"
7fe0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7ff0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 73 63 72  lication/x-ipscr
8000: 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ipt"            
8010: 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78 22 2c 20  },.    { "ipx", 
8020: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8030: 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78 22 20 20  cation/x-ipix"  
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8050: 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c 20 20 20  .    { "jad",   
8060: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 76 6e       3, "text/vn
8070: 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70 70 2d 64  d.sun.j2me.app-d
8080: 65 73 63 72 69 70 74 6f 72 22 20 20 7d 2c 0a 20  escriptor"  },. 
8090: 20 20 20 7b 20 22 6a 61 72 22 2c 20 20 20 20 20     { "jar",     
80a0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
80b0: 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69 76 65 22  on/java-archive"
80c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
80d0: 20 7b 20 22 6a 70 65 67 22 2c 20 20 20 20 20 20   { "jpeg",      
80e0: 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22   4, "image/jpeg"
80f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8100: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8110: 20 22 6a 70 65 22 2c 20 20 20 20 20 20 20 20 33   "jpe",        3
8120: 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20  , "image/jpeg"  
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8150: 6a 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  jpg",        3, 
8160: 22 69 6d 61 67 65 2f 6a 70 65 67 22 20 20 20 20  "image/jpeg"    
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
8190: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
81a0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6a 61 76  pplication/x-jav
81b0: 61 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  ascript"        
81c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b 61 72 22    },.    { "kar"
81d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
81e0: 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20  io/midi"        
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74 65 78 22  },.    { "latex"
8210: 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69  ,      5, "appli
8220: 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65 78 22 20  cation/x-latex" 
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8240: 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c 20 20 20  .    { "lha",   
8250: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8260: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
8270: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
8280: 20 20 20 7b 20 22 6c 73 70 22 2c 20 20 20 20 20     { "lsp",     
8290: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
82a0: 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20 20 20 20  on/x-lisp"      
82b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
82c0: 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20 20 20 20   { "lzh",       
82d0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
82e0: 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 20 20  /octet-stream"  
82f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8300: 20 22 6d 22 2c 20 20 20 20 20 20 20 20 20 20 31   "m",          1
8310: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8340: 6d 33 75 22 2c 20 20 20 20 20 20 20 20 33 2c 20  m3u",        3, 
8350: 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67 75 72 6c  "audio/x-mpegurl
8360: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8370: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 61      },.    { "ma
8380: 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  n",        3, "a
8390: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
83a0: 66 66 2d 6d 61 6e 22 20 20 20 20 20 20 20 20 20  ff-man"         
83b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 22 2c    },.    { "me",
83c0: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
83d0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f 66 66  lication/x-troff
83e0: 2d 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20  -me"            
83f0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73 68 22 2c  },.    { "mesh",
8400: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
8410: 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20 20  /mesh"          
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8430: 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c 20 20 20  .    { "mid",   
8440: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d       3, "audio/m
8450: 69 64 69 22 20 20 20 20 20 20 20 20 20 20 20 20  idi"            
8460: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8470: 20 20 20 7b 20 22 6d 69 64 69 22 2c 20 20 20 20     { "midi",    
8480: 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 69 64     4, "audio/mid
8490: 69 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i"              
84a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
84b0: 20 7b 20 22 6d 69 66 22 2c 20 20 20 20 20 20 20   { "mif",       
84c0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
84d0: 2f 78 2d 6d 69 66 22 20 20 20 20 20 20 20 20 20  /x-mif"         
84e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
84f0: 20 22 6d 69 6d 65 22 2c 20 20 20 20 20 20 20 34   "mime",       4
8500: 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20 20 20 20  , "www/mime"    
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8530: 6d 6f 76 69 65 22 2c 20 20 20 20 20 20 35 2c 20  movie",      5, 
8540: 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d 6d 6f 76  "video/x-sgi-mov
8550: 69 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ie"             
8560: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 6f      },.    { "mo
8570: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
8580: 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20  ideo/quicktime" 
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22    },.    { "mp2"
85b0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
85c0: 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  io/mpeg"        
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32 22 2c 20  },.    { "mp2", 
85f0: 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f         3, "video
8600: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8620: 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c 20 20 20  .    { "mp3",   
8630: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 6d       3, "audio/m
8640: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
8650: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8660: 20 20 20 7b 20 22 6d 70 65 67 22 2c 20 20 20 20     { "mpeg",    
8670: 20 20 20 34 2c 20 22 76 69 64 65 6f 2f 6d 70 65     4, "video/mpe
8680: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
8690: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
86a0: 20 7b 20 22 6d 70 65 22 2c 20 20 20 20 20 20 20   { "mpe",       
86b0: 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22   3, "video/mpeg"
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
86e0: 20 22 6d 70 67 61 22 2c 20 20 20 20 20 20 20 34   "mpga",       4
86f0: 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20  , "audio/mpeg"  
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8720: 6d 70 67 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mpg",        3, 
8730: 22 76 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20  "video/mpeg"    
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73      },.    { "ms
8760: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
8770: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
8780: 66 66 2d 6d 73 22 20 20 20 20 20 20 20 20 20 20  ff-ms"          
8790: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 73 68 22    },.    { "msh"
87a0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64  ,        3, "mod
87b0: 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20  el/mesh"        
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22 2c 20 20  },.    { "nc",  
87e0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
87f0: 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63 64 66 22  cation/x-netcdf"
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8810: 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c 20 20 20  .    { "oda",   
8820: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8830: 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20 20 20 20  tion/oda"       
8840: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8850: 20 20 20 7b 20 22 6f 67 67 22 2c 20 20 20 20 20     { "ogg",     
8860: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8870: 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20  on/ogg"         
8880: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8890: 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20 20 20 20   { "ogm",       
88a0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
88b0: 2f 6f 67 67 22 20 20 20 20 20 20 20 20 20 20 20  /ogg"           
88c0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
88d0: 20 22 70 62 6d 22 2c 20 20 20 20 20 20 20 20 33   "pbm",        3
88e0: 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61  , "image/x-porta
88f0: 62 6c 65 2d 62 69 74 6d 61 70 22 20 20 20 20 20  ble-bitmap"     
8900: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8910: 70 64 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pdb",        3, 
8920: 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70 64 62 22  "chemical/x-pdb"
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 64      },.    { "pd
8950: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
8960: 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64 66 22 20  pplication/pdf" 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6d 22    },.    { "pgm"
8990: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
89a0: 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 67 72  ge/x-portable-gr
89b0: 61 79 6d 61 70 22 20 20 20 20 20 20 20 20 20 20  aymap"          
89c0: 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e 22 2c 20  },.    { "pgn", 
89d0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
89e0: 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73 73 2d 70  cation/x-chess-p
89f0: 67 6e 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c  gn"           },
8a00: 0a 20 20 20 20 7b 20 22 70 67 70 22 2c 20 20 20  .    { "pgp",   
8a10: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8a20: 74 69 6f 6e 2f 70 67 70 22 20 20 20 20 20 20 20  tion/pgp"       
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8a40: 20 20 20 7b 20 22 70 6c 22 2c 20 20 20 20 20 20     { "pl",      
8a50: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
8a60: 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20  on/x-perl"      
8a70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8a80: 20 7b 20 22 70 6d 22 2c 20 20 20 20 20 20 20 20   { "pm",        
8a90: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
8aa0: 2f 78 2d 70 65 72 6c 22 20 20 20 20 20 20 20 20  /x-perl"        
8ab0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8ac0: 20 22 70 6e 67 22 2c 20 20 20 20 20 20 20 20 33   "png",        3
8ad0: 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22 20 20 20  , "image/png"   
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8b00: 70 6e 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pnm",        3, 
8b10: 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c  "image/x-portabl
8b20: 65 2d 61 6e 79 6d 61 70 22 20 20 20 20 20 20 20  e-anymap"       
8b30: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 6f      },.    { "po
8b40: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
8b50: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
8b60: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
8b70: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 6d 22    },.    { "ppm"
8b80: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
8b90: 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65 2d 70 69  ge/x-portable-pi
8ba0: 78 6d 61 70 22 20 20 20 20 20 20 20 20 20 20 20  xmap"           
8bb0: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73 22 2c 20  },.    { "pps", 
8bc0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8bd0: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
8be0: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
8bf0: 0a 20 20 20 20 7b 20 22 70 70 74 22 2c 20 20 20  .    { "ppt",   
8c00: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8c10: 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e  tion/mspowerpoin
8c20: 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t"          },. 
8c30: 20 20 20 7b 20 22 70 70 7a 22 2c 20 20 20 20 20     { "ppz",     
8c40: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8c50: 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69 6e 74 22  on/mspowerpoint"
8c60: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8c70: 20 7b 20 22 70 72 65 22 2c 20 20 20 20 20 20 20   { "pre",       
8c80: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
8c90: 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22 20 20 20  /x-freelance"   
8ca0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8cb0: 20 22 70 72 74 22 2c 20 20 20 20 20 20 20 20 33   "prt",        3
8cc0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
8cd0: 72 6f 5f 65 6e 67 22 20 20 20 20 20 20 20 20 20  ro_eng"         
8ce0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8cf0: 70 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ps",         2, 
8d00: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f 73  "application/pos
8d10: 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  tscript"        
8d20: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 74      },.    { "qt
8d30: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 76  ",         2, "v
8d40: 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d 65 22 20  ideo/quicktime" 
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 22 2c    },.    { "ra",
8d70: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 75 64           2, "aud
8d80: 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69 6f 22 20  io/x-realaudio" 
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d 22 2c 20  },.    { "ram", 
8db0: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
8dc0: 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69 6f 22  /x-pn-realaudio"
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8de0: 0a 20 20 20 20 7b 20 22 72 61 72 22 2c 20 20 20  .    { "rar",   
8df0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8e00: 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f 6d 70 72  tion/x-rar-compr
8e10: 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a 20  essed"      },. 
8e20: 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20     { "ras",     
8e30: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 63 6d 75     3, "image/cmu
8e40: 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20 20  -raster"        
8e50: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8e60: 20 7b 20 22 72 61 73 22 2c 20 20 20 20 20 20 20   { "ras",       
8e70: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 63 6d 75   3, "image/x-cmu
8e80: 2d 72 61 73 74 65 72 22 20 20 20 20 20 20 20 20  -raster"        
8e90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8ea0: 20 22 72 67 62 22 2c 20 20 20 20 20 20 20 20 33   "rgb",        3
8eb0: 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67 62 22 20  , "image/x-rgb" 
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8ee0: 72 6d 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  rm",         2, 
8ef0: 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c  "audio/x-pn-real
8f00: 61 75 64 69 6f 22 20 20 20 20 20 20 20 20 20 20  audio"          
8f10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 6f      },.    { "ro
8f20: 66 66 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ff",       4, "a
8f30: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72 6f  pplication/x-tro
8f40: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
8f50: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 70 6d 22    },.    { "rpm"
8f60: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
8f70: 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64 69  io/x-pn-realaudi
8f80: 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20 20 20 20  o-plugin"       
8f90: 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20  },.    { "rtf", 
8fa0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8fb0: 63 61 74 69 6f 6e 2f 72 74 66 22 20 20 20 20 20  cation/rtf"     
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8fd0: 0a 20 20 20 20 7b 20 22 72 74 66 22 2c 20 20 20  .    { "rtf",   
8fe0: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72 74       3, "text/rt
8ff0: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
9000: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9010: 20 20 20 7b 20 22 72 74 78 22 2c 20 20 20 20 20     { "rtx",     
9020: 20 20 20 33 2c 20 22 74 65 78 74 2f 72 69 63 68     3, "text/rich
9030: 74 65 78 74 22 20 20 20 20 20 20 20 20 20 20 20  text"           
9040: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9050: 20 7b 20 22 73 63 6d 22 2c 20 20 20 20 20 20 20   { "scm",       
9060: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9070: 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65 6e 63 61  /x-lotusscreenca
9080: 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  m"      },.    {
9090: 20 22 73 65 74 22 2c 20 20 20 20 20 20 20 20 33   "set",        3
90a0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73  , "application/s
90b0: 65 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20  et"             
90c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
90d0: 73 67 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20  sgml",       4, 
90e0: 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20  "text/sgml"     
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9100: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 67      },.    { "sg
9110: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  m",        3, "t
9120: 65 78 74 2f 73 67 6d 6c 22 20 20 20 20 20 20 20  ext/sgml"       
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 22 2c    },.    { "sh",
9150: 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70 70           2, "app
9160: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 22 20 20  lication/x-sh"  
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61 72 22 2c  },.    { "shar",
9190: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
91a0: 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72 22 20 20  cation/x-shar"  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
91c0: 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22 2c 20 20  .    { "silo",  
91d0: 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c 2f 6d       4, "model/m
91e0: 65 73 68 22 20 20 20 20 20 20 20 20 20 20 20 20  esh"            
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9200: 20 20 20 7b 20 22 73 69 74 22 2c 20 20 20 20 20     { "sit",     
9210: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9220: 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22 20 20 20  on/x-stuffit"   
9230: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9240: 20 7b 20 22 73 6b 64 22 2c 20 20 20 20 20 20 20   { "skd",       
9250: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9260: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
9270: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9280: 20 22 73 6b 6d 22 2c 20 20 20 20 20 20 20 20 33   "skm",        3
9290: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
92a0: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
92b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
92c0: 73 6b 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  skp",        3, 
92d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b  "application/x-k
92e0: 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  oan"            
92f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6b      },.    { "sk
9300: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
9310: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6b 6f 61  pplication/x-koa
9320: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
9330: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 22    },.    { "smi"
9340: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9350: 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20  lication/smil"  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69 6c 22 2c  },.    { "smil",
9380: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
9390: 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20 20 20 20  cation/smil"    
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
93b0: 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c 20 20 20  .    { "snd",   
93c0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 62       3, "audio/b
93d0: 61 73 69 63 22 20 20 20 20 20 20 20 20 20 20 20  asic"           
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
93f0: 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20 20 20 20     { "sol",     
9400: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9410: 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20 20 20 20  on/solids"      
9420: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9430: 20 7b 20 22 73 70 6c 22 2c 20 20 20 20 20 20 20   { "spl",       
9440: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9450: 2f 78 2d 66 75 74 75 72 65 73 70 6c 61 73 68 22  /x-futuresplash"
9460: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9470: 20 22 73 72 63 22 2c 20 20 20 20 20 20 20 20 33   "src",        3
9480: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
9490: 2d 77 61 69 73 2d 73 6f 75 72 63 65 22 20 20 20  -wais-source"   
94a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
94b0: 73 74 65 70 22 2c 20 20 20 20 20 20 20 34 2c 20  step",       4, 
94c0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45  "application/STE
94d0: 50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P"              
94e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
94f0: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
9500: 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c 41 22 20  pplication/SLA" 
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 70 22    },.    { "stp"
9530: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9540: 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50 22 20 20  lication/STEP"  
9550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9560: 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 70 69  },.    { "sv4cpi
9570: 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c 69  o",    7, "appli
9580: 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 70 69 6f  cation/x-sv4cpio
9590: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
95a0: 0a 20 20 20 20 7b 20 22 73 76 34 63 72 63 22 2c  .    { "sv4crc",
95b0: 20 20 20 20 20 36 2c 20 22 61 70 70 6c 69 63 61       6, "applica
95c0: 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63 22 20 20  tion/x-sv4crc"  
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
95e0: 20 20 20 7b 20 22 73 76 67 22 2c 20 20 20 20 20     { "svg",     
95f0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 73 76 67     3, "image/svg
9600: 2b 78 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20  +xml"           
9610: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9620: 20 7b 20 22 73 77 66 22 2c 20 20 20 20 20 20 20   { "swf",       
9630: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9640: 2f 78 2d 73 68 6f 63 6b 77 61 76 65 2d 66 6c 61  /x-shockwave-fla
9650: 73 68 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  sh"     },.    {
9660: 20 22 74 22 2c 20 20 20 20 20 20 20 20 20 20 31   "t",          1
9670: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
9680: 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20 20  -troff"         
9690: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
96a0: 74 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tar",        3, 
96b0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
96c0: 61 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ar"             
96d0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 63      },.    { "tc
96e0: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  l",        3, "a
96f0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 63 6c  pplication/x-tcl
9700: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9710: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 22    },.    { "tex"
9720: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9730: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 22 20  lication/x-tex" 
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69 22 2c  },.    { "texi",
9760: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
9770: 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f  cation/x-texinfo
9780: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
9790: 0a 20 20 20 20 7b 20 22 74 65 78 69 6e 66 6f 22  .    { "texinfo"
97a0: 2c 20 20 20 20 37 2c 20 22 61 70 70 6c 69 63 61  ,    7, "applica
97b0: 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66 6f 22 20  tion/x-texinfo" 
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
97d0: 20 20 20 7b 20 22 74 67 7a 22 2c 20 20 20 20 20     { "tgz",     
97e0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
97f0: 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22 20 20 20 20  on/x-tar-gz"    
9800: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9810: 20 7b 20 22 74 69 66 66 22 2c 20 20 20 20 20 20   { "tiff",      
9820: 20 34 2c 20 22 69 6d 61 67 65 2f 74 69 66 66 22   4, "image/tiff"
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9850: 20 22 74 69 66 22 2c 20 20 20 20 20 20 20 20 33   "tif",        3
9860: 2c 20 22 69 6d 61 67 65 2f 74 69 66 66 22 20 20  , "image/tiff"  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9890: 74 72 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  tr",         2, 
98a0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
98b0: 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20 20  roff"           
98c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
98d0: 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  i",        3, "a
98e0: 75 64 69 6f 2f 54 53 50 2d 61 75 64 69 6f 22 20  udio/TSP-audio" 
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 70 22    },.    { "tsp"
9910: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9920: 6c 69 63 61 74 69 6f 6e 2f 64 73 70 74 79 70 65  lication/dsptype
9930: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9940: 7d 2c 0a 20 20 20 20 7b 20 22 74 73 76 22 2c 20  },.    { "tsv", 
9950: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
9960: 74 61 62 2d 73 65 70 61 72 61 74 65 64 2d 76 61  tab-separated-va
9970: 6c 75 65 73 22 20 20 20 20 20 20 20 20 20 7d 2c  lues"         },
9980: 0a 20 20 20 20 7b 20 22 74 78 74 22 2c 20 20 20  .    { "txt",   
9990: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c       3, "text/pl
99a0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
99c0: 20 20 20 7b 20 22 75 6e 76 22 2c 20 20 20 20 20     { "unv",     
99d0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
99e0: 6f 6e 2f 69 2d 64 65 61 73 22 20 20 20 20 20 20  on/i-deas"      
99f0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9a00: 20 7b 20 22 75 73 74 61 72 22 2c 20 20 20 20 20   { "ustar",     
9a10: 20 35 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   5, "application
9a20: 2f 78 2d 75 73 74 61 72 22 20 20 20 20 20 20 20  /x-ustar"       
9a30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9a40: 20 22 76 63 64 22 2c 20 20 20 20 20 20 20 20 33   "vcd",        3
9a50: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
9a60: 2d 63 64 6c 69 6e 6b 22 20 20 20 20 20 20 20 20  -cdlink"        
9a70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9a80: 76 64 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  vda",        3, 
9a90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 64 61  "application/vda
9aa0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69      },.    { "vi
9ac0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
9ad0: 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20  ideo/vnd.vivo"  
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 69 76 6f    },.    { "vivo
9b00: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 76 69 64  ",       4, "vid
9b10: 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20 20 20 20  eo/vnd.vivo"    
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 7d 2c 0a 20 20 20 20 7b 20 22 76 72 6d 6c 22 2c  },.    { "vrml",
9b40: 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65 6c         4, "model
9b50: 2f 76 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20  /vrml"          
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9b70: 0a 20 20 20 20 7b 20 22 76 73 69 78 22 2c 20 20  .    { "vsix",  
9b80: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
9b90: 74 69 6f 6e 2f 76 73 69 78 22 20 20 20 20 20 20  tion/vsix"      
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9bb0: 20 20 20 7b 20 22 77 61 76 22 2c 20 20 20 20 20     { "wav",     
9bc0: 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 77     3, "audio/x-w
9bd0: 61 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20  av"             
9be0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9bf0: 20 7b 20 22 77 61 78 22 2c 20 20 20 20 20 20 20   { "wax",       
9c00: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d   3, "audio/x-ms-
9c10: 77 61 78 22 20 20 20 20 20 20 20 20 20 20 20 20  wax"            
9c20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9c30: 20 22 77 69 6b 69 22 2c 20 20 20 20 20 20 20 34   "wiki",       4
9c40: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
9c50: 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22 20 20 20  -fossil-wiki"   
9c60: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9c70: 77 6d 61 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wma",        3, 
9c80: 22 61 75 64 69 6f 2f 78 2d 6d 73 2d 77 6d 61 22  "audio/x-ms-wma"
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d      },.    { "wm
9cb0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
9cc0: 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 76 22 20 20  ideo/x-ms-wmv"  
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 6d 78 22    },.    { "wmx"
9cf0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
9d00: 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22 20 20 20 20  eo/x-ms-wmx"    
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 7d 2c 0a 20 20 20 20 7b 20 22 77 72 6c 22 2c 20  },.    { "wrl", 
9d30: 20 20 20 20 20 20 20 33 2c 20 22 6d 6f 64 65 6c         3, "model
9d40: 2f 76 72 6d 6c 22 20 20 20 20 20 20 20 20 20 20  /vrml"          
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9d60: 0a 20 20 20 20 7b 20 22 77 76 78 22 2c 20 20 20  .    { "wvx",   
9d70: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78       3, "video/x
9d80: 2d 6d 73 2d 77 76 78 22 20 20 20 20 20 20 20 20  -ms-wvx"        
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9da0: 20 20 20 7b 20 22 78 62 6d 22 2c 20 20 20 20 20     { "xbm",     
9db0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78     3, "image/x-x
9dc0: 62 69 74 6d 61 70 22 20 20 20 20 20 20 20 20 20  bitmap"         
9dd0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9de0: 20 7b 20 22 78 6c 63 22 2c 20 20 20 20 20 20 20   { "xlc",       
9df0: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9e00: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
9e10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9e20: 20 22 78 6c 6c 22 2c 20 20 20 20 20 20 20 20 33   "xll",        3
9e30: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
9e40: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
9e50: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9e60: 78 6c 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xlm",        3, 
9e70: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
9e80: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
9e90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c      },.    { "xl
9ea0: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
9eb0: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d  pplication/vnd.m
9ec0: 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20 20  s-excel"        
9ed0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6c 77 22    },.    { "xlw"
9ee0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
9ef0: 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d  lication/vnd.ms-
9f00: 65 78 63 65 6c 22 20 20 20 20 20 20 20 20 20 20  excel"          
9f10: 7d 2c 0a 20 20 20 20 7b 20 22 78 6d 6c 22 2c 20  },.    { "xml", 
9f20: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
9f30: 78 6d 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  xml"            
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9f50: 0a 20 20 20 20 7b 20 22 78 70 6d 22 2c 20 20 20  .    { "xpm",   
9f60: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
9f70: 2d 78 70 69 78 6d 61 70 22 20 20 20 20 20 20 20  -xpixmap"       
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9f90: 20 20 20 7b 20 22 78 77 64 22 2c 20 20 20 20 20     { "xwd",     
9fa0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 78     3, "image/x-x
9fb0: 77 69 6e 64 6f 77 64 75 6d 70 22 20 20 20 20 20  windowdump"     
9fc0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9fd0: 20 7b 20 22 78 79 7a 22 2c 20 20 20 20 20 20 20   { "xyz",       
9fe0: 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d   3, "chemical/x-
9ff0: 70 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20  pdb"            
a000: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
a010: 20 22 7a 69 70 22 2c 20 20 20 20 20 20 20 20 33   "zip",        3
a020: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 7a  , "application/z
a030: 69 70 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ip"             
a040: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20        },.  };.. 
a050: 20 66 6f 72 28 69 3d 6e 4e 61 6d 65 2d 31 3b 20   for(i=nName-1; 
a060: 69 3e 30 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i>0 && zName[i]!
a070: 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  ='.'; i--){}.  z
a080: 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b 31 5d 3b 0a   = &zName[i+1];.
a090: 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d 65 20 2d 20    len = nName - 
a0a0: 69 3b 0a 20 20 69 66 28 20 6c 65 6e 3c 28 69 6e  i;.  if( len<(in
a0b0: 74 29 73 69 7a 65 6f 66 28 7a 53 75 66 66 69 78  t)sizeof(zSuffix
a0c0: 29 2d 31 20 29 7b 0a 20 20 20 20 73 74 72 63 70  )-1 ){.    strcp
a0d0: 79 28 7a 53 75 66 66 69 78 2c 20 7a 29 3b 0a 20  y(zSuffix, z);. 
a0e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 53 75 66     for(i=0; zSuf
a0f0: 66 69 78 5b 69 5d 3b 20 69 2b 2b 29 20 7a 53 75  fix[i]; i++) zSu
a100: 66 66 69 78 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65  ffix[i] = tolowe
a110: 72 28 7a 53 75 66 66 69 78 5b 69 5d 29 3b 0a 20  r(zSuffix[i]);. 
a120: 20 20 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20     first = 0;.  
a130: 20 20 6c 61 73 74 20 3d 20 73 69 7a 65 6f 66 28    last = sizeof(
a140: 61 4d 69 6d 65 29 2f 73 69 7a 65 6f 66 28 61 4d  aMime)/sizeof(aM
a150: 69 6d 65 5b 30 5d 29 3b 0a 20 20 20 20 77 68 69  ime[0]);.    whi
a160: 6c 65 28 20 66 69 72 73 74 3c 3d 6c 61 73 74 20  le( first<=last 
a170: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  ){.      int c;.
a180: 20 20 20 20 20 20 69 20 3d 20 28 66 69 72 73 74        i = (first
a190: 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20 20 20 20  +last)/2;.      
a1a0: 63 20 3d 20 73 74 72 63 6d 70 28 7a 53 75 66 66  c = strcmp(zSuff
a1b0: 69 78 2c 20 61 4d 69 6d 65 5b 69 5d 2e 7a 53 75  ix, aMime[i].zSu
a1c0: 66 66 69 78 29 3b 0a 20 20 20 20 20 20 69 66 28  ffix);.      if(
a1d0: 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61   c==0 ) return a
a1e0: 4d 69 6d 65 5b 69 5d 2e 7a 4d 69 6d 65 74 79 70  Mime[i].zMimetyp
a1f0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30  e;.      if( c<0
a200: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
a210: 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 7d 65   = i-1;.      }e
a220: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 69 72  lse{.        fir
a230: 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  st = i+1;.      
a240: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
a250: 74 75 72 6e 20 22 61 70 70 6c 69 63 61 74 69 6f  turn "applicatio
a260: 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d 22 3b  n/octet-stream";
a270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
a280: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 63 6f  llowing table co
a290: 6e 74 61 69 6e 73 20 31 20 66 6f 72 20 61 6c 6c  ntains 1 for all
a2a0: 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
a2b0: 20 61 72 65 20 70 65 72 6d 69 74 74 65 64 20 69   are permitted i
a2c0: 6e 0a 2a 2a 20 74 68 65 20 70 61 72 74 20 6f 66  n.** the part of
a2d0: 20 74 68 65 20 55 52 4c 20 62 65 66 6f 72 65 20   the URL before 
a2e0: 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
a2f0: 74 65 72 73 20 61 6e 64 20 66 72 61 67 6d 65 6e  ters and fragmen
a300: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  t..**.** Allowed
a310: 20 63 68 61 72 61 63 74 65 72 73 3a 20 20 30 2d   characters:  0-
a320: 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f 7e 0a 2a  9a-zA-Z,-./:_~.*
a330: 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f 77 65 64 20  *.** Disallowed 
a340: 63 68 61 72 61 63 74 65 72 73 20 69 6e 63 6c 75  characters inclu
a350: 64 65 3a 20 20 21 22 23 24 25 26 27 28 29 2a 2b  de:  !"#$%&'()*+
a360: 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d 0a 2a 2f 0a  ;<=>?[\]^{|}.*/.
a370: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
a380: 72 20 61 6c 6c 6f 77 65 64 49 6e 4e 61 6d 65 5b  r allowedInName[
a390: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 2f 2a 20 20  ] = {.      /*  
a3a0: 78 30 20 20 78 31 20 20 78 32 20 20 78 33 20 20  x0  x1  x2  x3  
a3b0: 78 34 20 20 78 35 20 20 78 36 20 20 78 37 20 20  x4  x5  x6  x7  
a3c0: 78 38 20 20 78 39 20 20 78 61 20 20 78 62 20 20  x8  x9  xa  xb  
a3d0: 78 63 20 20 78 64 20 20 78 65 20 20 78 66 20 2a  xc  xd  xe  xf *
a3e0: 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20 20 30 2c 20  /./* 0x */   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 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 31   0,  0,  0,./* 1
a430: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   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 20 20 30  ,  0,  0,  0,  0
a470: 2c 20 20 30 2c 0a 2f 2a 20 32 78 20 2a 2f 20 20  ,  0,./* 2x */  
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 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a4b0: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 0a   1,  1,  1,  1,.
a4c0: 2f 2a 20 33 78 20 2a 2f 20 20 20 31 2c 20 20 31  /* 3x */   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 31  ,  1,  1,  1,  1
a4f0: 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  1,  0,  0,  0
a500: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 34 78 20  ,  0,  0,./* 4x 
a510: 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 31 2c 20  */   0,  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 20 20 31 2c 20   1,  1,  1,  1, 
a550: 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f 20 20 20 31   1,./* 5x */   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 31 2c 20 20 31 2c 20 20 30 2c 20 20 30  ,  1,  1,  0,  0
a590: 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 0a 2f 2a  ,  0,  0,  1,./*
a5a0: 20 36 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20   6x */   0,  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 20   1,  1,  1,  1, 
a5e0: 20 31 2c 20 20 31 2c 0a 2f 2a 20 37 78 20 2a 2f   1,  1,./* 7x */
a5f0: 20 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 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
a620: 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 30  ,  0,  0,  1,  0
a630: 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20 20 30 2c 20  ,./* 8x */   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 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 39   0,  0,  0,./* 9
a680: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   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 20 20 30  ,  0,  0,  0,  0
a6c0: 2c 20 20 30 2c 0a 2f 2a 20 41 78 20 2a 2f 20 20  ,  0,./* Ax */  
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 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
a710: 2f 2a 20 42 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* Bx */   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 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 43 78 20  ,  0,  0,./* Cx 
a760: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   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 20 20 30 2c 20   0,  0,  0,  0, 
a7a0: 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f 20 20 20 30   0,./* Dx */   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 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
a7f0: 20 45 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   Ex */   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 20   0,  0,  0,  0, 
a830: 20 30 2c 20 20 30 2c 0a 2f 2a 20 46 78 20 2a 2f   0,  0,./* Fx */
a840: 20 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 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a880: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  ,.};../*.** Remo
a890: 76 65 20 61 6c 6c 20 64 69 73 61 6c 6c 6f 77 65  ve all disallowe
a8a0: 64 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  d characters in 
a8b0: 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
a8c0: 20 7a 5b 5d 2e 20 20 43 6f 6e 76 65 72 74 20 61   z[].  Convert a
a8d0: 6e 79 0a 2a 2a 20 64 69 73 61 6c 6c 6f 77 65 64  ny.** disallowed
a8e0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
a8f0: 20 22 5f 22 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20   "_"..**.** Not 
a900: 74 68 61 74 20 74 68 65 20 74 68 72 65 65 20 63  that the three c
a910: 68 61 72 61 63 74 65 72 20 73 65 71 75 65 6e 63  haracter sequenc
a920: 65 20 22 25 58 58 22 20 77 68 65 72 65 20 58 20  e "%XX" where X 
a930: 69 73 20 61 6e 79 20 62 79 74 65 20 69 73 0a 2a  is any byte is.*
a940: 2a 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  * converted into
a950: 20 61 20 73 69 6e 67 6c 65 20 22 5f 22 20 63 68   a single "_" ch
a960: 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52  aracter..**.** R
a970: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
a980: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 63   of characters c
a990: 6f 6e 76 65 72 74 65 64 2e 20 20 41 6e 20 22 25  onverted.  An "%
a9a0: 58 58 22 20 2d 3e 20 22 5f 22 20 63 6f 6e 76 65  XX" -> "_" conve
a9b0: 72 73 69 6f 6e 0a 2a 2a 20 63 6f 75 6e 74 73 20  rsion.** counts 
a9c0: 61 73 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  as a single char
a9d0: 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
a9e0: 20 69 6e 74 20 73 61 6e 69 74 69 7a 65 53 74 72   int sanitizeStr
a9f0: 69 6e 67 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ing(char *z){.  
aa00: 69 6e 74 20 6e 43 68 61 6e 67 65 20 3d 20 30 3b  int nChange = 0;
aa10: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a  .  while( *z ){.
aa20: 20 20 20 20 69 66 28 20 21 61 6c 6c 6f 77 65 64      if( !allowed
aa30: 49 6e 4e 61 6d 65 5b 2a 28 75 6e 73 69 67 6e 65  InName[*(unsigne
aa40: 64 20 63 68 61 72 2a 29 7a 5d 20 29 7b 0a 20 20  d char*)z] ){.  
aa50: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 25 27 20      if( *z=='%' 
aa60: 26 26 20 7a 5b 31 5d 21 3d 30 20 26 26 20 7a 5b  && z[1]!=0 && z[
aa70: 32 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2]!=0 ){.       
aa80: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
aa90: 66 6f 72 28 69 3d 33 3b 20 28 7a 5b 69 2d 32 5d  for(i=3; (z[i-2]
aaa0: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
aab0: 29 7b 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ){}.      }.    
aac0: 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20 20 20 20    *z = '_';.    
aad0: 20 20 6e 43 68 61 6e 67 65 2b 2b 3b 0a 20 20 20    nChange++;.   
aae0: 20 7d 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a   }.    z++;.  }.
aaf0: 20 20 72 65 74 75 72 6e 20 6e 43 68 61 6e 67 65    return nChange
ab00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  ;.}../*.** Count
ab10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
ab20: 2f 22 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  /" characters in
ab30: 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74   a string..*/.st
ab40: 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 53 6c  atic int countSl
ab50: 61 73 68 65 73 28 63 6f 6e 73 74 20 63 68 61 72  ashes(const char
ab60: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20   *z){.  int n = 
ab70: 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  0;.  while( *z )
ab80: 20 69 66 28 20 2a 28 7a 2b 2b 29 3d 3d 27 2f 27   if( *(z++)=='/'
ab90: 20 29 20 6e 2b 2b 3b 0a 20 20 72 65 74 75 72 6e   ) n++;.  return
aba0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   n;.}../*.** Thi
abb0: 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73  s routine proces
abc0: 73 65 73 20 61 20 73 69 6e 67 6c 65 20 48 54 54  ses a single HTT
abd0: 50 20 72 65 71 75 65 73 74 20 6f 6e 20 73 74 61  P request on sta
abe0: 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e 64 0a  ndard input and.
abf0: 2a 2a 20 73 65 6e 64 73 20 74 68 65 20 72 65 70  ** sends the rep
ac00: 6c 79 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ly to standard o
ac10: 75 74 70 75 74 2e 20 20 49 66 20 74 68 65 20 61  utput.  If the a
ac20: 72 67 75 6d 65 6e 74 20 69 73 20 31 20 69 74 20  rgument is 1 it 
ac30: 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65  means.** that we
ac40: 20 61 72 65 20 73 68 6f 75 6c 64 20 63 6c 6f 73   are should clos
ac50: 65 20 74 68 65 20 73 6f 63 6b 65 74 20 77 69 74  e the socket wit
ac60: 68 6f 75 74 20 70 72 6f 63 65 73 73 69 6e 67 20  hout processing 
ac70: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 48 54  additional.** HT
ac80: 54 50 20 72 65 71 75 65 73 74 73 20 61 66 74 65  TP requests afte
ac90: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  r the current re
aca0: 71 75 65 73 74 20 66 69 6e 69 73 68 65 73 2e 20  quest finishes. 
acb0: 20 30 20 6d 65 61 6e 73 20 77 65 20 61 72 65 0a   0 means we are.
acc0: 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 65  ** allowed to ke
acd0: 65 70 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ep the connectio
ace0: 6e 20 6f 70 65 6e 20 61 6e 64 20 74 6f 20 70 72  n open and to pr
acf0: 6f 63 65 73 73 20 61 64 64 69 74 69 6f 6e 61 6c  ocess additional
ad00: 20 72 65 71 75 65 73 74 73 2e 0a 2a 2a 20 54 68   requests..** Th
ad10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 63  is routine may c
ad20: 68 6f 6f 73 65 20 74 6f 20 63 6c 6f 73 65 20 74  hoose to close t
ad30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 65 76  he connection ev
ad40: 65 6e 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  en if the argume
ad50: 6e 74 0a 2a 2a 20 69 73 20 30 2e 0a 2a 2a 20 0a  nt.** is 0..** .
ad60: 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63  ** If the connec
ad70: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
ad80: 6c 6f 73 65 64 2c 20 74 68 69 73 20 72 6f 75 74  losed, this rout
ad90: 69 6e 65 20 63 61 6c 6c 73 20 65 78 69 74 28 29  ine calls exit()
ada0: 20 61 6e 64 0a 2a 2a 20 74 68 75 73 20 6e 65 76   and.** thus nev
adb0: 65 72 20 72 65 74 75 72 6e 73 2e 20 20 49 66 20  er returns.  If 
adc0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  this routine doe
add0: 73 20 72 65 74 75 72 6e 20 69 74 20 6d 65 61 6e  s return it mean
ade0: 73 20 74 68 61 74 20 61 6e 6f 74 68 65 72 0a 2a  s that another.*
adf0: 2a 20 48 54 54 50 20 72 65 71 75 65 73 74 20 6d  * HTTP request m
ae00: 61 79 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ay appear on the
ae10: 20 77 69 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 50   wire..*/.void P
ae20: 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74  rocessOneRequest
ae30: 28 69 6e 74 20 66 6f 72 63 65 43 6c 6f 73 65 29  (int forceClose)
ae40: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6a 30  {.  int i, j, j0
ae50: 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 20  , c;.  char *z; 
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 2f 2a 20 55 73 65 64 20 74 6f 20 70 61 72 73   /* Used to pars
ae80: 65 20 75 70 20 61 20 73 74 72 69 6e 67 20 2a 2f  e up a string */
ae90: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
aea0: 74 61 74 62 75 66 3b 20 20 20 20 20 20 2f 2a 20  tatbuf;      /* 
aeb0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
aec0: 74 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  t the file to be
aed0: 20 72 65 74 72 69 65 76 65 64 20 2a 2f 0a 20 20   retrieved */.  
aee0: 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20  FILE *in;       
aef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
af00: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 43 47   reading from CG
af10: 49 20 73 63 72 69 70 74 73 20 2a 2f 0a 23 69 66  I scripts */.#if
af20: 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20  def LOG_HEADER. 
af30: 20 46 49 4c 45 20 2a 68 64 72 4c 6f 67 20 3d 20   FILE *hdrLog = 
af40: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  0;         /* Lo
af50: 67 20 66 69 6c 65 20 66 6f 72 20 63 6f 6d 70 6c  g file for compl
af60: 65 74 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ete header conte
af70: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  nt */.#endif.  c
af80: 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30 30 5d 3b  har zLine[1000];
af90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 75           /* A bu
afa0: 66 66 65 72 20 66 6f 72 20 69 6e 70 75 74 20 6c  ffer for input l
afb0: 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69 6e 67 20  ines or forming 
afc0: 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  names */..  /* C
afd0: 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65  hange directorie
afe0: 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66  s to the root of
aff0: 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73 79   the HTTP filesy
b000: 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28 20  stem.  */.  if( 
b010: 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30 5d 20 3f  chdir(zRoot[0] ?
b020: 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29 21 3d 30   zRoot : "/")!=0
b030: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
b040: 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c  f[1000];.    Mal
b050: 66 75 6e 63 74 69 6f 6e 28 31 39 30 2c 20 20 20  function(190,   
b060: 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20  /* LOG: chdir() 
b070: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
b080: 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72     "cannot chdir
b090: 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25   to [%s] from [%
b0a0: 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 52  s]",.         zR
b0b0: 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a 42 75 66  oot, getcwd(zBuf
b0c0: 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20 20 6e 52  ,999));.  }.  nR
b0d0: 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20 2f 2a 0a  equest++;..  /*.
b0e0: 20 20 2a 2a 20 57 65 20 6d 75 73 74 20 72 65 63    ** We must rec
b0f0: 65 69 76 65 20 61 20 63 6f 6d 70 6c 65 74 65 20  eive a complete 
b100: 68 65 61 64 65 72 20 77 69 74 68 69 6e 20 31 35  header within 15
b110: 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f 0a 20 20   seconds.  */.  
b120: 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c 20  signal(SIGALRM, 
b130: 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e  Timeout);.  sign
b140: 61 6c 28 53 49 47 53 45 47 56 2c 20 54 69 6d 65  al(SIGSEGV, Time
b150: 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61 6c 28 53  out);.  signal(S
b160: 49 47 50 49 50 45 2c 20 54 69 6d 65 6f 75 74 29  IGPIPE, Timeout)
b170: 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f  ;.  if( useTimeo
b180: 75 74 20 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a  ut ) alarm(15);.
b190: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 66 69  .  /* Get the fi
b1a0: 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20  rst line of the 
b1b0: 72 65 71 75 65 73 74 20 61 6e 64 20 70 61 72 73  request and pars
b1c0: 65 20 6f 75 74 20 74 68 65 0a 20 20 2a 2a 20 6d  e out the.  ** m
b1d0: 65 74 68 6f 64 2c 20 74 68 65 20 73 63 72 69 70  ethod, the scrip
b1e0: 74 20 61 6e 64 20 74 68 65 20 70 72 6f 74 6f 63  t and the protoc
b1f0: 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66  ol..  */.  if( f
b200: 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f  gets(zLine,sizeo
b210: 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e 29 3d  f(zLine),stdin)=
b220: 3d 30 20 29 7b 0a 20 20 20 20 65 78 69 74 28 30  =0 ){.    exit(0
b230: 29 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74 4c 6f 67  );.  }.  omitLog
b240: 20 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b 3d 20 73   = 0;.  nIn += s
b250: 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 0a 20  trlen(zLine);.. 
b260: 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69   /* Parse the fi
b270: 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20  rst line of the 
b280: 48 54 54 50 20 72 65 71 75 65 73 74 20 2a 2f 0a  HTTP request */.
b290: 20 20 7a 4d 65 74 68 6f 64 20 3d 20 53 74 72 44    zMethod = StrD
b2a0: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
b2b0: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29 29 3b 0a 20  nt(zLine,&z));. 
b2c0: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 7a   zRealScript = z
b2d0: 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70 28  Script = StrDup(
b2e0: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
b2f0: 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50 72 6f 74 6f  z,&z));.  zProto
b300: 63 6f 6c 20 3d 20 53 74 72 44 75 70 28 47 65 74  col = StrDup(Get
b310: 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 2c 26  FirstElement(z,&
b320: 7a 29 29 3b 0a 20 20 69 66 28 20 7a 50 72 6f 74  z));.  if( zProt
b330: 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74 72 6e 63  ocol==0 || strnc
b340: 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c 22 48 54  mp(zProtocol,"HT
b350: 54 50 2f 22 2c 35 29 21 3d 30 20 7c 7c 20 73 74  TP/",5)!=0 || st
b360: 72 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f 6c 29 21  rlen(zProtocol)!
b370: 3d 38 20 29 7b 0a 20 20 20 20 53 74 61 72 74 52  =8 ){.    StartR
b380: 65 73 70 6f 6e 73 65 28 22 34 30 30 20 42 61 64  esponse("400 Bad
b390: 20 52 65 71 75 65 73 74 22 29 3b 0a 20 20 20 20   Request");.    
b3a0: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a  nOut += printf(.
b3b0: 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74        "Content-t
b3c0: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
b3d0: 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c 72 5c 6e  r\n".      "\r\n
b3e0: 22 0a 20 20 20 20 20 20 22 54 68 69 73 20 73 65  ".      "This se
b3f0: 72 76 65 72 20 64 6f 65 73 20 6e 6f 74 20 75 6e  rver does not un
b400: 64 65 72 73 74 61 6e 64 20 74 68 65 20 72 65 71  derstand the req
b410: 75 65 73 74 65 64 20 70 72 6f 74 6f 63 6f 6c 5c  uested protocol\
b420: 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 4d 61  n".    );.    Ma
b430: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 30  keLogEntry(0, 20
b440: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 62 61 64 20  0); /* LOG: bad 
b450: 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48 54 54 50  protocol in HTTP
b460: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 65   header */.    e
b470: 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20 69 66  xit(0);.  }.  if
b480: 28 20 7a 53 63 72 69 70 74 5b 30 5d 3d 3d 30 20  ( zScript[0]==0 
b490: 29 20 4e 6f 74 46 6f 75 6e 64 28 32 31 30 29 3b  ) NotFound(210);
b4a0: 20 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74 79 20 72   /* LOG: Empty r
b4b0: 65 71 75 65 73 74 20 55 52 49 20 2a 2f 0a 20 20  equest URI */.  
b4c0: 69 66 28 20 66 6f 72 63 65 43 6c 6f 73 65 20 29  if( forceClose )
b4d0: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
b4e0: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ction = 1;.  }el
b4f0: 73 65 20 69 66 28 20 7a 50 72 6f 74 6f 63 6f 6c  se if( zProtocol
b500: 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50 72 6f 74  [5]<'1' || zProt
b510: 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29 7b 0a 20  ocol[7]<'1' ){. 
b520: 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69     closeConnecti
b530: 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  on = 1;.  }..  /
b540: 2a 20 54 68 69 73 20 76 65 72 79 20 73 69 6d 70  * This very simp
b550: 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c 79 20 75  le server only u
b560: 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 47  nderstands the G
b570: 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a 20 61 6e  ET, POST.  ** an
b580: 64 20 48 45 41 44 20 6d 65 74 68 6f 64 73 0a 20  d HEAD methods. 
b590: 20 2a 2f 0a 20 20 69 66 28 20 73 74 72 63 6d 70   */.  if( strcmp
b5a0: 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54 22 29 21  (zMethod,"GET")!
b5b0: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 65  =0 && strcmp(zMe
b5c0: 74 68 6f 64 2c 22 50 4f 53 54 22 29 21 3d 30 0a  thod,"POST")!=0.
b5d0: 20 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70         && strcmp
b5e0: 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29  (zMethod,"HEAD")
b5f0: 21 3d 30 20 29 7b 0a 20 20 20 20 53 74 61 72 74  !=0 ){.    Start
b600: 52 65 73 70 6f 6e 73 65 28 22 35 30 31 20 4e 6f  Response("501 No
b610: 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b  t Implemented");
b620: 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
b630: 6e 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74  ntf(.      "Cont
b640: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
b650: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
b660: 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68  "\r\n".      "Th
b670: 65 20 25 73 20 6d 65 74 68 6f 64 20 69 73 20 6e  e %s method is n
b680: 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 6f  ot implemented o
b690: 6e 20 74 68 69 73 20 73 65 72 76 65 72 2e 5c 6e  n this server.\n
b6a0: 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74 68 6f 64  ",.      zMethod
b6b0: 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  );.    MakeLogEn
b6c0: 74 72 79 28 30 2c 20 32 32 30 29 3b 20 2f 2a 20  try(0, 220); /* 
b6d0: 4c 4f 47 3a 20 55 6e 6b 6e 6f 77 6e 20 72 65 71  LOG: Unknown req
b6e0: 75 65 73 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  uest method */. 
b6f0: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a     exit(0);.  }.
b700: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b710: 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 28 69 66  s a log file (if
b720: 20 7a 4c 6f 67 46 69 6c 65 21 3d 30 29 20 61 6e   zLogFile!=0) an
b730: 64 20 69 66 20 74 68 65 20 70 61 74 68 6e 61 6d  d if the pathnam
b740: 65 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69  e in.  ** the fi
b750: 72 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20  rst line of the 
b760: 68 74 74 70 20 72 65 71 75 65 73 74 20 63 6f 6e  http request con
b770: 74 61 69 6e 73 20 74 68 65 20 6d 61 67 69 63 20  tains the magic 
b780: 73 74 72 69 6e 67 0a 20 20 2a 2a 20 22 46 75 6c  string.  ** "Ful
b790: 6c 48 65 61 64 65 72 4c 6f 67 22 20 74 68 65 6e  lHeaderLog" then
b7a0: 20 77 72 69 74 65 20 74 68 65 20 63 6f 6d 70 6c   write the compl
b7b0: 65 74 65 20 68 65 61 64 65 72 20 74 65 78 74 20  ete header text 
b7c0: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69  into the.  ** fi
b7d0: 6c 65 20 25 73 28 7a 4c 6f 67 46 69 6c 65 29 2d  le %s(zLogFile)-
b7e0: 68 64 72 2e 20 20 4f 76 65 72 77 72 69 74 65 20  hdr.  Overwrite 
b7f0: 74 68 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  the file.  This 
b800: 69 73 20 66 6f 72 20 70 72 6f 74 6f 63 6f 6c 0a  is for protocol.
b810: 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 20 6f    ** debugging o
b820: 6e 6c 79 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  nly and is only 
b830: 65 6e 61 62 6c 65 64 20 69 66 20 61 6c 74 68 74  enabled if altht
b840: 74 70 64 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  tpd is compiled 
b850: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 2d 44  with.  ** the -D
b860: 4c 4f 47 5f 48 45 41 44 45 52 3d 31 20 6f 70 74  LOG_HEADER=1 opt
b870: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ion..  */.#ifdef
b880: 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20 69 66   LOG_HEADER.  if
b890: 28 20 7a 4c 6f 67 46 69 6c 65 0a 20 20 20 26 26  ( zLogFile.   &&
b8a0: 20 73 74 72 73 74 72 28 7a 53 63 72 69 70 74 2c   strstr(zScript,
b8b0: 22 46 75 6c 6c 48 65 61 64 65 72 4c 6f 67 22 29  "FullHeaderLog")
b8c0: 21 3d 30 0a 20 20 20 26 26 20 73 74 72 6c 65 6e  !=0.   && strlen
b8d0: 28 7a 4c 6f 67 46 69 6c 65 29 3c 73 69 7a 65 6f  (zLogFile)<sizeo
b8e0: 66 28 7a 4c 69 6e 65 29 2d 35 30 0a 20 20 29 7b  f(zLine)-50.  ){
b8f0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69  .    sprintf(zLi
b900: 6e 65 2c 20 22 25 73 2d 68 64 72 22 2c 20 7a 4c  ne, "%s-hdr", zL
b910: 6f 67 46 69 6c 65 29 3b 0a 20 20 20 20 68 64 72  ogFile);.    hdr
b920: 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a 4c 69 6e  Log = fopen(zLin
b930: 65 2c 20 22 77 62 22 29 3b 0a 20 20 7d 0a 23 65  e, "wb");.  }.#e
b940: 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  ndif...  /* Get 
b950: 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c  all the optional
b960: 20 66 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c   fields that fol
b970: 6c 6f 77 20 74 68 65 20 66 69 72 73 74 20 6c 69  low the first li
b980: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43 6f 6f 6b  ne..  */.  zCook
b990: 69 65 20 3d 20 30 3b 0a 20 20 7a 41 75 74 68 54  ie = 0;.  zAuthT
b9a0: 79 70 65 20 3d 20 30 3b 0a 20 20 7a 52 65 6d 6f  ype = 0;.  zRemo
b9b0: 74 65 55 73 65 72 20 3d 20 30 3b 0a 20 20 7a 52  teUser = 0;.  zR
b9c0: 65 66 65 72 65 72 20 3d 20 30 3b 0a 20 20 7a 49  eferer = 0;.  zI
b9d0: 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 30 3b 0a  fNoneMatch = 0;.
b9e0: 20 20 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e    zIfModifiedSin
b9f0: 63 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ce = 0;.  while(
ba00: 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a   fgets(zLine,siz
ba10: 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69 6e  eof(zLine),stdin
ba20: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
ba30: 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63  FieldName;.    c
ba40: 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 23 69 66 64  har *zVal;..#ifd
ba50: 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20  ef LOG_HEADER.  
ba60: 20 20 69 66 28 20 68 64 72 4c 6f 67 20 29 20 66    if( hdrLog ) f
ba70: 70 72 69 6e 74 66 28 68 64 72 4c 6f 67 2c 20 22  printf(hdrLog, "
ba80: 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a 23 65 6e  %s", zLine);.#en
ba90: 64 69 66 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 73  dif.    nIn += s
baa0: 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20  trlen(zLine);.  
bab0: 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 47    zFieldName = G
bac0: 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a  etFirstElement(z
bad0: 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 20 20  Line,&zVal);.   
bae0: 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d 65 3d   if( zFieldName=
baf0: 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d  =0 || *zFieldNam
bb00: 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e==0 ) break;.  
bb10: 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28    RemoveNewline(
bb20: 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73  zVal);.    if( s
bb30: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
bb40: 4e 61 6d 65 2c 22 55 73 65 72 2d 41 67 65 6e 74  Name,"User-Agent
bb50: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
bb60: 7a 41 67 65 6e 74 20 3d 20 53 74 72 44 75 70 28  zAgent = StrDup(
bb70: 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zVal);.    }else
bb80: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
bb90: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 63 63 65  zFieldName,"Acce
bba0: 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pt:")==0 ){.    
bbb0: 20 20 7a 41 63 63 65 70 74 20 3d 20 53 74 72 44    zAccept = StrD
bbc0: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
bbd0: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
bbe0: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41  mp(zFieldName,"A
bbf0: 63 63 65 70 74 2d 45 6e 63 6f 64 69 6e 67 3a 22  ccept-Encoding:"
bc00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 41  )==0 ){.      zA
bc10: 63 63 65 70 74 45 6e 63 6f 64 69 6e 67 20 3d 20  cceptEncoding = 
bc20: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
bc30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
bc40: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
bc50: 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74  e,"Content-lengt
bc60: 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  h:")==0 ){.     
bc70: 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20   zContentLength 
bc80: 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a  = StrDup(zVal);.
bc90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
bca0: 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e  rcasecmp(zFieldN
bcb0: 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 74 79 70  ame,"Content-typ
bcc0: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e:")==0 ){.     
bcd0: 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20   zContentType = 
bce0: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
bcf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
bd00: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
bd10: 65 2c 22 52 65 66 65 72 65 72 3a 22 29 3d 3d 30  e,"Referer:")==0
bd20: 20 29 7b 0a 20 20 20 20 20 20 7a 52 65 66 65 72   ){.      zRefer
bd30: 65 72 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  er = StrDup(zVal
bd40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
bd50: 73 74 72 28 7a 56 61 6c 2c 20 22 64 65 76 69 64  str(zVal, "devid
bd60: 73 2e 6e 65 74 2f 22 29 21 3d 30 20 29 7b 20 7a  s.net/")!=0 ){ z
bd70: 52 65 66 65 72 65 72 20 3d 20 22 64 65 76 69 64  Referer = "devid
bd80: 73 2e 6e 65 74 2e 73 6d 75 74 22 3b 0a 20 20 20  s.net.smut";.   
bd90: 20 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28 32       Forbidden(2
bda0: 33 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 66  30); /* LOG: Ref
bdb0: 65 72 72 65 72 20 69 73 20 64 65 76 69 64 73 2e  errer is devids.
bdc0: 6e 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  net */.      }. 
bdd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
bde0: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
bdf0: 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29 3d 3d 30  me,"Cookie:")==0
be00: 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f 6f 6b 69   ){.      zCooki
be10: 65 20 3d 20 53 74 72 41 70 70 65 6e 64 28 7a 43  e = StrAppend(zC
be20: 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56 61 6c 29  ookie,"; ",zVal)
be30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
be40: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
be50: 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63 74 69 6f  dName,"Connectio
be60: 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n:")==0 ){.     
be70: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
be80: 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29 3d 3d 30  zVal,"close")==0
be90: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
bea0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b  eConnection = 1;
beb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
bec0: 20 21 66 6f 72 63 65 43 6c 6f 73 65 20 26 26 20   !forceClose && 
bed0: 73 74 72 63 61 73 65 63 6d 70 28 7a 56 61 6c 2c  strcasecmp(zVal,
bee0: 20 22 6b 65 65 70 2d 61 6c 69 76 65 22 29 3d 3d   "keep-alive")==
bef0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
bf00: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30  seConnection = 0
bf10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
bf20: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
bf30: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 48  mp(zFieldName,"H
bf40: 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ost:")==0 ){.   
bf50: 20 20 20 69 6e 74 20 69 6e 53 71 75 61 72 65 20     int inSquare 
bf60: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
bf70: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 73 61 6e  c;.      if( san
bf80: 69 74 69 7a 65 53 74 72 69 6e 67 28 7a 56 61 6c  itizeString(zVal
bf90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 6f 72  ) ){.        For
bfa0: 62 69 64 64 65 6e 28 32 34 30 29 3b 20 20 2f 2a  bidden(240);  /*
bfb0: 20 4c 4f 47 3a 20 49 6c 6c 65 67 61 6c 20 63 6f   LOG: Illegal co
bfc0: 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54 3a 20 70  ntent in HOST: p
bfd0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 20 20  arameter */.    
bfe0: 20 20 7d 0a 20 20 20 20 20 20 7a 48 74 74 70 48    }.      zHttpH
bff0: 6f 73 74 20 3d 20 53 74 72 44 75 70 28 7a 56 61  ost = StrDup(zVa
c000: 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65 72 76 65  l);.      zServe
c010: 72 50 6f 72 74 20 3d 20 7a 53 65 72 76 65 72 4e  rPort = zServerN
c020: 61 6d 65 20 3d 20 53 74 72 44 75 70 28 7a 48 74  ame = StrDup(zHt
c030: 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 20 20 77  tpHost);.      w
c040: 68 69 6c 65 28 20 7a 53 65 72 76 65 72 50 6f 72  hile( zServerPor
c050: 74 20 26 26 20 28 63 20 3d 20 2a 7a 53 65 72 76  t && (c = *zServ
c060: 65 72 50 6f 72 74 29 21 3d 30 0a 20 20 20 20 20  erPort)!=0.     
c070: 20 20 20 20 20 20 20 20 20 26 26 20 28 63 21 3d           && (c!=
c080: 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61 72 65 29  ':' || inSquare)
c090: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c0a0: 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71 75 61 72  c=='[' ) inSquar
c0b0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  e = 1;.        i
c0c0: 66 28 20 63 3d 3d 27 5d 27 20 29 20 69 6e 53 71  f( c==']' ) inSq
c0d0: 75 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  uare = 0;.      
c0e0: 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b 2b 3b    zServerPort++;
c0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
c100: 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 20 26  f( zServerPort &
c110: 26 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 20 29  & *zServerPort )
c120: 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53 65 72 76  {.        *zServ
c130: 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  erPort = 0;.    
c140: 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74 2b      zServerPort+
c150: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
c160: 20 69 66 28 20 7a 52 65 61 6c 50 6f 72 74 20 29   if( zRealPort )
c170: 7b 0a 20 20 20 20 20 20 20 20 7a 53 65 72 76 65  {.        zServe
c180: 72 50 6f 72 74 20 3d 20 53 74 72 44 75 70 28 7a  rPort = StrDup(z
c190: 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20 20 20 20  RealPort);.     
c1a0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
c1b0: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
c1c0: 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f 72 69 7a  ldName,"Authoriz
c1d0: 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20  ation:")==0 ){. 
c1e0: 20 20 20 20 20 7a 41 75 74 68 54 79 70 65 20 3d       zAuthType =
c1f0: 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74   GetFirstElement
c200: 28 53 74 72 44 75 70 28 7a 56 61 6c 29 2c 20 26  (StrDup(zVal), &
c210: 7a 41 75 74 68 41 72 67 29 3b 0a 20 20 20 20 7d  zAuthArg);.    }
c220: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
c230: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
c240: 49 66 2d 4e 6f 6e 65 2d 4d 61 74 63 68 3a 22 29  If-None-Match:")
c250: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 49 66  ==0 ){.      zIf
c260: 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 53 74 72 44  NoneMatch = StrD
c270: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
c280: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
c290: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 49  mp(zFieldName,"I
c2a0: 66 2d 4d 6f 64 69 66 69 65 64 2d 53 69 6e 63 65  f-Modified-Since
c2b0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
c2c0: 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65  zIfModifiedSince
c2d0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
c2e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
c2f0: 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20 20 69  f LOG_HEADER.  i
c300: 66 28 20 68 64 72 4c 6f 67 20 29 20 66 63 6c 6f  f( hdrLog ) fclo
c310: 73 65 28 68 64 72 4c 6f 67 29 3b 0a 23 65 6e 64  se(hdrLog);.#end
c320: 69 66 0a 0a 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  if..  /* Disallo
c330: 77 20 72 65 71 75 65 73 74 73 20 66 72 6f 6d 20  w requests from 
c340: 63 65 72 74 61 69 6e 20 63 6c 69 65 6e 74 73 20  certain clients 
c350: 2a 2f 0a 20 20 69 66 28 20 7a 41 67 65 6e 74 20  */.  if( zAgent 
c360: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 73 74  ){.    if( strst
c370: 72 28 7a 41 67 65 6e 74 2c 20 22 57 69 6e 64 6f  r(zAgent, "Windo
c380: 77 73 5f 39 22 29 21 3d 30 0a 20 20 20 20 20 7c  ws_9")!=0.     |
c390: 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c  | strstr(zAgent,
c3a0: 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d 61 73 74 65   "Download_Maste
c3b0: 72 22 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73  r")!=0.     || s
c3c0: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 45  trstr(zAgent, "E
c3d0: 7a 6f 6f 6d 73 2f 22 29 21 3d 30 0a 20 20 20 20  zooms/")!=0.    
c3e0: 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e   || strstr(zAgen
c3f0: 74 2c 20 22 48 54 54 72 61 63 6b 22 29 21 3d 30  t, "HTTrack")!=0
c400: 0a 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28  .     || strstr(
c410: 7a 41 67 65 6e 74 2c 20 22 41 68 72 65 66 73 42  zAgent, "AhrefsB
c420: 6f 74 22 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ot")!=0.    ){. 
c430: 20 20 20 20 20 46 6f 72 62 69 64 64 65 6e 28 32       Forbidden(2
c440: 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 44 69  50);  /* LOG: Di
c450: 73 61 6c 6c 6f 77 65 64 20 75 73 65 72 20 61 67  sallowed user ag
c460: 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  ent */.    }.  }
c470: 0a 23 69 66 20 30 0a 20 20 69 66 28 20 7a 52 65  .#if 0.  if( zRe
c480: 66 65 72 65 72 20 29 7b 0a 20 20 20 20 73 74 61  ferer ){.    sta
c490: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
c4a0: 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d 20 3d 20 7b  azDisallow[] = {
c4b0: 0a 20 20 20 20 20 20 22 73 6b 69 64 72 6f 77 63  .      "skidrowc
c4c0: 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20 20 20 20 20  rack.com",.     
c4d0: 20 22 68 6f 73 68 69 79 75 75 67 69 2e 74 69 73   "hoshiyuugi.tis
c4e0: 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20 20 20 20 20  tory.com",.     
c4f0: 20 22 73 6b 69 64 72 6f 77 67 61 6d 65 73 2e 6e   "skidrowgames.n
c500: 65 74 22 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20  et",.    };.    
c510: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
c520: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
c530: 69 73 61 6c 6c 6f 77 29 2f 73 69 7a 65 6f 66 28  isallow)/sizeof(
c540: 61 7a 44 69 73 61 6c 6c 6f 77 5b 30 5d 29 3b 20  azDisallow[0]); 
c550: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
c560: 73 74 72 73 74 72 28 7a 52 65 66 65 72 65 72 2c  strstr(zReferer,
c570: 20 61 7a 44 69 73 61 6c 6c 6f 77 5b 69 5d 29 21   azDisallow[i])!
c580: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f  =0 ){.        No
c590: 74 46 6f 75 6e 64 28 32 36 30 29 3b 20 20 2f 2a  tFound(260);  /*
c5a0: 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f 77 65 64   LOG: Disallowed
c5b0: 20 72 65 66 65 72 72 65 72 20 2a 2f 0a 20 20 20   referrer */.   
c5c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
c5d0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
c5e0: 20 61 6e 20 65 78 74 72 61 20 65 66 66 6f 72 74   an extra effort
c5f0: 20 74 6f 20 67 65 74 20 61 20 76 61 6c 69 64 20   to get a valid 
c600: 73 65 72 76 65 72 20 6e 61 6d 65 20 61 6e 64 20  server name and 
c610: 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  port number..  *
c620: 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61 70 65 20  * Only Netscape 
c630: 70 72 6f 76 69 64 65 73 20 74 68 69 73 20 69 6e  provides this in
c640: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
c650: 68 65 20 62 72 6f 77 73 65 72 20 69 73 0a 20 20  he browser is.  
c660: 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45 78 70 6c  ** Internet Expl
c670: 6f 72 65 72 2c 20 74 68 65 6e 20 77 65 20 68 61  orer, then we ha
c680: 76 65 20 74 6f 20 66 69 6e 64 20 6f 75 74 20 74  ve to find out t
c690: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  he information f
c6a0: 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65 6c 76 65  or.  ** ourselve
c6b0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53  s..  */.  if( zS
c6c0: 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20 29 7b 0a  erverName==0 ){.
c6d0: 20 20 20 20 7a 53 65 72 76 65 72 4e 61 6d 65 20      zServerName 
c6e0: 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 31 30  = SafeMalloc( 10
c6f0: 30 20 29 3b 0a 20 20 20 20 67 65 74 68 6f 73 74  0 );.    gethost
c700: 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e 61 6d 65  name(zServerName
c710: 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ,100);.  }.  if(
c720: 20 7a 53 65 72 76 65 72 50 6f 72 74 3d 3d 30 20   zServerPort==0 
c730: 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f 72 74 3d  || *zServerPort=
c740: 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65  =0 ){.    zServe
c750: 72 50 6f 72 74 20 3d 20 44 45 46 41 55 4c 54 5f  rPort = DEFAULT_
c760: 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  PORT;.  }..  /* 
c770: 52 65 6d 6f 76 65 20 74 68 65 20 71 75 65 72 79  Remove the query
c780: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 74 68 65   string from the
c790: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 71 75   end of the requ
c7a0: 65 73 74 65 64 20 66 69 6c 65 2e 0a 20 20 2a 2f  ested file..  */
c7b0: 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72 69 70 74  .  for(z=zScript
c7c0: 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3f 27 3b  ; *z && *z!='?';
c7d0: 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 2a 7a   z++){}.  if( *z
c7e0: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 7a 51 75  =='?' ){.    zQu
c7f0: 65 72 79 53 75 66 66 69 78 20 3d 20 53 74 72 44  erySuffix = StrD
c800: 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a 20 3d 20  up(z);.    *z = 
c810: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
c820: 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 22  zQuerySuffix = "
c830: 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65 72 79 53  ";.  }.  zQueryS
c840: 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65 72 79 53  tring = *zQueryS
c850: 75 66 66 69 78 20 3f 20 26 7a 51 75 65 72 79 53  uffix ? &zQueryS
c860: 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51 75 65 72  uffix[1] : zQuer
c870: 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f 2a 20 43  ySuffix;..  /* C
c880: 72 65 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  reate a file to 
c890: 68 6f 6c 64 20 74 68 65 20 50 4f 53 54 20 71 75  hold the POST qu
c8a0: 65 72 79 20 64 61 74 61 2c 20 69 66 20 61 6e 79  ery data, if any
c8b0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 0a 20 20  .  We have to.  
c8c0: 2a 2a 20 64 6f 20 69 74 20 74 68 69 73 20 77 61  ** do it this wa
c8d0: 79 2e 20 20 57 65 20 63 61 6e 27 74 20 6a 75 73  y.  We can't jus
c8e0: 74 20 70 61 73 73 20 74 68 65 20 66 69 6c 65 20  t pass the file 
c8f0: 64 65 73 63 72 69 70 74 6f 72 20 64 6f 77 6e 20  descriptor down 
c900: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63 68 69 6c  to.  ** the chil
c910: 64 20 70 72 6f 63 65 73 73 20 62 65 63 61 75 73  d process becaus
c920: 65 20 74 68 65 20 66 67 65 74 73 28 29 20 66 75  e the fgets() fu
c930: 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61 76 65 20  nction may have 
c940: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 72 65 61  already.  ** rea
c950: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 4f  d part of the PO
c960: 53 54 20 64 61 74 61 20 69 6e 74 6f 20 69 74 73  ST data into its
c970: 20 69 6e 74 65 72 6e 61 6c 20 62 75 66 66 65 72   internal buffer
c980: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 4d 65  ..  */.  if( zMe
c990: 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 26 26 20  thod[0]=='P' && 
c9a0: 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 21 3d  zContentLength!=
c9b0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  0 ){.    int len
c9c0: 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74 65 6e 74   = atoi(zContent
c9d0: 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20 46 49 4c  Length);.    FIL
c9e0: 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63 68 61 72  E *out;.    char
c9f0: 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69 6e 74 20   *zBuf;.    int 
ca00: 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  n;..    if( len>
ca10: 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47  MAX_CONTENT_LENG
ca20: 54 48 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72  TH ){.      Star
ca30: 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20 52  tResponse("500 R
ca40: 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65  equest too large
ca50: 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b  ");.      nOut +
ca60: 3d 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  = printf(.      
ca70: 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a    "Content-type:
ca80: 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22   text/plain\r\n"
ca90: 0a 20 20 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a  .        "\r\n".
caa0: 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 75 63          "Too muc
cab0: 68 20 50 4f 53 54 20 64 61 74 61 5c 6e 22 0a 20  h POST data\n". 
cac0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61       );.      Ma
cad0: 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 37  keLogEntry(0, 27
cae0: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52 65 71 75  0); /* LOG: Requ
caf0: 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  est too large */
cb00: 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a  .      exit(0);.
cb10: 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74      }.    sprint
cb20: 66 28 7a 54 6d 70 4e 61 6d 42 75 66 2c 20 22 2f  f(zTmpNamBuf, "/
cb30: 74 6d 70 2f 2d 70 6f 73 74 2d 64 61 74 61 2d 58  tmp/-post-data-X
cb40: 58 58 58 58 58 22 29 3b 0a 20 20 20 20 7a 54 6d  XXXXX");.    zTm
cb50: 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61 6d 42 75  pNam = zTmpNamBu
cb60: 66 3b 0a 20 20 20 20 69 66 28 20 6d 6b 73 74 65  f;.    if( mkste
cb70: 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c 30 20 29 7b  mp(zTmpNam)<0 ){
cb80: 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
cb90: 6f 6e 28 32 38 30 2c 20 20 2f 2a 20 4c 4f 47 3a  on(280,  /* LOG:
cba0: 20 6d 6b 73 74 65 6d 70 28 29 20 66 61 69 6c 65   mkstemp() faile
cbb0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
cbc0: 20 20 20 20 22 43 61 6e 6e 6f 74 20 63 72 65 61      "Cannot crea
cbd0: 74 65 20 61 20 74 65 6d 70 20 66 69 6c 65 20 69  te a temp file i
cbe0: 6e 20 77 68 69 63 68 20 74 6f 20 73 74 6f 72 65  n which to store
cbf0: 20 50 4f 53 54 20 64 61 74 61 22 29 3b 0a 20 20   POST data");.  
cc00: 20 20 7d 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f    }.    out = fo
cc10: 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22 77 22 29  pen(zTmpNam,"w")
cc20: 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30  ;.    if( out==0
cc30: 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72 74 52   ){.      StartR
cc40: 65 73 70 6f 6e 73 65 28 22 35 30 30 20 43 61 6e  esponse("500 Can
cc50: 6e 6f 74 20 63 72 65 61 74 65 20 2f 74 6d 70 20  not create /tmp 
cc60: 66 69 6c 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f  file");.      nO
cc70: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20  ut += printf(.  
cc80: 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74        "Content-t
cc90: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
cca0: 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72  r\n".        "\r
ccb0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 43 6f 75  \n".        "Cou
ccc0: 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  ld not open \"%s
ccd0: 5c 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e  \" for writing\n
cce0: 22 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20 20 20 20  ", zTmpNam.     
ccf0: 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f   );.      MakeLo
cd00: 67 45 6e 74 72 79 28 30 2c 20 32 39 30 29 3b 20  gEntry(0, 290); 
cd10: 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20 63  /* LOG: cannot c
cd20: 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 20  reate temp file 
cd30: 66 6f 72 20 50 4f 53 54 20 2a 2f 0a 20 20 20 20  for POST */.    
cd40: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
cd50: 0a 20 20 20 20 7a 42 75 66 20 3d 20 53 61 66 65  .    zBuf = Safe
cd60: 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 20 29 3b  Malloc( len+1 );
cd70: 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65  .    if( useTime
cd80: 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35 20 2b  out ) alarm(15 +
cd90: 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20 20 20 20   len/2000);.    
cda0: 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 31  n = fread(zBuf,1
cdb0: 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a 20 20 20  ,len,stdin);.   
cdc0: 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 66   nIn += n;.    f
cdd0: 77 72 69 74 65 28 7a 42 75 66 2c 31 2c 6e 2c 6f  write(zBuf,1,n,o
cde0: 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 42  ut);.    free(zB
cdf0: 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  uf);.    fclose(
ce00: 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  out);.  }..  /* 
ce10: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 72 75  Make sure the ru
ce20: 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73 20 6e 6f  nning time is no
ce30: 74 20 74 6f 6f 20 67 72 65 61 74 20 2a 2f 0a 20  t too great */. 
ce40: 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20   if( useTimeout 
ce50: 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a 0a 20 20  ) alarm(10);..  
ce60: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 75  /* Convert all u
ce70: 6e 75 73 75 61 6c 20 63 68 61 72 61 63 74 65 72  nusual character
ce80: 73 20 69 6e 20 74 68 65 20 73 63 72 69 70 74 20  s in the script 
ce90: 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22 2e 0a 20  name into "_".. 
cea0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
ceb0: 20 61 20 64 65 66 65 6e 73 65 20 61 67 61 69 6e   a defense again
cec0: 73 74 20 76 61 72 69 6f 75 73 20 61 74 74 61 63  st various attac
ced0: 6b 73 2c 20 58 53 53 20 61 74 74 61 63 6b 73 20  ks, XSS attacks 
cee0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 2e 0a 20  in particular.. 
cef0: 20 2a 2f 0a 20 20 73 61 6e 69 74 69 7a 65 53 74   */.  sanitizeSt
cf00: 72 69 6e 67 28 7a 53 63 72 69 70 74 29 3b 0a 0a  ring(zScript);..
cf10: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
cf20: 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d 22 20 74  w "/." or "/-" t
cf30: 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e 79 77 68  o to occur anywh
cf40: 65 72 65 20 69 6e 20 74 68 65 20 65 6e 74 69 74  ere in the entit
cf50: 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 54 68 69  y name..  ** Thi
cf60: 73 20 70 72 65 76 65 6e 74 73 20 61 74 74 61 63  s prevents attac
cf70: 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20 22 2e 2e  ks involving "..
cf80: 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c 6c 6f 77  " and also allow
cf90: 73 20 75 73 20 74 6f 20 63 72 65 61 74 65 0a 20  s us to create. 
cfa0: 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64 20 64 69   ** files and di
cfb0: 72 65 63 74 6f 72 69 65 73 20 77 68 6f 73 65 20  rectories whose 
cfc0: 6e 61 6d 65 73 20 62 65 67 69 6e 20 77 69 74 68  names begin with
cfd0: 20 22 2d 22 20 6f 72 20 22 2e 22 20 77 68 69 63   "-" or "." whic
cfe0: 68 20 61 72 65 0a 20 20 2a 2a 20 69 6e 76 69 73  h are.  ** invis
cff0: 69 62 6c 65 20 74 6f 20 74 68 65 20 77 65 62 73  ible to the webs
d000: 65 72 76 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  erver..  **.  **
d010: 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 41 6c 6c   Exception:  All
d020: 6f 77 20 74 68 65 20 22 2f 2e 77 65 6c 6c 2d 6b  ow the "/.well-k
d030: 6e 6f 77 6e 2f 22 20 70 72 65 66 69 78 20 69 6e  nown/" prefix in
d040: 20 61 63 63 6f 72 64 61 6e 63 65 20 77 69 74 68   accordance with
d050: 0a 20 20 2a 2a 20 52 46 43 2d 35 37 38 35 0a 20  .  ** RFC-5785. 
d060: 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72   */.  for(z=zScr
d070: 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ipt; *z; z++){. 
d080: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20 26     if( *z=='/' &
d090: 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20 7c 7c 20  & (z[1]=='.' || 
d0a0: 7a 5b 31 5d 3d 3d 27 2d 27 29 0a 20 20 20 20 20  z[1]=='-').     
d0b0: 26 26 20 28 7a 3e 7a 53 63 72 69 70 74 20 7c 7c  && (z>zScript ||
d0c0: 20 73 74 72 6e 63 6d 70 28 7a 2c 22 2f 2e 77 65   strncmp(z,"/.we
d0d0: 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c 31 33 29 21 3d  ll-known/",13)!=
d0e0: 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
d0f0: 20 4e 6f 74 46 6f 75 6e 64 28 33 30 30 29 3b 20   NotFound(300); 
d100: 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20 65 6c 65  /* LOG: Path ele
d110: 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74 68  ment begins with
d120: 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a 2f 0a 20   "." or "-" */. 
d130: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
d140: 69 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 74  igure out what t
d150: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 66  he root of the f
d160: 69 6c 65 73 79 73 74 65 6d 20 73 68 6f 75 6c 64  ilesystem should
d170: 20 62 65 2e 20 20 49 66 20 74 68 65 0a 20 20 2a   be.  If the.  *
d180: 2a 20 48 54 54 50 5f 48 4f 53 54 20 70 61 72 61  * HTTP_HOST para
d190: 6d 65 74 65 72 20 65 78 69 73 74 73 20 28 73 74  meter exists (st
d1a0: 6f 72 65 64 20 69 6e 20 7a 48 74 74 70 48 6f 73  ored in zHttpHos
d1b0: 74 29 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  t) then remove t
d1c0: 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20 6e 75 6d  he.  ** port num
d1d0: 62 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ber from the end
d1e0: 20 28 69 66 20 61 6e 79 29 2c 20 63 6f 6e 76 65   (if any), conve
d1f0: 72 74 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72  rt all character
d200: 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20 2a 2a 20  s to lower.  ** 
d210: 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e 76 65 72  case, and conver
d220: 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20 22 5f 22  t all "." to "_"
d230: 2e 20 20 54 68 65 6e 20 74 72 79 20 74 6f 20 66  .  Then try to f
d240: 69 6e 64 20 61 20 64 69 72 65 63 74 6f 72 79 0a  ind a directory.
d250: 20 20 2a 2a 20 77 69 74 68 20 74 68 61 74 20 6e    ** with that n
d260: 61 6d 65 20 61 6e 64 20 74 68 65 20 65 78 74 65  ame and the exte
d270: 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74 65 2e 20  nsion .website. 
d280: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 6c   If not found, l
d290: 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20 22 64 65  ook.  ** for "de
d2a0: 66 61 75 6c 74 2e 77 65 62 73 69 74 65 22 2e 0a  fault.website"..
d2b0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 63 72 69    */.  if( zScri
d2c0: 70 74 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  pt[0]!='/' ){.  
d2d0: 20 20 4e 6f 74 46 6f 75 6e 64 28 33 31 30 29 3b    NotFound(310);
d2e0: 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 64 6f 65   /* LOG: URI doe
d2f0: 73 20 6e 6f 74 20 73 74 61 72 74 20 77 69 74 68  s not start with
d300: 20 22 2f 22 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   "/" */.  }.  if
d310: 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29 2b  ( strlen(zRoot)+
d320: 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28 7a 4c 69  40 >= sizeof(zLi
d330: 6e 65 29 20 29 7b 0a 20 20 20 20 20 4e 6f 74 46  ne) ){.     NotF
d340: 6f 75 6e 64 28 33 32 30 29 3b 20 2f 2a 20 4c 4f  ound(320); /* LO
d350: 47 3a 20 55 52 49 20 74 6f 6f 20 6c 6f 6e 67 20  G: URI too long 
d360: 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 7a 48 74  */.  }.  if( zHt
d370: 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20 7a 48 74  tpHost==0 || zHt
d380: 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20 29 7b 0a  tpHost[0]==0 ){.
d390: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 33 30      NotFound(330
d3a0: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d 69 73 73  );  /* LOG: Miss
d3b0: 69 6e 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65  ing HOST: parame
d3c0: 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ter */.  }else i
d3d0: 66 28 20 73 74 72 6c 65 6e 28 7a 48 74 74 70 48  f( strlen(zHttpH
d3e0: 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a 52 6f 6f  ost)+strlen(zRoo
d3f0: 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65 6f 66 28  t)+10 >= sizeof(
d400: 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 4e 6f  zLine) ){.    No
d410: 74 46 6f 75 6e 64 28 33 34 30 29 3b 20 20 2f 2a  tFound(340);  /*
d420: 20 4c 4f 47 3a 20 48 4f 53 54 20 70 61 72 61 6d   LOG: HOST param
d430: 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f  eter too long */
d440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
d450: 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
d460: 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c 20 7a 48 74  /%s", zRoot, zHt
d470: 74 70 48 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72  tpHost);.    for
d480: 28 69 3d 73 74 72 6c 65 6e 28 7a 52 6f 6f 74 29  (i=strlen(zRoot)
d490: 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26 26 20  +1; zLine[i] && 
d4a0: 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27 3b 20 69  zLine[i]!=':'; i
d4b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  ++){.      int c
d4c0: 20 3d 20 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20   = zLine[i];.   
d4d0: 20 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28     if( !isalnum(
d4e0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c  c) ){.        zL
d4f0: 69 6e 65 5b 69 5d 20 3d 20 27 5f 27 3b 0a 20 20  ine[i] = '_';.  
d500: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
d510: 75 70 70 65 72 28 63 29 20 29 7b 0a 20 20 20 20  upper(c) ){.    
d520: 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 74      zLine[i] = t
d530: 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20 20 20 20  olower(c);.     
d540: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72   }.    }.    str
d550: 63 70 79 28 26 7a 4c 69 6e 65 5b 69 5d 2c 20 22  cpy(&zLine[i], "
d560: 2e 77 65 62 73 69 74 65 22 29 3b 0a 20 20 7d 0a  .website");.  }.
d570: 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65    if( stat(zLine
d580: 2c 26 73 74 61 74 62 75 66 29 20 7c 7c 20 21 53  ,&statbuf) || !S
d590: 5f 49 53 44 49 52 28 73 74 61 74 62 75 66 2e 73  _ISDIR(statbuf.s
d5a0: 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20 73  t_mode) ){.    s
d5b0: 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25  printf(zLine, "%
d5c0: 73 2f 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74  s/default.websit
d5d0: 65 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 20 20  e", zRoot);.    
d5e0: 69 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26  if( stat(zLine,&
d5f0: 73 74 61 74 62 75 66 29 20 7c 7c 20 21 53 5f 49  statbuf) || !S_I
d600: 53 44 49 52 28 73 74 61 74 62 75 66 2e 73 74 5f  SDIR(statbuf.st_
d610: 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69  mode) ){.      i
d620: 66 28 20 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b  f( standalone ){
d630: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
d640: 28 7a 4c 69 6e 65 2c 20 22 25 73 22 2c 20 7a 52  (zLine, "%s", zR
d650: 6f 6f 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oot);.      }els
d660: 65 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f  e{.        NotFo
d670: 75 6e 64 28 33 35 30 29 3b 20 20 2f 2a 20 4c 4f  und(350);  /* LO
d680: 47 3a 20 2a 2e 77 65 62 73 69 74 65 20 70 65 72  G: *.website per
d690: 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  missions */.    
d6a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d6b0: 7a 48 6f 6d 65 20 3d 20 53 74 72 44 75 70 28 7a  zHome = StrDup(z
d6c0: 4c 69 6e 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 61  Line);..  /* Cha
d6d0: 6e 67 65 20 64 69 72 65 63 74 6f 72 69 65 73 20  nge directories 
d6e0: 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  to the root of t
d6f0: 68 65 20 48 54 54 50 20 66 69 6c 65 73 79 73 74  he HTTP filesyst
d700: 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  em.  */.  if( ch
d710: 64 69 72 28 7a 48 6f 6d 65 29 21 3d 30 20 29 7b  dir(zHome)!=0 ){
d720: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 31  .    char zBuf[1
d730: 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c 66 75 6e  000];.    Malfun
d740: 63 74 69 6f 6e 28 33 36 30 2c 20 20 2f 2a 20 4c  ction(360,  /* L
d750: 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61 69 6c  OG: chdir() fail
d760: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 22  ed */.         "
d770: 63 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20  cannot chdir to 
d780: 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c  [%s] from [%s]",
d790: 0a 20 20 20 20 20 20 20 20 20 7a 48 6f 6d 65 2c  .         zHome,
d7a0: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39   getcwd(zBuf,999
d7b0: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  ));.  }..  /* Lo
d7c0: 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 69 6e  cate the file in
d7d0: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e   the filesystem.
d7e0: 20 20 57 65 20 6d 69 67 68 74 20 68 61 76 65 20    We might have 
d7f0: 74 6f 20 61 70 70 65 6e 64 0a 20 20 2a 2a 20 74  to append.  ** t
d800: 68 65 20 6e 61 6d 65 20 22 69 6e 64 65 78 2e 68  he name "index.h
d810: 74 6d 6c 22 20 69 6e 20 6f 72 64 65 72 20 74 6f  tml" in order to
d820: 20 66 69 6e 64 20 69 74 2e 20 20 41 6e 79 20 65   find it.  Any e
d830: 78 63 65 73 73 20 70 61 74 68 0a 20 20 2a 2a 20  xcess path.  ** 
d840: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 70  information is p
d850: 75 74 20 69 6e 74 6f 20 74 68 65 20 7a 50 61 74  ut into the zPat
d860: 68 49 6e 66 6f 20 76 61 72 69 61 62 6c 65 2e 0a  hInfo variable..
d870: 20 20 2a 2f 0a 20 20 6a 20 3d 20 6a 30 20 3d 20    */.  j = j0 = 
d880: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69 6e  (int)strlen(zLin
d890: 65 29 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20 77  e);.  i = 0;.  w
d8a0: 68 69 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d  hile( zScript[i]
d8b0: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   ){.    while( z
d8c0: 53 63 72 69 70 74 5b 69 5d 20 26 26 20 28 69 3d  Script[i] && (i=
d8d0: 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 5d  =0 || zScript[i]
d8e0: 21 3d 27 2f 27 29 20 29 7b 0a 20 20 20 20 20 20  !='/') ){.      
d8f0: 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72 69  zLine[j] = zScri
d900: 70 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 2b 2b  pt[i];.      i++
d910: 3b 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ; j++;.    }.   
d920: 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 30 3b 0a 20   zLine[j] = 0;. 
d930: 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
d940: 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 29  e,&statbuf)!=0 )
d950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 69 6c  {.      int stil
d960: 6c 53 65 61 72 63 68 69 6e 67 20 3d 20 31 3b 0a  lSearching = 1;.
d970: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 74 69        while( sti
d980: 6c 6c 53 65 61 72 63 68 69 6e 67 20 26 26 20 69  llSearching && i
d990: 3e 30 20 26 26 20 6a 3e 6a 30 20 29 7b 0a 20 20  >0 && j>j0 ){.  
d9a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 6a        while( j>j
d9b0: 30 20 26 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 21  0 && zLine[j-1]!
d9c0: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
d9d0: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a         strcpy(&z
d9e0: 4c 69 6e 65 5b 6a 2d 31 5d 2c 20 22 2f 6e 6f 74  Line[j-1], "/not
d9f0: 2d 66 6f 75 6e 64 2e 68 74 6d 6c 22 29 3b 0a 20  -found.html");. 
da00: 20 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28         if( stat(
da10: 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 3d  zLine,&statbuf)=
da20: 3d 30 20 26 26 20 53 5f 49 53 52 45 47 28 73 74  =0 && S_ISREG(st
da30: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20  atbuf.st_mode). 
da40: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 61 63             && ac
da50: 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29  cess(zLine,R_OK)
da60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
da70: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53   zRealScript = S
da80: 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d  trDup(&zLine[j0]
da90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 52 65 64  );.          Red
daa0: 69 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70  irect(zRealScrip
dab0: 74 2c 20 31 2c 20 33 37 30 29 3b 20 2f 2a 20 4c  t, 1, 370); /* L
dac0: 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20  OG: redirect to 
dad0: 6e 6f 74 2d 66 6f 75 6e 64 20 2a 2f 0a 20 20 20  not-found */.   
dae0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
daf0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
db00: 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
db10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
db20: 20 20 20 20 20 69 66 28 20 73 74 69 6c 6c 53 65       if( stillSe
db30: 61 72 63 68 69 6e 67 20 29 20 4e 6f 74 46 6f 75  arching ) NotFou
db40: 6e 64 28 33 38 30 29 3b 20 2f 2a 20 4c 4f 47 3a  nd(380); /* LOG:
db50: 20 55 52 49 20 6e 6f 74 20 66 6f 75 6e 64 20 2a   URI not found *
db60: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
db70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 5f 49     }.    if( S_I
db80: 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f  SREG(statbuf.st_
db90: 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20 20 20 69  mode) ){.      i
dba0: 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c  f( access(zLine,
dbb0: 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  R_OK) ){.       
dbc0: 20 4e 6f 74 46 6f 75 6e 64 28 33 39 30 29 3b 20   NotFound(390); 
dbd0: 20 2f 2a 20 4c 4f 47 3a 20 46 69 6c 65 20 6e 6f   /* LOG: File no
dbe0: 74 20 72 65 61 64 61 62 6c 65 20 2a 2f 0a 20 20  t readable */.  
dbf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61      }.      zRea
dc00: 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70  lScript = StrDup
dc10: 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20  (&zLine[j0]);.  
dc20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
dc30: 0a 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74  .    if( zScript
dc40: 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53 63 72 69 70  [i]==0 || zScrip
dc50: 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  t[i+1]==0 ){.   
dc60: 20 20 20 69 6e 74 20 6b 20 3d 20 6a 3e 30 20 26     int k = j>0 &
dc70: 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 3d 3d 27 2f  & zLine[j-1]=='/
dc80: 27 20 3f 20 6a 2d 31 20 3a 20 6a 3b 0a 20 20 20  ' ? j-1 : j;.   
dc90: 20 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65     strcpy(&zLine
dca0: 5b 6b 5d 2c 22 2f 69 6e 64 65 78 2e 68 74 6d 6c  [k],"/index.html
dcb0: 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ");.      if( st
dcc0: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
dcd0: 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52 45  f)!=0 || !S_ISRE
dce0: 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64  G(statbuf.st_mod
dcf0: 65 29 20 0a 20 20 20 20 20 20 7c 7c 20 61 63 63  e) .      || acc
dd00: 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20  ess(zLine,R_OK) 
dd10: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  ){.        strcp
dd20: 79 28 26 7a 4c 69 6e 65 5b 6b 5d 2c 22 2f 69 6e  y(&zLine[k],"/in
dd30: 64 65 78 2e 63 67 69 22 29 3b 0a 20 20 20 20 20  dex.cgi");.     
dd40: 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
dd50: 65 2c 26 73 74 61 74 62 75 66 29 21 3d 30 20 7c  e,&statbuf)!=0 |
dd60: 7c 20 21 53 5f 49 53 52 45 47 28 73 74 61 74 62  | !S_ISREG(statb
dd70: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a 20 20 20  uf.st_mode) .   
dd80: 20 20 20 20 20 7c 7c 20 61 63 63 65 73 73 28 7a       || access(z
dd90: 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20  Line,R_OK) ){.  
dda0: 20 20 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64          NotFound
ddb0: 28 34 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55  (400); /* LOG: U
ddc0: 52 49 20 69 73 20 61 20 64 69 72 65 63 74 6f 72  RI is a director
ddd0: 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68 74 6d 6c  y w/o index.html
dde0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
ddf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 52 65 61      }.      zRea
de00: 6c 53 63 72 69 70 74 20 3d 20 53 74 72 44 75 70  lScript = StrDup
de10: 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b 0a 20 20  (&zLine[j0]);.  
de20: 20 20 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b      if( zScript[
de30: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
de40: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
de50: 73 74 65 64 20 55 52 4c 20 64 6f 65 73 20 6e 6f  sted URL does no
de60: 74 20 65 6e 64 20 77 69 74 68 20 22 2f 22 20 62  t end with "/" b
de70: 75 74 20 77 65 20 68 61 64 20 74 6f 0a 20 20 20  ut we had to.   
de80: 20 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 22       ** append "
de90: 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20 74 68 65  index.html", the
dea0: 6e 20 61 20 72 65 64 69 72 65 63 74 20 69 73 20  n a redirect is 
deb0: 6e 65 63 65 73 73 61 72 79 2e 20 20 4f 74 68 65  necessary.  Othe
dec0: 72 77 69 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  rwise.        **
ded0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 65 6c   none of the rel
dee0: 61 74 69 76 65 20 55 52 4c 73 20 69 6e 20 74 68  ative URLs in th
def0: 65 20 64 65 6c 69 76 65 72 65 64 20 64 6f 63 75  e delivered docu
df00: 6d 65 6e 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  ment will be.   
df10: 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e       ** correct.
df20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 52 65 64 69   */.        Redi
df30: 72 65 63 74 28 7a 52 65 61 6c 53 63 72 69 70 74  rect(zRealScript
df40: 2c 31 2c 34 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a  ,1,410); /* LOG:
df50: 20 72 65 64 69 72 65 63 74 20 74 6f 20 61 64 64   redirect to add
df60: 20 74 72 61 69 6c 69 6e 67 20 2f 20 2a 2f 0a 20   trailing / */. 
df70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
df80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
df90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4c  ak;.    }.    zL
dfa0: 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72 69 70 74  ine[j] = zScript
dfb0: 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b 20 6a 2b  [i];.    i++; j+
dfc0: 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d  +;.  }.  zFile =
dfd0: 20 53 74 72 44 75 70 28 7a 4c 69 6e 65 29 3b 0a   StrDup(zLine);.
dfe0: 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20 53 74    zPathInfo = St
dff0: 72 44 75 70 28 26 7a 53 63 72 69 70 74 5b 69 5d  rDup(&zScript[i]
e000: 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20 3d 20 73  );.  lenFile = s
e010: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20  trlen(zFile);.  
e020: 7a 44 69 72 20 3d 20 53 74 72 44 75 70 28 7a 46  zDir = StrDup(zF
e030: 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74  ile);.  for(i=st
e040: 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b 20 69 3e  rlen(zDir)-1; i>
e050: 30 20 26 26 20 7a 44 69 72 5b 69 5d 21 3d 27 2f  0 && zDir[i]!='/
e060: 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20 69 66 28  '; i--){};.  if(
e070: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 73 74   i==0 ){.     st
e080: 72 63 70 79 28 7a 44 69 72 2c 22 2f 22 29 3b 0a  rcpy(zDir,"/");.
e090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 7a 44    }else{.     zD
e0a0: 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a  ir[i] = 0;.  }..
e0b0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
e0c0: 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
e0d0: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
e0e0: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ile.  If there i
e0f0: 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  s,.  ** process 
e100: 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70 72 69 6e  it..  */.  sprin
e110: 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 2f 2d 61  tf(zLine, "%s/-a
e120: 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a 20 20 69  uth", zDir);.  i
e130: 66 28 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c  f( access(zLine,
e140: 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21 43 68 65  R_OK)==0 && !Che
e150: 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69 7a 61  ckBasicAuthoriza
e160: 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29 20 72 65  tion(zLine) ) re
e170: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 61 6b 65  turn;..  /* Take
e180: 20 61 70 70 72 6f 70 72 69 61 74 65 20 61 63 74   appropriate act
e190: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ion.  */.  if( (
e1a0: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20  statbuf.st_mode 
e1b0: 26 20 30 31 30 30 29 3d 3d 30 31 30 30 20 26 26  & 0100)==0100 &&
e1c0: 20 61 63 63 65 73 73 28 7a 46 69 6c 65 2c 58 5f   access(zFile,X_
e1d0: 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  OK)==0 ){.    /*
e1e0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
e1f0: 6f 77 69 6e 67 73 20 73 74 61 74 69 63 20 76 61  owings static va
e200: 72 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64  riables are used
e210: 20 74 6f 20 73 65 74 75 70 20 74 68 65 20 65 6e   to setup the en
e220: 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20 20 2a 2a  vironment.    **
e230: 20 66 6f 72 20 74 68 65 20 43 47 49 20 73 63 72   for the CGI scr
e240: 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ipt.    */.    s
e250: 74 61 74 69 63 20 63 68 61 72 20 2a 64 65 66 61  tatic char *defa
e260: 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f 62 69 6e  ult_path = "/bin
e270: 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20  :/usr/bin";.    
e280: 73 74 61 74 69 63 20 63 68 61 72 20 2a 67 61 74  static char *gat
e290: 65 77 61 79 5f 69 6e 74 65 72 66 61 63 65 20 3d  eway_interface =
e2a0: 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20 20 20 20   "CGI/1.0";.    
e2b0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
e2c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 76        char *zEnv
e2d0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Name;.      char
e2e0: 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65 3b 0a 20   **pzEnvValue;. 
e2f0: 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d 20 3d 20     } cgienv[] = 
e300: 7b 0a 20 20 20 20 20 20 7b 20 22 41 55 54 48 5f  {.      { "AUTH_
e310: 54 59 50 45 22 2c 20 20 20 20 20 20 20 20 20 20  TYPE",          
e320: 20 20 20 20 20 20 20 20 20 26 7a 41 75 74 68 54           &zAuthT
e330: 79 70 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ype },.      { "
e340: 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22 2c 20 20  AUTH_CONTENT",  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
e360: 41 75 74 68 41 72 67 20 7d 2c 0a 20 20 20 20 20  AuthArg },.     
e370: 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47   { "CONTENT_LENG
e380: 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
e390: 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74    &zContentLengt
e3a0: 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 43 4f  h },.      { "CO
e3b0: 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20 20 20 20  NTENT_TYPE",    
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 6f              &zCo
e3d0: 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a 20 20 20  ntentType },.   
e3e0: 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e 54 5f 52     { "DOCUMENT_R
e3f0: 4f 4f 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  OOT",           
e400: 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c 0a 20 20      &zHome },.  
e410: 20 20 20 20 7b 20 22 47 41 54 45 57 41 59 5f 49      { "GATEWAY_I
e420: 4e 54 45 52 46 41 43 45 22 2c 20 20 20 20 20 20  NTERFACE",      
e430: 20 20 20 20 20 26 67 61 74 65 77 61 79 5f 69 6e       &gateway_in
e440: 74 65 72 66 61 63 65 20 7d 2c 0a 20 20 20 20 20  terface },.     
e450: 20 7b 20 22 48 54 54 50 5f 41 43 43 45 50 54 22   { "HTTP_ACCEPT"
e460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e470: 20 20 26 7a 41 63 63 65 70 74 20 7d 2c 0a 20 20    &zAccept },.  
e480: 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45      { "HTTP_ACCE
e490: 50 54 5f 45 4e 43 4f 44 49 4e 47 22 2c 20 20 20  PT_ENCODING",   
e4a0: 20 20 20 20 20 26 7a 41 63 63 65 70 74 45 6e 63       &zAcceptEnc
e4b0: 6f 64 69 6e 67 20 7d 2c 0a 20 20 20 20 20 20 7b  oding },.      {
e4c0: 20 22 48 54 54 50 5f 43 4f 4f 4b 49 45 22 2c 20   "HTTP_COOKIE", 
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 26 7a 43 6f 6f 6b 69 65 20 7d 2c 0a 20 20 20 20  &zCookie },.    
e4f0: 20 20 7b 20 22 48 54 54 50 5f 48 4f 53 54 22 2c    { "HTTP_HOST",
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 20 20 26 7a 48 74 74 70 48 6f 73 74 20 7d 2c     &zHttpHost },
e520: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 49  .      { "HTTP_I
e530: 46 5f 4d 4f 44 49 46 49 45 44 5f 53 49 4e 43 45  F_MODIFIED_SINCE
e540: 22 2c 20 20 20 20 20 20 26 7a 49 66 4d 6f 64 69  ",      &zIfModi
e550: 66 69 65 64 53 69 6e 63 65 20 7d 2c 0a 20 20 20  fiedSince },.   
e560: 20 20 20 7b 20 22 48 54 54 50 5f 49 46 5f 4e 4f     { "HTTP_IF_NO
e570: 4e 45 5f 4d 41 54 43 48 22 2c 20 20 20 20 20 20  NE_MATCH",      
e580: 20 20 20 20 26 7a 49 66 4e 6f 6e 65 4d 61 74 63      &zIfNoneMatc
e590: 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54  h },.      { "HT
e5a0: 54 50 5f 52 45 46 45 52 45 52 22 2c 20 20 20 20  TP_REFERER",    
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
e5c0: 66 65 72 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b  ferer },.      {
e5d0: 20 22 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e   "HTTP_USER_AGEN
e5e0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
e5f0: 26 7a 41 67 65 6e 74 20 7d 2c 0a 20 20 20 20 20  &zAgent },.     
e600: 20 7b 20 22 50 41 54 48 22 2c 20 20 20 20 20 20   { "PATH",      
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 20 20 26 64 65 66 61 75 6c 74 5f 70 61 74 68 20    &default_path 
e630: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50 41 54 48  },.      { "PATH
e640: 5f 49 4e 46 4f 22 2c 20 20 20 20 20 20 20 20 20  _INFO",         
e650: 20 20 20 20 20 20 20 20 20 20 26 7a 50 61 74 68            &zPath
e660: 49 6e 66 6f 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Info },.      { 
e670: 22 51 55 45 52 59 5f 53 54 52 49 4e 47 22 2c 20  "QUERY_STRING", 
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e690: 7a 51 75 65 72 79 53 74 72 69 6e 67 20 7d 2c 0a  zQueryString },.
e6a0: 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f        { "REMOTE_
e6b0: 41 44 44 52 22 2c 20 20 20 20 20 20 20 20 20 20  ADDR",          
e6c0: 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 41         &zRemoteA
e6d0: 64 64 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ddr },.      { "
e6e0: 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c  REQUEST_METHOD",
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
e700: 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 20 20 20 20  Method },.      
e710: 7b 20 22 52 45 51 55 45 53 54 5f 55 52 49 22 2c  { "REQUEST_URI",
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 26 7a 53 63 72 69 70 74 20 7d 2c 0a 20 20 20   &zScript },.   
e740: 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f 55 53 45     { "REMOTE_USE
e750: 52 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  R",             
e760: 20 20 20 20 26 7a 52 65 6d 6f 74 65 55 73 65 72      &zRemoteUser
e770: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52   },.      { "SCR
e780: 49 50 54 5f 44 49 52 45 43 54 4f 52 59 22 2c 20  IPT_DIRECTORY", 
e790: 20 20 20 20 20 20 20 20 20 20 20 26 7a 44 69 72             &zDir
e7a0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43 52   },.      { "SCR
e7b0: 49 50 54 5f 46 49 4c 45 4e 41 4d 45 22 2c 20 20  IPT_FILENAME",  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 26 7a 46 69 6c             &zFil
e7d0: 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 43  e },.      { "SC
e7e0: 52 49 50 54 5f 4e 41 4d 45 22 2c 20 20 20 20 20  RIPT_NAME",     
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
e800: 61 6c 53 63 72 69 70 74 20 7d 2c 0a 20 20 20 20  alScript },.    
e810: 20 20 7b 20 22 53 45 52 56 45 52 5f 4e 41 4d 45    { "SERVER_NAME
e820: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
e830: 20 20 20 26 7a 53 65 72 76 65 72 4e 61 6d 65 20     &zServerName 
e840: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56  },.      { "SERV
e850: 45 52 5f 50 4f 52 54 22 2c 20 20 20 20 20 20 20  ER_PORT",       
e860: 20 20 20 20 20 20 20 20 20 20 26 7a 53 65 72 76            &zServ
e870: 65 72 50 6f 72 74 20 7d 2c 0a 20 20 20 20 20 20  erPort },.      
e880: 7b 20 22 53 45 52 56 45 52 5f 50 52 4f 54 4f 43  { "SERVER_PROTOC
e890: 4f 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OL",            
e8a0: 20 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d 2c 0a 20   &zProtocol },. 
e8b0: 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 20 2a     };.    char *
e8c0: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 3b 20 20  zBaseFilename;  
e8d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
e8e0: 6d 65 20 77 69 74 68 6f 75 74 20 64 69 72 65 63  me without direc
e8f0: 74 6f 72 79 20 70 72 65 66 69 78 20 2a 2f 0a 20  tory prefix */. 
e900: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6e 74 65     int seenConte
e910: 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b 20 20 20  ntLength = 0;   
e920: 2f 2a 20 54 72 75 65 20 69 66 20 43 6f 6e 74 65  /* True if Conte
e930: 6e 74 2d 6c 65 6e 67 74 68 3a 20 68 65 61 64 65  nt-length: heade
e940: 72 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  r seen */.    in
e950: 74 20 6e 52 65 73 20 3d 20 30 3b 20 20 20 20 20  t nRes = 0;     
e960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e970: 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 2a  tes of payload *
e980: 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f  /.    int nMallo
e990: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
e9a0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
e9b0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74  pace allocated t
e9c0: 6f 20 61 52 65 73 20 2a 2f 0a 20 20 20 20 63 68  o aRes */.    ch
e9d0: 61 72 20 2a 61 52 65 73 20 3d 20 30 3b 20 20 20  ar *aRes = 0;   
e9e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
e9f0: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 20 20 2f 2a  yload */..    /*
ea00: 20 49 66 20 69 74 73 20 65 78 65 63 75 74 61 62   If its executab
ea10: 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61  le, it must be a
ea20: 20 43 47 49 20 70 72 6f 67 72 61 6d 2e 20 20 53   CGI program.  S
ea30: 74 61 72 74 20 62 79 0a 20 20 20 20 2a 2a 20 63  tart by.    ** c
ea40: 68 61 6e 67 69 6e 67 20 64 69 72 65 63 74 6f 72  hanging director
ea50: 69 65 73 20 74 6f 20 74 68 65 20 64 69 72 65 63  ies to the direc
ea60: 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74 68 65  tory holding the
ea70: 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f   program..    */
ea80: 0a 20 20 20 20 69 66 28 20 63 68 64 69 72 28 7a  .    if( chdir(z
ea90: 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 63 68  Dir) ){.      ch
eaa0: 61 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20  ar zBuf[1000];. 
eab0: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
eac0: 28 34 32 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68  (420, /* LOG: ch
ead0: 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  dir() failed */.
eae0: 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
eaf0: 6f 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d  ot chdir to [%s]
eb00: 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20   from [%s]", .  
eb10: 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 67           zDir, g
eb20: 65 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29  etcwd(zBuf,999))
eb30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
eb40: 53 65 74 75 70 20 74 68 65 20 65 6e 76 69 72 6f  Setup the enviro
eb50: 6e 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  nment appropriat
eb60: 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ely..    */.    
eb70: 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29  for(i=0; i<(int)
eb80: 28 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f  (sizeof(cgienv)/
eb90: 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d  sizeof(cgienv[0]
eba0: 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  )); i++){.      
ebb0: 69 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d 2e 70  if( *cgienv[i].p
ebc0: 7a 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20 20 20  zEnvValue ){.   
ebd0: 20 20 20 20 20 53 65 74 45 6e 76 28 63 67 69 65       SetEnv(cgie
ebe0: 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 2a  nv[i].zEnvName,*
ebf0: 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56  cgienv[i].pzEnvV
ec00: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  alue);.      }. 
ec10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65     }.    if( use
ec20: 48 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 70  Https ){.      p
ec30: 75 74 65 6e 76 28 22 48 54 54 50 53 3d 6f 6e 22  utenv("HTTPS=on"
ec40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
ec50: 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74 20 77 69  .    ** Abort wi
ec60: 74 68 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  th an error if t
ec70: 68 65 20 43 47 49 20 73 63 72 69 70 74 20 69 73  he CGI script is
ec80: 20 77 72 69 74 61 62 6c 65 20 62 79 20 61 6e 79   writable by any
ec90: 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  one other.    **
eca0: 20 74 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e   than its owner.
ecb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ecc0: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20  statbuf.st_mode 
ecd0: 26 20 30 30 32 32 20 29 7b 0a 20 20 20 20 20 20  & 0022 ){.      
ece0: 43 67 69 53 63 72 69 70 74 57 72 69 74 61 62 6c  CgiScriptWritabl
ecf0: 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e();.    }..    
ed00: 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f 53 54 20  /* For the POST 
ed10: 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70 75 74  method all input
ed20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
ed30: 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79  n to a temporary
ed40: 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20 73 6f   file,.    ** so
ed50: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 64 69   we have to redi
ed60: 72 65 63 74 20 69 6e 70 75 74 20 74 6f 20 74 68  rect input to th
ed70: 65 20 43 47 49 20 73 63 72 69 70 74 20 66 72 6f  e CGI script fro
ed80: 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a 20 20 20  m that file..   
ed90: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d 65 74   */.    if( zMet
eda0: 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a 20  hod[0]=='P' ){. 
edb0: 20 20 20 20 20 69 66 28 20 64 75 70 28 30 29 3c       if( dup(0)<
edc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c  0 ){.        Mal
edd0: 66 75 6e 63 74 69 6f 6e 28 34 33 30 2c 20 20 2f  function(430,  /
ede0: 2a 20 4c 4f 47 3a 20 64 75 70 28 30 29 20 66 61  * LOG: dup(0) fa
edf0: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 61              "Una
ee10: 62 6c 65 20 74 6f 20 64 75 70 6c 69 63 61 74 69  ble to duplicati
ee20: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
ee30: 6f 72 20 30 22 29 3b 0a 20 20 20 20 20 20 7d 0a  or 0");.      }.
ee40: 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a        close(0);.
ee50: 20 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e        open(zTmpN
ee60: 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  am, O_RDONLY);. 
ee70: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
ee80: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b  strlen(zFile)-1;
ee90: 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69   i>=0 && zFile[i
eea0: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
eeb0: 20 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65     zBaseFilename
eec0: 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a   = &zFile[i+1];.
eed0: 20 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20      if( i>=0 && 
eee0: 73 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c  strncmp(zBaseFil
eef0: 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d  ename,"nph-",4)=
ef00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
ef10: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
ef20: 65 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67  e CGI script beg
ef30: 69 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20  ins with "nph-" 
ef40: 74 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20  then we are.    
ef50: 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
ef60: 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20  h a "non-parsed 
ef70: 68 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72  headers" CGI scr
ef80: 69 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28  ipt.  Just exec(
ef90: 29 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69  ).      ** it di
efa0: 72 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69  rectly and let i
efb0: 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73  t handle all its
efc0: 20 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65   own header gene
efd0: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  ration..      */
efe0: 0a 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61  .      execl(zBa
eff0: 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65  seFilename,zBase
f000: 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29  Filename,(char*)
f010: 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54  0);.      /* NOT
f020: 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20  E: No log entry 
f030: 77 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d  written for nph-
f040: 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20   scripts */.    
f050: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d    exit(0);.    }
f060: 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68  ..    /* Fall th
f070: 72 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20  ru to here only 
f080: 69 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  if this process 
f090: 28 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20  (the server) is 
f0a0: 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20  going.    ** to 
f0b0: 72 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74  read and augment
f0c0: 20 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74   the header sent
f0d0: 20 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49   back by the CGI
f0e0: 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a   process..    **
f0f0: 20 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20   Open a pipe to 
f100: 72 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70  receive the outp
f110: 75 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20  ut from the CGI 
f120: 70 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20  process.  Then. 
f130: 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43     ** fork the C
f140: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63  GI process.  Onc
f150: 65 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  e everything is 
f160: 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20  done, we should 
f170: 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74  be.    ** able t
f180: 6f 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75  o read the outpu
f190: 74 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20  t of CGI on the 
f1a0: 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20  "in" stream..   
f1b0: 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20   */.    {.      
f1c0: 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20  int px[2];.     
f1d0: 20 69 66 28 20 70 69 70 65 28 70 78 29 20 29 7b   if( pipe(px) ){
f1e0: 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63  .        Malfunc
f1f0: 74 69 6f 6e 28 34 34 30 2c 20 2f 2a 20 4c 4f 47  tion(440, /* LOG
f200: 3a 20 70 69 70 65 28 29 20 66 61 69 6c 65 64 20  : pipe() failed 
f210: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
f220: 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74         "Unable t
f230: 6f 20 63 72 65 61 74 65 20 61 20 70 69 70 65 20  o create a pipe 
f240: 66 6f 72 20 74 68 65 20 43 47 49 20 70 72 6f 67  for the CGI prog
f250: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ram");.      }. 
f260: 20 20 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d       if( fork()=
f270: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  =0 ){.        cl
f280: 6f 73 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20  ose(px[0]);.    
f290: 20 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20      close(1);.  
f2a0: 20 20 20 20 20 20 69 66 28 20 64 75 70 28 70 78        if( dup(px
f2b0: 5b 31 5d 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  [1])!=1 ){.     
f2c0: 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
f2d0: 28 34 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20 64 75  (450, /* LOG: du
f2e0: 70 28 31 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  p(1) failed */. 
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 22 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69  "Unable to dupli
f310: 63 61 74 65 20 66 69 6c 65 20 64 65 73 63 72 69  cate file descri
f320: 70 74 6f 72 20 25 64 20 74 6f 20 31 22 2c 0a 20  ptor %d to 1",. 
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[1]);.        
f350: 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28  }.        close(
f360: 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  px[1]);.        
f370: 65 78 65 63 6c 28 7a 42 61 73 65 46 69 6c 65 6e  execl(zBaseFilen
f380: 61 6d 65 2c 20 7a 42 61 73 65 46 69 6c 65 6e 61  ame, zBaseFilena
f390: 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
f3a0: 20 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a         exit(0);.
f3b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
f3c0: 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20  ose(px[1]);.    
f3d0: 20 20 69 6e 20 3d 20 66 64 6f 70 65 6e 28 70 78    in = fdopen(px
f3e0: 5b 30 5d 2c 20 22 72 22 29 3b 0a 20 20 20 20 7d  [0], "r");.    }
f3f0: 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  .    if( in==0 )
f400: 7b 0a 20 20 20 20 20 20 43 67 69 45 72 72 6f 72  {.      CgiError
f410: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ();.    }..    /
f420: 2a 20 52 65 61 64 20 61 6e 64 20 70 72 6f 63 65  * Read and proce
f430: 73 73 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e  ss the first lin
f440: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
f450: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a  returned by the.
f460: 20 20 20 20 2a 2a 20 43 47 49 20 73 63 72 69 70      ** CGI scrip
f470: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
f480: 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
f490: 6c 61 72 6d 28 31 35 29 3b 0a 20 20 20 20 77 68  larm(15);.    wh
f4a0: 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
f4b0: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 69  ,sizeof(zLine),i
f4c0: 6e 29 20 26 26 20 21 69 73 73 70 61 63 65 28 7a  n) && !isspace(z
f4d0: 4c 69 6e 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Line[0]) ){.    
f4e0: 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d    if( strncasecm
f4f0: 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61 74 69 6f  p(zLine,"Locatio
f500: 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a 20 20 20  n:",9)==0 ){.   
f510: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
f520: 73 65 28 22 33 30 32 20 52 65 64 69 72 65 63 74  se("302 Redirect
f530: 22 29 3b 0a 20 20 20 20 20 20 20 20 52 65 6d 6f  ");.        Remo
f540: 76 65 4e 65 77 6c 69 6e 65 28 7a 4c 69 6e 65 29  veNewline(zLine)
f550: 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 26 7a  ;.        z = &z
f560: 4c 69 6e 65 5b 31 30 5d 3b 0a 20 20 20 20 20 20  Line[10];.      
f570: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
f580: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
f590: 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70         nOut += p
f5a0: 72 69 6e 74 66 28 22 4c 6f 63 61 74 69 6f 6e 3a  rintf("Location:
f5b0: 20 25 73 5c 72 5c 6e 22 2c 7a 29 3b 0a 20 20 20   %s\r\n",z);.   
f5c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
f5d0: 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 22  ncasecmp(zLine,"
f5e0: 53 74 61 74 75 73 3a 22 2c 37 29 3d 3d 30 20 29  Status:",7)==0 )
f5f0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
f600: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 37  .        for(i=7
f610: 3b 20 69 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b  ; isspace(zLine[
f620: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
f630: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
f640: 74 66 28 22 25 73 20 25 73 22 2c 20 7a 50 72 6f  tf("%s %s", zPro
f650: 74 6f 63 6f 6c 2c 20 26 7a 4c 69 6e 65 5b 69 5d  tocol, &zLine[i]
f660: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 6e 63  );.        strnc
f670: 70 79 28 7a 52 65 70 6c 79 53 74 61 74 75 73 2c  py(zReplyStatus,
f680: 20 26 7a 4c 69 6e 65 5b 69 5d 2c 20 33 29 3b 0a   &zLine[i], 3);.
f690: 20 20 20 20 20 20 20 20 7a 52 65 70 6c 79 53 74          zReplySt
f6a0: 61 74 75 73 5b 33 5d 20 3d 20 30 3b 0a 20 20 20  atus[3] = 0;.   
f6b0: 20 20 20 20 20 73 74 61 74 75 73 53 65 6e 74 20       statusSent 
f6c0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
f6d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  {.        if( st
f6e0: 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c  rncasecmp(zLine,
f6f0: 20 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68   "Content-length
f700: 3a 22 2c 20 31 34 29 3d 3d 30 20 29 7b 0a 20 20  :", 14)==0 ){.  
f710: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6e 74          seenCont
f720: 65 6e 74 4c 65 6e 67 74 68 20 3d 20 31 3b 0a 20  entLength = 1;. 
f730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f740: 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22   StartResponse("
f750: 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 20 20  200 OK");.      
f760: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
f770: 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a 20 20  ("%s",zLine);.  
f780: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f790: 20 2f 2a 20 43 6f 70 79 20 65 76 65 72 79 74 68   /* Copy everyth
f7a0: 69 6e 67 20 65 6c 73 65 20 74 68 72 75 20 77 69  ing else thru wi
f7b0: 74 68 6f 75 74 20 63 68 61 6e 67 65 20 6f 72 20  thout change or 
f7c0: 61 6e 61 6c 79 73 69 73 2e 0a 20 20 20 20 2a 2f  analysis..    */
f7d0: 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e  .    StartRespon
f7e0: 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20  se("200 OK");.  
f7f0: 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74    if( useTimeout
f800: 20 29 20 61 6c 61 72 6d 28 36 30 2a 35 29 3b 0a   ) alarm(60*5);.
f810: 20 20 20 20 69 66 28 20 73 65 65 6e 43 6f 6e 74      if( seenCont
f820: 65 6e 74 4c 65 6e 67 74 68 20 29 7b 0a 20 20 20  entLength ){.   
f830: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
f840: 66 28 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a  f("%s", zLine);.
f850: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20        while( (c 
f860: 3d 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46  = getc(in))!=EOF
f870: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 63   ){.        putc
f880: 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  (c,stdout);.    
f890: 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20      nOut++;.    
f8a0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f8b0: 20 20 20 20 20 6e 52 65 73 20 3d 20 30 3b 0a 20       nRes = 0;. 
f8c0: 20 20 20 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20 31       nMalloc = 1
f8d0: 30 30 30 3b 0a 20 20 20 20 20 20 61 52 65 73 20  000;.      aRes 
f8e0: 3d 20 6d 61 6c 6c 6f 63 28 6e 4d 61 6c 6c 6f 63  = malloc(nMalloc
f8f0: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  +1);.      if( a
f900: 52 65 73 3d 3d 30 20 29 20 4d 61 6c 66 75 6e 63  Res==0 ) Malfunc
f910: 74 69 6f 6e 28 36 30 30 2c 22 4f 75 74 20 6f 66  tion(600,"Out of
f920: 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65   memory: %d byte
f930: 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20  s", nMalloc);.  
f940: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
f950: 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29  getc(in))!=EOF )
f960: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52  {.        if( nR
f970: 65 73 3e 3d 6e 4d 61 6c 6c 6f 63 20 29 7b 0a 20  es>=nMalloc ){. 
f980: 20 20 20 20 20 20 20 20 20 6e 4d 61 6c 6c 6f 63           nMalloc
f990: 20 3d 20 6e 4d 61 6c 6c 6f 63 2a 32 3b 0a 20 20   = nMalloc*2;.  
f9a0: 20 20 20 20 20 20 20 20 61 52 65 73 20 3d 20 72          aRes = r
f9b0: 65 61 6c 6c 6f 63 28 61 52 65 73 2c 20 6e 4d 61  ealloc(aRes, nMa
f9c0: 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20 20 20 20 20  lloc+1);.       
f9d0: 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20 29     if( aRes==0 )
f9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 4d  {.             M
f9f0: 61 6c 66 75 6e 63 74 69 6f 6e 28 36 31 30 2c 20  alfunction(610, 
fa00: 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 3a 20  "Out of memory: 
fa10: 25 64 20 62 79 74 65 73 22 2c 20 6e 4d 61 6c 6c  %d bytes", nMall
fa20: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  oc);.          }
fa30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fa40: 20 20 20 61 52 65 73 5b 6e 52 65 73 2b 2b 5d 20     aRes[nRes++] 
fa50: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = c;.      }.   
fa60: 20 20 20 61 52 65 73 5b 6e 52 65 73 5d 20 3d 20     aRes[nRes] = 
fa70: 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  0;.      nOut +=
fa80: 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65 6e 74   printf("Content
fa90: 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 5c  -length: %d\r\n\
faa0: 72 5c 6e 25 73 22 2c 20 6e 52 65 73 2c 20 61 52  r\n%s", nRes, aR
fab0: 65 73 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  es);.      free(
fac0: 61 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aRes);.    }.   
fad0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d   fclose(in);.  }
fae0: 65 6c 73 65 20 69 66 28 20 63 6f 75 6e 74 53 6c  else if( countSl
faf0: 61 73 68 65 73 28 7a 52 65 61 6c 53 63 72 69 70  ashes(zRealScrip
fb00: 74 29 21 3d 63 6f 75 6e 74 53 6c 61 73 68 65 73  t)!=countSlashes
fb10: 28 7a 53 63 72 69 70 74 29 20 29 7b 0a 20 20 20  (zScript) ){.   
fb20: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
fb30: 73 74 20 55 52 49 20 66 6f 72 20 73 74 61 74 69  st URI for stati
fb40: 63 20 63 6f 6e 74 65 6e 74 20 63 6f 6e 74 61 69  c content contai
fb50: 6e 73 20 6d 61 74 65 72 69 61 6c 20 70 61 73 74  ns material past
fb60: 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 63 74 75   the.    ** actu
fb70: 61 6c 20 63 6f 6e 74 65 6e 74 20 66 69 6c 65 20  al content file 
fb80: 6e 61 6d 65 2c 20 72 65 70 6f 72 74 20 74 68 61  name, report tha
fb90: 74 20 61 73 20 61 20 34 30 34 20 65 72 72 6f 72  t as a 404 error
fba0: 2e 20 2a 2f 0a 20 20 20 20 4e 6f 74 46 6f 75 6e  . */.    NotFoun
fbb0: 64 28 34 36 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  d(460); /* LOG: 
fbc0: 45 78 63 65 73 73 20 55 52 49 20 63 6f 6e 74 65  Excess URI conte
fbd0: 6e 74 20 70 61 73 74 20 73 74 61 74 69 63 20 66  nt past static f
fbe0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 7d 65  ile name */.  }e
fbf0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69  lse{.    /* If i
fc00: 74 20 69 73 6e 27 74 20 65 78 65 63 75 74 61 62  t isn't executab
fc10: 6c 65 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a  le then it.    *
fc20: 2a 20 6d 75 73 74 20 61 20 73 69 6d 70 6c 65 20  * must a simple 
fc30: 66 69 6c 65 20 74 68 61 74 20 6e 65 65 64 73 20  file that needs 
fc40: 74 6f 20 62 65 20 63 6f 70 69 65 64 20 74 6f 20  to be copied to 
fc50: 6f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2f 0a 20  output..    */. 
fc60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fc70: 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 47 65  ContentType = Ge
fc80: 74 4d 69 6d 65 54 79 70 65 28 7a 46 69 6c 65 2c  tMimeType(zFile,
fc90: 20 6c 65 6e 46 69 6c 65 29 3b 0a 20 20 20 20 74   lenFile);.    t
fca0: 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 63 68 61  ime_t t;.    cha
fcb0: 72 20 7a 45 54 61 67 5b 31 30 30 5d 3b 0a 0a 20  r zETag[100];.. 
fcc0: 20 20 20 69 66 28 20 7a 54 6d 70 4e 61 6d 20 29     if( zTmpNam )
fcd0: 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e 61 6d 29   unlink(zTmpNam)
fce0: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 45  ;.    sprintf(zE
fcf0: 54 61 67 2c 20 22 6d 25 78 73 25 78 22 2c 20 28  Tag, "m%xs%x", (
fd00: 69 6e 74 29 73 74 61 74 62 75 66 2e 73 74 5f 6d  int)statbuf.st_m
fd10: 74 69 6d 65 2c 20 28 69 6e 74 29 73 74 61 74 62  time, (int)statb
fd20: 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
fd30: 20 69 66 28 20 43 6f 6d 70 61 72 65 45 74 61 67   if( CompareEtag
fd40: 73 28 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 2c 7a  s(zIfNoneMatch,z
fd50: 45 54 61 67 29 3d 3d 30 0a 20 20 20 20 20 7c 7c  ETag)==0.     ||
fd60: 20 28 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e   (zIfModifiedSin
fd70: 63 65 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ce!=0.          
fd80: 26 26 20 28 74 20 3d 20 50 61 72 73 65 52 66 63  && (t = ParseRfc
fd90: 38 32 32 44 61 74 65 28 7a 49 66 4d 6f 64 69 66  822Date(zIfModif
fda0: 69 65 64 53 69 6e 63 65 29 29 3e 30 0a 20 20 20  iedSince))>0.   
fdb0: 20 20 20 20 20 20 20 26 26 20 74 3e 3d 73 74 61         && t>=sta
fdc0: 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65 29 0a 20  tbuf.st_mtime). 
fdd0: 20 20 20 29 7b 0a 20 20 20 20 20 20 53 74 61 72     ){.      Star
fde0: 74 52 65 73 70 6f 6e 73 65 28 22 33 30 34 20 4e  tResponse("304 N
fdf0: 6f 74 20 4d 6f 64 69 66 69 65 64 22 29 3b 0a 20  ot Modified");. 
fe00: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74       nOut += Dat
fe10: 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66  eTag("Last-Modif
fe20: 69 65 64 22 2c 20 73 74 61 74 62 75 66 2e 73 74  ied", statbuf.st
fe30: 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20 20 20 6e  _mtime);.      n
fe40: 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43  Out += printf("C
fe50: 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61  ache-Control: ma
fe60: 78 2d 61 67 65 3d 25 64 5c 72 5c 6e 22 2c 20 6d  x-age=%d\r\n", m
fe70: 78 41 67 65 29 3b 0a 20 20 20 20 20 20 6e 4f 75  xAge);.      nOu
fe80: 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 45 54 61  t += printf("ETa
fe90: 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 20  g: \"%s\"\r\n", 
fea0: 7a 45 54 61 67 29 3b 0a 20 20 20 20 20 20 6e 4f  zETag);.      nO
feb0: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 5c 72  ut += printf("\r
fec0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 66 6c 75  \n");.      fflu
fed0: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
fee0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
fef0: 2c 20 34 37 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  , 470);  /* LOG:
ff00: 20 45 54 61 67 20 43 61 63 68 65 20 48 69 74 20   ETag Cache Hit 
ff10: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
ff20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
ff30: 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22 72 22 29  fopen(zFile,"r")
ff40: 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  ;.    if( in==0 
ff50: 29 20 4e 6f 74 46 6f 75 6e 64 28 34 38 30 29 3b  ) NotFound(480);
ff60: 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65 6e 28 29   /* LOG: fopen()
ff70: 20 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61 74   failed for stat
ff80: 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ic content */.  
ff90: 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28    StartResponse(
ffa0: 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20 6e  "200 OK");.    n
ffb0: 4f 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22  Out += DateTag("
ffc0: 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64 22 2c 20  Last-Modified", 
ffd0: 73 74 61 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65  statbuf.st_mtime
ffe0: 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  );.    nOut += p
fff0: 72 69 6e 74 66 28 22 43 61 63 68 65 2d 43 6f 6e  rintf("Cache-Con
10000 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 25 64  trol: max-age=%d
10010 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29 3b 0a 20  \r\n", mxAge);. 
10020 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
10030 66 28 22 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c  f("ETag: \"%s\"\
10040 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b 0a 20 20  r\n", zETag);.  
10050 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
10060 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20  ("Content-type: 
10070 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74 65 6e 74  %s\r\n",zContent
10080 54 79 70 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20  Type);.    nOut 
10090 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74 65  += printf("Conte
100a0 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72 5c  nt-length: %d\r\
100b0 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 73 74 61 74  n\r\n",(int)stat
100c0 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
100d0 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
100e0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  ;.    if( strcmp
100f0 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41 44 22 29  (zMethod,"HEAD")
10100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6b  ==0 ){.      Mak
10110 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 29 3b  eLogEntry(0, 2);
10120 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20   /* LOG: Normal 
10130 48 45 41 44 20 72 65 70 6c 79 20 2a 2f 0a 20 20  HEAD reply */.  
10140 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
10150 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64        fflush(std
10160 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  out);.      retu
10170 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
10180 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
10190 6c 61 72 6d 28 33 30 20 2b 20 73 74 61 74 62 75  larm(30 + statbu
101a0 66 2e 73 74 5f 73 69 7a 65 2f 31 30 30 30 29 3b  f.st_size/1000);
101b0 0a 23 69 66 64 65 66 20 6c 69 6e 75 78 0a 20 20  .#ifdef linux.  
101c0 20 20 7b 0a 20 20 20 20 20 20 6f 66 66 5f 74 20    {.      off_t 
101d0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
101e0 20 20 6e 4f 75 74 20 2b 3d 20 73 65 6e 64 66 69    nOut += sendfi
101f0 6c 65 28 66 69 6c 65 6e 6f 28 73 74 64 6f 75 74  le(fileno(stdout
10200 29 2c 20 66 69 6c 65 6e 6f 28 69 6e 29 2c 20 26  ), fileno(in), &
10210 6f 66 66 73 65 74 2c 20 73 74 61 74 62 75 66 2e  offset, statbuf.
10220 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  st_size);.    }.
10230 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
10240 20 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21   (c = getc(in))!
10250 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 70 75  =EOF ){.      pu
10260 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20 20  tc(c,stdout);.  
10270 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20      nOut++;.    
10280 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 66 63 6c  }.#endif.    fcl
10290 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a 20 20 66  ose(in);.  }.  f
102a0 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
102b0 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
102c0 20 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4e 6f   0);  /* LOG: No
102d0 72 6d 61 6c 20 72 65 70 6c 79 20 2a 2f 0a 0a 20  rmal reply */.. 
102e0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 65 71   /* The next req
102f0 75 65 73 74 20 6d 75 73 74 20 61 72 72 69 76 65  uest must arrive
10300 20 77 69 74 68 69 6e 20 33 30 20 73 65 63 6f 6e   within 30 secon
10310 64 73 20 6f 72 20 77 65 20 63 6c 6f 73 65 20 74  ds or we close t
10320 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  he connection.  
10330 2a 2f 0a 20 20 6f 6d 69 74 4c 6f 67 20 3d 20 31  */.  omitLog = 1
10340 3b 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f  ;.  if( useTimeo
10350 75 74 20 29 20 61 6c 61 72 6d 28 33 30 29 3b 0a  ut ) alarm(30);.
10360 7d 0a 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50  }..#define MAX_P
10370 41 52 41 4c 4c 45 4c 20 35 30 20 20 2f 2a 20 4e  ARALLEL 50  /* N
10380 75 6d 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61  umber of simulta
10390 6e 65 6f 75 73 20 63 68 69 6c 64 72 65 6e 20 2a  neous children *
103a0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 70 6f 73  /../*.** All pos
103b0 73 69 62 6c 65 20 66 6f 72 6d 73 20 6f 66 20 61  sible forms of a
103c0 6e 20 49 50 20 61 64 64 72 65 73 73 2e 20 20 4e  n IP address.  N
103d0 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 20 61 72  eeded to work ar
103e0 6f 75 6e 64 20 47 43 43 20 73 74 72 69 63 74 0a  ound GCC strict.
103f0 2a 2a 20 61 6c 69 61 73 69 6e 67 20 72 75 6c 65  ** aliasing rule
10400 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 75 6e  s..*/.typedef un
10410 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ion {.  struct s
10420 6f 63 6b 61 64 64 72 20 73 61 3b 20 20 20 20 20  ockaddr sa;     
10430 20 20 20 20 20 20 20 20 20 2f 2a 20 41 62 73 74           /* Abst
10440 72 61 63 74 20 73 75 70 65 72 63 6c 61 73 73 20  ract superclass 
10450 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b  */.  struct sock
10460 61 64 64 72 5f 69 6e 20 73 61 34 3b 20 20 20 20  addr_in sa4;    
10470 20 20 20 20 20 20 2f 2a 20 49 50 76 34 20 2a 2f        /* IPv4 */
10480 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64  .  struct sockad
10490 64 72 5f 69 6e 36 20 73 61 36 3b 20 20 20 20 20  dr_in6 sa6;     
104a0 20 20 20 20 2f 2a 20 49 50 76 36 20 2a 2f 0a 20      /* IPv6 */. 
104b0 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72   struct sockaddr
104c0 5f 73 74 6f 72 61 67 65 20 73 61 73 3b 20 20 20  _storage sas;   
104d0 20 20 2f 2a 20 53 68 6f 75 6c 64 20 62 65 20 74    /* Should be t
104e0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
104f0 65 20 61 62 6f 76 65 20 33 20 2a 2f 0a 7d 20 61  e above 3 */.} a
10500 64 64 72 65 73 73 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ddress;../*.** I
10510 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54 50  mplement an HTTP
10520 20 73 65 72 76 65 72 20 64 61 65 6d 6f 6e 20 6c   server daemon l
10530 69 73 74 65 6e 69 6e 67 20 6f 6e 20 70 6f 72 74  istening on port
10540 20 69 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73   iPort..**.** As
10550 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   new connections
10560 20 61 72 72 69 76 65 2c 20 66 6f 72 6b 20 61 20   arrive, fork a 
10570 63 68 69 6c 64 20 61 6e 64 20 6c 65 74 20 63 68  child and let ch
10580 69 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6f 75  ild return.** ou
10590 74 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  t of this proced
105a0 75 72 65 20 63 61 6c 6c 2e 20 20 54 68 65 20 63  ure call.  The c
105b0 68 69 6c 64 20 77 69 6c 6c 20 68 61 6e 64 6c 65  hild will handle
105c0 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2a   the request..**
105d0 20 54 68 65 20 70 61 72 65 6e 74 20 6e 65 76 65   The parent neve
105e0 72 20 72 65 74 75 72 6e 73 20 66 72 6f 6d 20 74  r returns from t
105f0 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a  his procedure..*
10600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 74 6f  *.** Return 0 to
10610 20 65 61 63 68 20 63 68 69 6c 64 20 61 73 20 69   each child as i
10620 74 20 72 75 6e 73 2e 20 20 49 66 20 75 6e 61 62  t runs.  If unab
10630 6c 65 20 74 6f 20 65 73 74 61 62 6c 69 73 68 20  le to establish 
10640 61 0a 2a 2a 20 6c 69 73 74 65 6e 69 6e 67 20 73  a.** listening s
10650 6f 63 6b 65 74 2c 20 72 65 74 75 72 6e 20 6e 6f  ocket, return no
10660 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 68  n-zero..*/.int h
10670 74 74 70 5f 73 65 72 76 65 72 28 63 6f 6e 73 74  ttp_server(const
10680 20 63 68 61 72 20 2a 7a 50 6f 72 74 2c 20 69 6e   char *zPort, in
10690 74 20 6c 6f 63 61 6c 4f 6e 6c 79 29 7b 0a 20 20  t localOnly){.  
106a0 69 6e 74 20 6c 69 73 74 65 6e 65 72 5b 32 30 5d  int listener[20]
106b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
106c0 54 68 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65  The server socke
106d0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e  ts */.  int conn
106e0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
106f0 20 20 20 20 20 2f 2a 20 41 20 73 6f 63 6b 65 74       /* A socket
10700 20 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69   for each indivi
10710 64 75 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  dual connection 
10720 2a 2f 0a 20 20 66 64 5f 73 65 74 20 72 65 61 64  */.  fd_set read
10730 66 64 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  fds;            
10740 20 20 2f 2a 20 53 65 74 20 6f 66 20 66 69 6c 65    /* Set of file
10750 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
10760 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 61   select() */.  a
10770 64 64 72 65 73 73 20 69 6e 61 64 64 72 3b 20 20  ddress inaddr;  
10780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10790 65 6d 6f 74 65 20 61 64 64 72 65 73 73 20 2a 2f  emote address */
107a0 0a 20 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e  .  socklen_t len
107b0 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
107c0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
107d0 20 69 6e 61 64 64 72 20 73 74 72 75 63 74 75 72   inaddr structur
107e0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 69 6c 64  e */.  int child
107f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10800 20 20 20 20 2f 2a 20 50 49 44 20 6f 66 20 74 68      /* PID of th
10810 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20  e child process 
10820 2a 2f 0a 20 20 69 6e 74 20 6e 63 68 69 6c 64 72  */.  int nchildr
10830 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
10840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
10850 68 69 6c 64 20 70 72 6f 63 65 73 73 65 73 20 2a  hild processes *
10860 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76  /.  struct timev
10870 61 6c 20 64 65 6c 61 79 3b 20 20 20 20 20 20 20  al delay;       
10880 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20 74 6f 20   /* How long to 
10890 77 61 69 74 20 69 6e 73 69 64 65 20 73 65 6c 65  wait inside sele
108a0 63 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  ct() */.  int op
108b0 74 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  t = 1;          
108c0 20 20 20 20 20 20 20 2f 2a 20 73 65 74 73 6f 63         /* setsoc
108d0 6b 6f 70 74 20 66 6c 61 67 20 2a 2f 0a 20 20 73  kopt flag */.  s
108e0 74 72 75 63 74 20 61 64 64 72 69 6e 66 6f 20 73  truct addrinfo s
108f0 48 69 6e 74 73 3b 20 20 20 20 20 20 2f 2a 20 41  Hints;      /* A
10900 64 64 72 65 73 73 20 68 69 6e 74 73 20 2a 2f 0a  ddress hints */.
10910 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66    struct addrinf
10920 6f 20 2a 70 41 64 64 72 73 2c 20 2a 70 3b 20 2f  o *pAddrs, *p; /
10930 2a 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  * */.  int rc;  
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
10960 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6e  de */.  int i, n
10970 3b 0a 20 20 69 6e 74 20 6d 61 78 46 64 20 3d 20  ;.  int maxFd = 
10980 2d 31 3b 0a 20 20 0a 20 20 6d 65 6d 73 65 74 28  -1;.  .  memset(
10990 26 73 48 69 6e 74 73 2c 20 30 2c 20 73 69 7a 65  &sHints, 0, size
109a0 6f 66 28 73 48 69 6e 74 73 29 29 3b 0a 20 20 69  of(sHints));.  i
109b0 66 28 20 69 70 76 34 4f 6e 6c 79 20 29 7b 0a 20  f( ipv4Only ){. 
109c0 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d     sHints.ai_fam
109d0 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 3b 0a 20  ily = PF_INET;. 
109e0 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69 70 76     /*printf("ipv
109f0 34 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a 20 20  4 only\n");*/.  
10a00 7d 65 6c 73 65 20 69 66 28 20 69 70 76 36 4f 6e  }else if( ipv6On
10a10 6c 79 20 29 7b 0a 20 20 20 20 73 48 69 6e 74 73  ly ){.    sHints
10a20 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20 50 46 5f  .ai_family = PF_
10a30 49 4e 45 54 36 3b 0a 20 20 20 20 2f 2a 70 72 69  INET6;.    /*pri
10a40 6e 74 66 28 22 69 70 76 36 20 6f 6e 6c 79 5c 6e  ntf("ipv6 only\n
10a50 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ");*/.  }else{. 
10a60 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61 6d     sHints.ai_fam
10a70 69 6c 79 20 3d 20 50 46 5f 55 4e 53 50 45 43 3b  ily = PF_UNSPEC;
10a80 0a 20 20 7d 0a 20 20 73 48 69 6e 74 73 2e 61 69  .  }.  sHints.ai
10a90 5f 73 6f 63 6b 74 79 70 65 20 3d 20 53 4f 43 4b  _socktype = SOCK
10aa0 5f 53 54 52 45 41 4d 3b 0a 20 20 73 48 69 6e 74  _STREAM;.  sHint
10ab0 73 2e 61 69 5f 66 6c 61 67 73 20 3d 20 41 49 5f  s.ai_flags = AI_
10ac0 50 41 53 53 49 56 45 3b 0a 20 20 73 48 69 6e 74  PASSIVE;.  sHint
10ad0 73 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c 20 3d 20  s.ai_protocol = 
10ae0 30 3b 0a 20 20 72 63 20 3d 20 67 65 74 61 64 64  0;.  rc = getadd
10af0 72 69 6e 66 6f 28 6c 6f 63 61 6c 4f 6e 6c 79 20  rinfo(localOnly 
10b00 3f 20 22 6c 6f 63 61 6c 68 6f 73 74 22 3a 20 30  ? "localhost": 0
10b10 2c 20 7a 50 6f 72 74 2c 20 26 73 48 69 6e 74 73  , zPort, &sHints
10b20 2c 20 26 70 41 64 64 72 73 29 3b 0a 20 20 69 66  , &pAddrs);.  if
10b30 28 20 72 63 20 29 7b 0a 20 20 20 20 66 70 72 69  ( rc ){.    fpri
10b40 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 6f 75  ntf(stderr, "cou
10b50 6c 64 20 6e 6f 74 20 67 65 74 20 61 64 64 72 20  ld not get addr 
10b60 69 6e 66 6f 3a 20 25 73 22 2c 20 0a 20 20 20 20  info: %s", .    
10b70 20 20 20 20 20 20 20 20 72 63 21 3d 45 41 49 5f          rc!=EAI_
10b80 53 59 53 54 45 4d 20 3f 20 67 61 69 5f 73 74 72  SYSTEM ? gai_str
10b90 65 72 72 6f 72 28 72 63 29 20 3a 20 73 74 72 65  error(rc) : stre
10ba0 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20  rror(errno));.  
10bb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
10bc0 20 20 66 6f 72 28 6e 3d 30 2c 20 70 3d 70 41 64    for(n=0, p=pAd
10bd0 64 72 73 3b 20 6e 3c 28 69 6e 74 29 28 73 69 7a  drs; n<(int)(siz
10be0 65 6f 66 28 6c 69 73 74 65 6e 65 72 29 2f 73 69  eof(listener)/si
10bf0 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 5b 30 5d  zeof(listener[0]
10c00 29 29 20 26 26 20 70 21 3d 30 3b 0a 20 20 20 20  )) && p!=0;.    
10c10 20 20 20 20 70 3d 70 2d 3e 61 69 5f 6e 65 78 74      p=p->ai_next
10c20 29 7b 0a 20 20 20 20 6c 69 73 74 65 6e 65 72 5b  ){.    listener[
10c30 6e 5d 20 3d 20 73 6f 63 6b 65 74 28 70 2d 3e 61  n] = socket(p->a
10c40 69 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e 61 69 5f  i_family, p->ai_
10c50 73 6f 63 6b 74 79 70 65 2c 20 70 2d 3e 61 69 5f  socktype, p->ai_
10c60 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20 20 20 69  protocol);.    i
10c70 66 28 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 3e 3d  f( listener[n]>=
10c80 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  0 ){.      /* if
10c90 20 77 65 20 63 61 6e 27 74 20 74 65 72 6d 69 6e   we can't termin
10ca0 61 74 65 20 6e 69 63 65 6c 79 2c 20 61 74 20 6c  ate nicely, at l
10cb0 65 61 73 74 20 61 6c 6c 6f 77 20 74 68 65 20 73  east allow the s
10cc0 6f 63 6b 65 74 20 74 6f 20 62 65 20 72 65 75 73  ocket to be reus
10cd0 65 64 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 73  ed */.      sets
10ce0 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e 65 72 5b  ockopt(listener[
10cf0 6e 5d 2c 20 53 4f 4c 5f 53 4f 43 4b 45 54 2c 20  n], SOL_SOCKET, 
10d00 53 4f 5f 52 45 55 53 45 41 44 44 52 2c 26 6f 70  SO_REUSEADDR,&op
10d10 74 2c 20 73 69 7a 65 6f 66 28 6f 70 74 29 29 3b  t, sizeof(opt));
10d20 0a 20 20 20 20 20 20 0a 23 69 66 20 64 65 66 69  .      .#if defi
10d30 6e 65 64 28 49 50 56 36 5f 56 36 4f 4e 4c 59 29  ned(IPV6_V6ONLY)
10d40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 69  .      if( p->ai
10d50 5f 66 61 6d 69 6c 79 3d 3d 41 46 5f 49 4e 45 54  _family==AF_INET
10d60 36 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  6 ){.        int
10d70 20 76 36 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20   v6only = 1;.   
10d80 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74 28       setsockopt(
10d90 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 49 50 50  listener[n], IPP
10da0 52 4f 54 4f 5f 49 50 56 36 2c 20 49 50 56 36 5f  ROTO_IPV6, IPV6_
10db0 56 36 4f 4e 4c 59 2c 0a 20 20 20 20 20 20 20 20  V6ONLY,.        
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 26 76 36 6f              &v6o
10dd0 6e 6c 79 2c 20 73 69 7a 65 6f 66 28 76 36 6f 6e  nly, sizeof(v6on
10de0 6c 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ly));.      }.#e
10df0 6e 64 69 66 0a 20 20 20 20 20 20 0a 20 20 20 20  ndif.      .    
10e00 20 20 69 66 28 20 62 69 6e 64 28 6c 69 73 74 65    if( bind(liste
10e10 6e 65 72 5b 6e 5d 2c 20 70 2d 3e 61 69 5f 61 64  ner[n], p->ai_ad
10e20 64 72 2c 20 70 2d 3e 61 69 5f 61 64 64 72 6c 65  dr, p->ai_addrle
10e30 6e 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n)<0 ){.        
10e40 70 72 69 6e 74 66 28 22 62 69 6e 64 20 66 61 69  printf("bind fai
10e50 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72 65  led: %s\n", stre
10e60 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20 20  rror(errno));.  
10e70 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74        close(list
10e80 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20 20  ener[n]);.      
10e90 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
10ea0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 69    }.      if( li
10eb0 73 74 65 6e 28 6c 69 73 74 65 6e 65 72 5b 6e 5d  sten(listener[n]
10ec0 2c 20 32 30 29 3c 30 20 29 7b 0a 20 20 20 20 20  , 20)<0 ){.     
10ed0 20 20 20 70 72 69 6e 74 66 28 22 6c 69 73 74 65     printf("liste
10ee0 6e 28 29 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  n() failed: %s\n
10ef0 22 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 6e  ", strerror(errn
10f00 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 63 6c 6f  o));.        clo
10f10 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 29 3b  se(listener[n]);
10f20 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
10f30 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
10f40 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
10f50 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
10f60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
10f70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 61  , "cannot open a
10f80 6e 79 20 73 6f 63 6b 65 74 73 5c 6e 22 29 3b 0a  ny sockets\n");.
10f90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
10fa0 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  }..  while( 1 ){
10fb0 0a 20 20 20 20 69 66 28 20 6e 63 68 69 6c 64 72  .    if( nchildr
10fc0 65 6e 3e 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20  en>MAX_PARALLEL 
10fd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6c 6f 77  ){.      /* Slow
10fe0 20 64 6f 77 6e 20 69 66 20 63 6f 6e 6e 65 63 74   down if connect
10ff0 69 6f 6e 73 20 61 72 65 20 61 72 72 69 76 69 6e  ions are arrivin
11000 67 20 74 6f 6f 20 66 61 73 74 20 2a 2f 0a 20 20  g too fast */.  
11010 20 20 20 20 73 6c 65 65 70 28 20 6e 63 68 69 6c      sleep( nchil
11020 64 72 65 6e 2d 4d 41 58 5f 50 41 52 41 4c 4c 45  dren-MAX_PARALLE
11030 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  L );.    }.    d
11040 65 6c 61 79 2e 74 76 5f 73 65 63 20 3d 20 36 30  elay.tv_sec = 60
11050 3b 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f 75  ;.    delay.tv_u
11060 73 65 63 20 3d 20 30 3b 0a 20 20 20 20 46 44 5f  sec = 0;.    FD_
11070 5a 45 52 4f 28 26 72 65 61 64 66 64 73 29 3b 0a  ZERO(&readfds);.
11080 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11090 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
110a0 73 65 72 74 28 20 6c 69 73 74 65 6e 65 72 5b 69  sert( listener[i
110b0 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 46 44  ]>=0 );.      FD
110c0 5f 53 45 54 28 20 6c 69 73 74 65 6e 65 72 5b 69  _SET( listener[i
110d0 5d 2c 20 26 72 65 61 64 66 64 73 29 3b 0a 20 20  ], &readfds);.  
110e0 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 65 72      if( listener
110f0 5b 69 5d 3e 6d 61 78 46 64 20 29 20 6d 61 78 46  [i]>maxFd ) maxF
11100 64 20 3d 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3b  d = listener[i];
11110 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 6c 65 63  .    }.    selec
11120 74 28 20 6d 61 78 46 64 2b 31 2c 20 26 72 65 61  t( maxFd+1, &rea
11130 64 66 64 73 2c 20 30 2c 20 30 2c 20 26 64 65 6c  dfds, 0, 0, &del
11140 61 79 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ay);.    for(i=0
11150 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
11160 20 20 20 69 66 28 20 46 44 5f 49 53 53 45 54 28     if( FD_ISSET(
11170 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65  listener[i], &re
11180 61 64 66 64 73 29 20 29 7b 0a 20 20 20 20 20 20  adfds) ){.      
11190 20 20 6c 65 6e 61 64 64 72 20 3d 20 73 69 7a 65    lenaddr = size
111a0 6f 66 28 69 6e 61 64 64 72 29 3b 0a 20 20 20 20  of(inaddr);.    
111b0 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 3d      connection =
111c0 20 61 63 63 65 70 74 28 6c 69 73 74 65 6e 65 72   accept(listener
111d0 5b 69 5d 2c 20 26 69 6e 61 64 64 72 2e 73 61 2c  [i], &inaddr.sa,
111e0 20 26 6c 65 6e 61 64 64 72 29 3b 0a 20 20 20 20   &lenaddr);.    
111f0 20 20 20 20 69 66 28 20 63 6f 6e 6e 65 63 74 69      if( connecti
11200 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  on>=0 ){.       
11210 20 20 20 63 68 69 6c 64 20 3d 20 66 6f 72 6b 28     child = fork(
11220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
11230 20 63 68 69 6c 64 21 3d 30 20 29 7b 0a 20 20 20   child!=0 ){.   
11240 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69           if( chi
11250 6c 64 3e 30 20 29 20 6e 63 68 69 6c 64 72 65 6e  ld>0 ) nchildren
11260 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
11270 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e  close(connection
11280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  );.            /
11290 2a 20 70 72 69 6e 74 66 28 22 73 75 62 70 72 6f  * printf("subpro
112a0 63 65 73 73 20 25 64 20 73 74 61 72 74 65 64 2e  cess %d started.
112b0 2e 2e 5c 6e 22 2c 20 63 68 69 6c 64 29 3b 20 66  ..\n", child); f
112c0 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a  flush(stdout); *
112d0 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  /.          }els
112e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
112f0 6e 74 20 6e 45 72 72 20 3d 20 30 2c 20 66 64 3b  nt nErr = 0, fd;
11300 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
11310 73 65 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  se(0);.         
11320 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e     fd = dup(conn
11330 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ection);.       
11340 20 20 20 20 20 69 66 28 20 66 64 21 3d 30 20 29       if( fd!=0 )
11350 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
11360 20 20 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20       close(1);. 
11370 20 20 20 20 20 20 20 20 20 20 20 66 64 20 3d 20             fd = 
11380 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b  dup(connection);
11390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
113a0 20 66 64 21 3d 31 20 29 20 6e 45 72 72 2b 2b 3b   fd!=1 ) nErr++;
113b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f  .            clo
113c0 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a  se(connection);.
113d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
113e0 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20 20 20 20  rn nErr;.       
113f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
11400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
11410 42 75 72 79 20 64 65 61 64 20 63 68 69 6c 64 72  Bury dead childr
11420 65 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  en */.      whil
11430 65 28 20 28 63 68 69 6c 64 20 3d 20 77 61 69 74  e( (child = wait
11440 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f 48 41 4e  pid(0, 0, WNOHAN
11450 47 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  G))>0 ){.       
11460 20 2f 2a 20 70 72 69 6e 74 66 28 22 70 72 6f 63   /* printf("proc
11470 65 73 73 20 25 64 20 65 6e 64 73 5c 6e 22 2c 20  ess %d ends\n", 
11480 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28 73  child); fflush(s
11490 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20 20  tdout); */.     
114a0 20 20 20 6e 63 68 69 6c 64 72 65 6e 2d 2d 3b 0a     nchildren--;.
114b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
114c0 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 41 43 48  }.  /* NOT REACH
114d0 45 44 20 2a 2f 20 20 0a 20 20 65 78 69 74 28 31  ED */  .  exit(1
114e0 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61 69 6e 28  );.}...int main(
114f0 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
11500 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b  *argv){.  int i;
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11530 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ter */.  char *z
11540 50 65 72 6d 55 73 65 72 20 3d 20 30 3b 20 20 20  PermUser = 0;   
11550 20 20 20 2f 2a 20 52 75 6e 20 64 61 65 6d 6f 6e     /* Run daemon
11560 20 77 69 74 68 20 74 68 69 73 20 75 73 65 72 27   with this user'
11570 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 2a 2f  s permissions */
11580 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11590 50 6f 72 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Port = 0;    /* 
115a0 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48 54 54  Implement an HTT
115b0 50 20 73 65 72 76 65 72 20 70 72 6f 63 65 73 73  P server process
115c0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 43 68 72   */.  int useChr
115d0 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b 20 20 20 20  ootJail = 1;    
115e0 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 61  /* True to use a
115f0 20 63 68 61 6e 67 65 2d 72 6f 6f 74 20 6a 61 69   change-root jai
11600 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 61  l */.  struct pa
11610 73 73 77 64 20 2a 70 77 64 20 3d 20 30 3b 20 20  sswd *pwd = 0;  
11620 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
11630 61 62 6f 75 74 20 74 68 65 20 75 73 65 72 20 2a  about the user *
11640 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  /..  /* Record t
11650 68 65 20 74 69 6d 65 20 77 68 65 6e 20 70 72 6f  he time when pro
11660 63 65 73 73 69 6e 67 20 62 65 67 69 6e 73 2e 0a  cessing begins..
11670 20 20 2a 2f 0a 20 20 67 65 74 74 69 6d 65 6f 66    */.  gettimeof
11680 64 61 79 28 26 62 65 67 69 6e 54 69 6d 65 2c 20  day(&beginTime, 
11690 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  0);..  /* Parse 
116a0 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
116b0 75 6d 65 6e 74 73 0a 20 20 2a 2f 0a 20 20 77 68  uments.  */.  wh
116c0 69 6c 65 28 20 61 72 67 63 3e 31 20 26 26 20 61  ile( argc>1 && a
116d0 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 2d 27 20 29  rgv[1][0]=='-' )
116e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
116f0 61 72 67 76 5b 31 5d 3b 0a 20 20 20 20 63 68 61  argv[1];.    cha
11700 72 20 2a 7a 41 72 67 20 3d 20 61 72 67 63 3e 3d  r *zArg = argc>=
11710 33 20 3f 20 61 72 67 76 5b 32 5d 20 3a 20 22 30  3 ? argv[2] : "0
11720 22 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  ";.    if( z[0]=
11730 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
11740 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28  ' ) z++;.    if(
11750 20 73 74 72 63 6d 70 28 7a 2c 22 2d 75 73 65 72   strcmp(z,"-user
11760 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  ")==0 ){.      z
11770 50 65 72 6d 55 73 65 72 20 3d 20 7a 41 72 67 3b  PermUser = zArg;
11780 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
11790 74 72 63 6d 70 28 7a 2c 22 2d 72 6f 6f 74 22 29  trcmp(z,"-root")
117a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 6f  ==0 ){.      zRo
117b0 6f 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d  ot = zArg;.    }
117c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
117d0 7a 2c 22 2d 6c 6f 67 66 69 6c 65 22 29 3d 3d 30  z,"-logfile")==0
117e0 20 29 7b 0a 20 20 20 20 20 20 7a 4c 6f 67 46 69   ){.      zLogFi
117f0 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d  le = zArg;.    }
11800 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11810 7a 2c 22 2d 6d 61 78 2d 61 67 65 22 29 3d 3d 30  z,"-max-age")==0
11820 20 29 7b 0a 20 20 20 20 20 20 6d 78 41 67 65 20   ){.      mxAge 
11830 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b 0a 20 20  = atoi(zArg);.  
11840 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11850 6d 70 28 7a 2c 22 2d 68 74 74 70 73 22 29 3d 3d  mp(z,"-https")==
11860 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65 48 74  0 ){.      useHt
11870 74 70 73 20 3d 20 61 74 6f 69 28 7a 41 72 67 29  tps = atoi(zArg)
11880 3b 0a 20 20 20 20 20 20 7a 48 74 74 70 20 3d 20  ;.      zHttp = 
11890 75 73 65 48 74 74 70 73 20 3f 20 22 68 74 74 70  useHttps ? "http
118a0 73 22 20 3a 20 22 68 74 74 70 22 3b 0a 20 20 20  s" : "http";.   
118b0 20 20 20 69 66 28 20 75 73 65 48 74 74 70 73 20     if( useHttps 
118c0 29 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 3d 20  ) zRemoteAddr = 
118d0 67 65 74 65 6e 76 28 22 52 45 4d 4f 54 45 5f 48  getenv("REMOTE_H
118e0 4f 53 54 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  OST");.    }else
118f0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22   if( strcmp(z, "
11900 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20  -port")==0 ){.  
11910 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a 41 72 67      zPort = zArg
11920 3b 0a 20 20 20 20 20 20 73 74 61 6e 64 61 6c 6f  ;.      standalo
11930 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ne = 1;.    }els
11940 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
11950 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30 20 29 7b  "-family")==0 ){
11960 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
11970 70 28 7a 41 72 67 2c 20 22 69 70 76 34 22 29 3d  p(zArg, "ipv4")=
11980 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 70  =0 ){.        ip
11990 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  v4Only = 1;.    
119a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
119b0 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 36 22 29  mp(zArg, "ipv6")
119c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
119d0 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  pv6Only = 1;.   
119e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
119f0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 30    Malfunction(50
11a00 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e  0,  /* LOG: unkn
11a10 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 20  own IP protocol 
11a20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
11a30 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
11a40 49 50 20 70 72 6f 74 6f 63 6f 6c 3a 20 5b 25 73  IP protocol: [%s
11a50 5d 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a 20 20 20  ]\n", zArg);.   
11a60 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
11a70 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 6a  f( strcmp(z, "-j
11a80 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ail")==0 ){.    
11a90 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29    if( atoi(zArg)
11aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
11ab0 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 30  seChrootJail = 0
11ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11ad0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
11ae0 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d 30 20 29  , "-debug")==0 )
11af0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 74 6f 69  {.      if( atoi
11b00 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20  (zArg) ){.      
11b10 20 20 75 73 65 54 69 6d 65 6f 75 74 20 3d 20 30    useTimeout = 0
11b20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11b30 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
11b40 2c 20 22 2d 64 61 74 65 74 65 73 74 22 29 3d 3d  , "-datetest")==
11b50 30 20 29 7b 0a 20 20 20 20 20 20 54 65 73 74 50  0 ){.      TestP
11b60 61 72 73 65 52 66 63 38 32 32 44 61 74 65 28 29  arseRfc822Date()
11b70 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
11b80 4f 6b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  Ok\n");.      ex
11b90 69 74 28 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  it(0);.    }else
11ba0 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  {.      Malfunct
11bb0 69 6f 6e 28 35 31 30 2c 20 2f 2a 20 4c 4f 47 3a  ion(510, /* LOG:
11bc0 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64   unknown command
11bd0 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 6f  -line argument o
11be0 6e 20 6c 61 75 6e 63 68 20 2a 2f 0a 20 20 20 20  n launch */.    
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75                "u
11c00 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65 6e 74 3a  nknown argument:
11c10 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20   [%s]\n", z);.  
11c20 20 20 7d 0a 20 20 20 20 61 72 67 76 20 2b 3d 20    }.    argv += 
11c30 32 3b 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32  2;.    argc -= 2
11c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 52 6f 6f  ;.  }.  if( zRoo
11c50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
11c60 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b 0a 20 20  standalone ){.  
11c70 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22 2e 22 3b      zRoot = ".";
11c80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11c90 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 32    Malfunction(52
11ca0 30 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d 72 6f 6f  0, /* LOG: --roo
11cb0 74 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73 69  t argument missi
11cc0 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ng */.          
11cd0 20 20 20 20 20 20 20 20 22 6e 6f 20 2d 2d 72 6f          "no --ro
11ce0 6f 74 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  ot specified");.
11cf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
11d00 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f  * Change directo
11d10 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74  ries to the root
11d20 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c   of the HTTP fil
11d30 65 73 79 73 74 65 6d 2e 20 20 54 68 65 6e 0a 20  esystem.  Then. 
11d40 20 2a 2a 20 63 72 65 61 74 65 20 61 20 63 68 72   ** create a chr
11d50 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72 65 2e 0a  oot jail there..
11d60 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 64 69 72    */.  if( chdir
11d70 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b 0a 20 20  (zRoot)!=0 ){.  
11d80 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 33    Malfunction(53
11d90 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72  0, /* LOG: chdir
11da0 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
11dc0 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74 6f 20 64  nnot change to d
11dd0 69 72 65 63 74 6f 72 79 20 5b 25 73 5d 22 2c 20  irectory [%s]", 
11de0 7a 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  zRoot);.  }..  /
11df0 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f  * Get informatio
11e00 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 72  n about the user
11e10 20 69 66 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f   if available */
11e20 0a 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72  .  if( zPermUser
11e30 20 29 20 70 77 64 20 3d 20 67 65 74 70 77 6e 61   ) pwd = getpwna
11e40 6d 28 7a 50 65 72 6d 55 73 65 72 29 3b 0a 0a 20  m(zPermUser);.. 
11e50 20 2f 2a 20 45 6e 74 65 72 20 74 68 65 20 63 68   /* Enter the ch
11e60 72 6f 6f 74 20 6a 61 69 6c 20 69 66 20 72 65 71  root jail if req
11e70 75 65 73 74 65 64 20 2a 2f 20 20 0a 20 20 69 66  uested */  .  if
11e80 28 20 7a 50 65 72 6d 55 73 65 72 20 26 26 20 75  ( zPermUser && u
11e90 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20 26 26 20  seChrootJail && 
11ea0 67 65 74 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20  getuid()==0 ){. 
11eb0 20 20 20 69 66 28 20 63 68 72 6f 6f 74 28 22 2e     if( chroot(".
11ec0 22 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 4d 61  ")<0 ){.      Ma
11ed0 6c 66 75 6e 63 74 69 6f 6e 28 35 34 30 2c 20 2f  lfunction(540, /
11ee0 2a 20 4c 4f 47 3a 20 63 68 72 6f 6f 74 28 29 20  * LOG: chroot() 
11ef0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
11f00 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 61              "una
11f10 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 63 68  ble to create ch
11f20 72 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a 20 20 20  root jail");.   
11f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52   }else{.      zR
11f40 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20 20 7d 0a  oot = "";.    }.
11f50 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 74 69 76 61    }..  /* Activa
11f60 74 65 20 74 68 65 20 73 65 72 76 65 72 2c 20 69  te the server, i
11f70 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  f requested */. 
11f80 20 69 66 28 20 7a 50 6f 72 74 20 26 26 20 68 74   if( zPort && ht
11f90 74 70 5f 73 65 72 76 65 72 28 7a 50 6f 72 74 2c  tp_server(zPort,
11fa0 20 30 29 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75   0) ){.    Malfu
11fb0 6e 63 74 69 6f 6e 28 35 35 30 2c 20 2f 2a 20 4c  nction(550, /* L
11fc0 4f 47 3a 20 73 65 72 76 65 72 20 73 74 61 72 74  OG: server start
11fd0 75 70 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  up failed */.   
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 61               "fa
11ff0 69 6c 65 64 20 74 6f 20 73 74 61 72 74 20 73 65  iled to start se
12000 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rver");.  }..  /
12010 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70 72 69 76  * Drop root priv
12020 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  ileges..  */.  i
12030 66 28 20 7a 50 65 72 6d 55 73 65 72 20 29 7b 0a  f( zPermUser ){.
12040 20 20 20 20 69 66 28 20 70 77 64 20 29 7b 0a 20      if( pwd ){. 
12050 20 20 20 20 20 69 66 28 20 73 65 74 67 69 64 28       if( setgid(
12060 70 77 64 2d 3e 70 77 5f 67 69 64 29 20 29 7b 0a  pwd->pw_gid) ){.
12070 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
12080 69 6f 6e 28 35 36 30 2c 20 2f 2a 20 4c 4f 47 3a  ion(560, /* LOG:
12090 20 73 65 74 67 69 64 28 29 20 66 61 69 6c 65 64   setgid() failed
120a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
120b0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
120c0 73 65 74 20 67 72 6f 75 70 2d 69 64 20 74 6f 20  set group-id to 
120d0 25 64 22 2c 20 70 77 64 2d 3e 70 77 5f 67 69 64  %d", pwd->pw_gid
120e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
120f0 20 69 66 28 20 73 65 74 75 69 64 28 70 77 64 2d   if( setuid(pwd-
12100 3e 70 77 5f 75 69 64 29 20 29 7b 0a 20 20 20 20  >pw_uid) ){.    
12110 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
12120 35 37 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 74  570, /* LOG: set
12130 75 69 64 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  uid() failed */.
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 22 63 61 6e 6e 6f 74 20 73 65 74 20      "cannot set 
12160 75 73 65 72 2d 69 64 20 74 6f 20 25 64 22 2c 20  user-id to %d", 
12170 70 77 64 2d 3e 70 77 5f 75 69 64 29 3b 0a 20 20  pwd->pw_uid);.  
12180 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
12190 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69  .      Malfuncti
121a0 6f 6e 28 35 38 30 2c 20 2f 2a 20 4c 4f 47 3a 20  on(580, /* LOG: 
121b0 75 6e 6b 6e 6f 77 6e 20 75 73 65 72 20 2a 2f 0a  unknown user */.
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 22 6e 6f 20 73 75 63 68 20 75 73 65 72 20    "no such user 
121e0 5b 25 73 5d 22 2c 20 7a 50 65 72 6d 55 73 65 72  [%s]", zPermUser
121f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
12200 66 28 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29  f( getuid()==0 )
12210 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f  {.    Malfunctio
12220 6e 28 35 39 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63  n(590, /* LOG: c
12230 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f 6f  annot run as roo
12240 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  t */.           
12250 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 72 75 6e       "cannot run
12260 20 61 73 20 72 6f 6f 74 22 29 3b 0a 20 20 7d 0a   as root");.  }.
12270 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 49 50  .  /* Get the IP
12280 20 61 64 64 72 65 73 73 20 66 72 6f 6d 20 77 68   address from wh
12290 65 6e 63 65 20 74 68 65 20 72 65 71 75 65 73 74  ence the request
122a0 20 6f 72 69 67 69 6e 61 74 65 73 0a 20 20 2a 2f   originates.  */
122b0 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74 65 41 64  .  if( zRemoteAd
122c0 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 61 64 64  dr==0 ){.    add
122d0 72 65 73 73 20 72 65 6d 6f 74 65 41 64 64 72 3b  ress remoteAddr;
122e0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
122f0 74 20 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  t size = sizeof(
12300 72 65 6d 6f 74 65 41 64 64 72 29 3b 0a 20 20 20  remoteAddr);.   
12310 20 63 68 61 72 20 7a 48 6f 73 74 5b 4e 49 5f 4d   char zHost[NI_M
12320 41 58 48 4f 53 54 5d 3b 0a 20 20 20 20 69 66 28  AXHOST];.    if(
12330 20 67 65 74 70 65 65 72 6e 61 6d 65 28 30 2c 20   getpeername(0, 
12340 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20  &remoteAddr.sa, 
12350 26 73 69 7a 65 29 3e 3d 30 20 29 7b 0a 20 20 20  &size)>=0 ){.   
12360 20 20 20 67 65 74 6e 61 6d 65 69 6e 66 6f 28 26     getnameinfo(&
12370 72 65 6d 6f 74 65 41 64 64 72 2e 73 61 2c 20 73  remoteAddr.sa, s
12380 69 7a 65 2c 20 7a 48 6f 73 74 2c 20 73 69 7a 65  ize, zHost, size
12390 6f 66 28 7a 48 6f 73 74 29 2c 20 30 2c 20 30 2c  of(zHost), 0, 0,
123a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
123b0 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43 48 4f 53     NI_NUMERICHOS
123c0 54 29 3b 0a 20 20 20 20 20 20 7a 52 65 6d 6f 74  T);.      zRemot
123d0 65 41 64 64 72 20 3d 20 53 74 72 44 75 70 28 7a  eAddr = StrDup(z
123e0 48 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Host);.    }.  }
123f0 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74 65 41 64  .  if( zRemoteAd
12400 64 72 21 3d 30 0a 20 20 20 26 26 20 73 74 72 6e  dr!=0.   && strn
12410 63 6d 70 28 7a 52 65 6d 6f 74 65 41 64 64 72 2c  cmp(zRemoteAddr,
12420 20 22 3a 3a 66 66 66 66 3a 22 2c 20 37 29 3d 3d   "::ffff:", 7)==
12430 30 0a 20 20 20 26 26 20 73 74 72 63 68 72 28 7a  0.   && strchr(z
12440 52 65 6d 6f 74 65 41 64 64 72 2b 37 2c 20 27 3a  RemoteAddr+7, ':
12450 27 29 3d 3d 30 0a 20 20 20 26 26 20 73 74 72 63  ')==0.   && strc
12460 68 72 28 7a 52 65 6d 6f 74 65 41 64 64 72 2b 37  hr(zRemoteAddr+7
12470 2c 20 27 2e 27 29 21 3d 30 0a 20 20 29 7b 0a 20  , '.')!=0.  ){. 
12480 20 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 20 2b     zRemoteAddr +
12490 3d 20 37 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  = 7;.  }..  /* P
124a0 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
124b0 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 66 6f 72   stream */.  for
124c0 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69 2b 2b  (i=0; i<100; i++
124d0 29 7b 0a 20 20 20 20 50 72 6f 63 65 73 73 4f 6e  ){.    ProcessOn
124e0 65 52 65 71 75 65 73 74 28 30 29 3b 0a 20 20 7d  eRequest(0);.  }
124f0 0a 20 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71  .  ProcessOneReq
12500 75 65 73 74 28 31 29 3b 0a 20 20 65 78 69 74 28  uest(1);.  exit(
12510 30 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 20  0);.}..#if 0./* 
12520 43 6f 70 79 2f 70 61 73 74 65 20 74 68 65 20 66  Copy/paste the f
12530 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 69 6e  ollowing text in
12540 74 6f 20 53 51 4c 69 74 65 20 74 6f 20 67 65 6e  to SQLite to gen
12550 65 72 61 74 65 20 74 68 65 20 78 72 65 66 0a 2a  erate the xref.*
12560 2a 20 74 61 62 6c 65 20 74 68 61 74 20 64 65 73  * table that des
12570 63 72 69 62 65 73 20 61 6c 6c 20 65 72 72 6f 72  cribes all error
12580 20 63 6f 64 65 73 2e 0a 2a 2f 0a 42 45 47 49 4e   codes..*/.BEGIN
12590 3b 0a 43 52 45 41 54 45 20 54 41 42 4c 45 20 49  ;.CREATE TABLE I
125a0 46 20 4e 4f 54 20 45 58 49 53 54 53 20 78 72 65  F NOT EXISTS xre
125b0 66 28 6c 69 6e 65 6e 6f 20 49 4e 54 45 47 45 52  f(lineno INTEGER
125c0 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64 65   PRIMARY KEY, de
125d0 73 63 20 54 45 58 54 29 3b 0a 44 45 4c 45 54 45  sc TEXT);.DELETE
125e0 20 46 52 4f 4d 20 58 72 65 66 3b 0a 49 4e 53 45   FROM Xref;.INSE
125f0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12600 55 45 53 28 31 30 30 2c 27 4d 61 6c 6c 6f 63 28  UES(100,'Malloc(
12610 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
12620 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12630 55 45 53 28 31 31 30 2c 27 4e 6f 74 20 61 75 74  UES(110,'Not aut
12640 68 6f 72 69 7a 65 64 27 29 3b 0a 49 4e 53 45 52  horized');.INSER
12650 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12660 45 53 28 31 32 30 2c 27 43 47 49 20 45 72 72 6f  ES(120,'CGI Erro
12670 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  r');.INSERT INTO
12680 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 33 30   xref VALUES(130
12690 2c 27 54 69 6d 65 6f 75 74 27 29 3b 0a 49 4e 53  ,'Timeout');.INS
126a0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
126b0 4c 55 45 53 28 31 34 30 2c 27 43 47 49 20 73 63  LUES(140,'CGI sc
126c0 72 69 70 74 20 69 73 20 77 72 69 74 61 62 6c 65  ript is writable
126d0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
126e0 78 72 65 66 20 56 41 4c 55 45 53 28 31 35 30 2c  xref VALUES(150,
126f0 27 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61 75  'Cannot open -au
12700 74 68 20 66 69 6c 65 27 29 3b 0a 49 4e 53 45 52  th file');.INSER
12710 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12720 45 53 28 31 36 30 2c 27 68 74 74 70 20 72 65 71  ES(160,'http req
12730 75 65 73 74 20 6f 6e 20 68 74 74 70 73 2d 6f 6e  uest on https-on
12740 6c 79 20 70 61 67 65 27 29 3b 0a 49 4e 53 45 52  ly page');.INSER
12750 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12760 45 53 28 31 37 30 2c 27 2d 61 75 74 68 20 72 65  ES(170,'-auth re
12770 64 69 72 65 63 74 27 29 3b 0a 49 4e 53 45 52 54  direct');.INSERT
12780 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
12790 53 28 31 38 30 2c 27 6d 61 6c 66 6f 72 6d 65 64  S(180,'malformed
127a0 20 65 6e 74 72 79 20 69 6e 20 2d 61 75 74 68 20   entry in -auth 
127b0 66 69 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49  file');.INSERT I
127c0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
127d0 31 39 30 2c 27 63 68 64 69 72 28 29 20 66 61 69  190,'chdir() fai
127e0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
127f0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32  TO xref VALUES(2
12800 30 30 2c 27 62 61 64 20 70 72 6f 74 6f 63 6f 6c  00,'bad protocol
12810 20 69 6e 20 48 54 54 50 20 68 65 61 64 65 72 27   in HTTP header'
12820 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12830 72 65 66 20 56 41 4c 55 45 53 28 32 31 30 2c 27  ref VALUES(210,'
12840 45 6d 70 74 79 20 72 65 71 75 65 73 74 20 55 52  Empty request UR
12850 49 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  I');.INSERT INTO
12860 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 32 30   xref VALUES(220
12870 2c 27 55 6e 6b 6e 6f 77 6e 20 72 65 71 75 65 73  ,'Unknown reques
12880 74 20 6d 65 74 68 6f 64 27 29 3b 0a 49 4e 53 45  t method');.INSE
12890 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
128a0 55 45 53 28 32 33 30 2c 27 52 65 66 65 72 72 65  UES(230,'Referre
128b0 72 20 69 73 20 64 65 76 69 64 73 2e 6e 65 74 27  r is devids.net'
128c0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
128d0 72 65 66 20 56 41 4c 55 45 53 28 32 34 30 2c 27  ref VALUES(240,'
128e0 49 6c 6c 65 67 61 6c 20 63 6f 6e 74 65 6e 74 20  Illegal content 
128f0 69 6e 20 48 4f 53 54 3a 20 70 61 72 61 6d 65 74  in HOST: paramet
12900 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  er');.INSERT INT
12910 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 35  O xref VALUES(25
12920 30 2c 27 44 69 73 61 6c 6c 6f 77 65 64 20 75 73  0,'Disallowed us
12930 65 72 20 61 67 65 6e 74 27 29 3b 0a 49 4e 53 45  er agent');.INSE
12940 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12950 55 45 53 28 32 36 30 2c 27 44 69 73 61 6c 6c 6f  UES(260,'Disallo
12960 77 65 64 20 72 65 66 65 72 72 65 72 27 29 3b 0a  wed referrer');.
12970 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
12980 20 56 41 4c 55 45 53 28 32 37 30 2c 27 52 65 71   VALUES(270,'Req
12990 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65 27 29  uest too large')
129a0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
129b0 65 66 20 56 41 4c 55 45 53 28 32 38 30 2c 27 6d  ef VALUES(280,'m
129c0 6b 73 74 65 6d 70 28 29 20 66 61 69 6c 65 64 27  kstemp() failed'
129d0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
129e0 72 65 66 20 56 41 4c 55 45 53 28 32 39 30 2c 27  ref VALUES(290,'
129f0 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 65  cannot create te
12a00 6d 70 20 66 69 6c 65 20 66 6f 72 20 50 4f 53 54  mp file for POST
12a10 20 63 6f 6e 74 65 6e 74 27 29 3b 0a 49 4e 53 45   content');.INSE
12a20 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12a30 55 45 53 28 33 30 30 2c 27 50 61 74 68 20 65 6c  UES(300,'Path el
12a40 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77 69 74  ement begins wit
12a50 68 20 2e 20 6f 72 20 2d 27 29 3b 0a 49 4e 53 45  h . or -');.INSE
12a60 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12a70 55 45 53 28 33 31 30 2c 27 55 52 49 20 64 6f 65  UES(310,'URI doe
12a80 73 20 6e 6f 74 20 73 74 61 72 74 20 77 69 74 68  s not start with
12a90 20 2f 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54   /');.INSERT INT
12aa0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 32  O xref VALUES(32
12ab0 30 2c 27 55 52 49 20 74 6f 6f 20 6c 6f 6e 67 27  0,'URI too long'
12ac0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12ad0 72 65 66 20 56 41 4c 55 45 53 28 33 33 30 2c 27  ref VALUES(330,'
12ae0 4d 69 73 73 69 6e 67 20 48 4f 53 54 3a 20 70 61  Missing HOST: pa
12af0 72 61 6d 65 74 65 72 27 29 3b 0a 49 4e 53 45 52  rameter');.INSER
12b00 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12b10 45 53 28 33 34 30 2c 27 48 4f 53 54 20 70 61 72  ES(340,'HOST par
12b20 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67 27  ameter too long'
12b30 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12b40 72 65 66 20 56 41 4c 55 45 53 28 33 35 30 2c 27  ref VALUES(350,'
12b50 2a 2e 77 65 62 73 69 74 65 20 70 65 72 6d 69 73  *.website permis
12b60 73 69 6f 6e 73 27 29 3b 0a 49 4e 53 45 52 54 20  sions');.INSERT 
12b70 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12b80 28 33 36 30 2c 27 63 68 64 69 72 28 29 20 66 61  (360,'chdir() fa
12b90 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49  iled');.INSERT I
12ba0 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
12bb0 33 37 30 2c 27 72 65 64 69 72 65 63 74 20 74 6f  370,'redirect to
12bc0 20 6e 6f 74 2d 66 6f 75 6e 64 20 70 61 67 65 27   not-found page'
12bd0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12be0 72 65 66 20 56 41 4c 55 45 53 28 33 38 30 2c 27  ref VALUES(380,'
12bf0 55 52 49 20 6e 6f 74 20 66 6f 75 6e 64 27 29 3b  URI not found');
12c00 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12c10 66 20 56 41 4c 55 45 53 28 33 39 30 2c 27 46 69  f VALUES(390,'Fi
12c20 6c 65 20 6e 6f 74 20 72 65 61 64 61 62 6c 65 27  le not readable'
12c30 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12c40 72 65 66 20 56 41 4c 55 45 53 28 34 30 30 2c 27  ref VALUES(400,'
12c50 55 52 49 20 69 73 20 61 20 64 69 72 65 63 74 6f  URI is a directo
12c60 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68 74 6d  ry w/o index.htm
12c70 6c 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  l');.INSERT INTO
12c80 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 31 30   xref VALUES(410
12c90 2c 27 72 65 64 69 72 65 63 74 20 74 6f 20 61 64  ,'redirect to ad
12ca0 64 20 74 72 61 69 6c 69 6e 67 20 2f 27 29 3b 0a  d trailing /');.
12cb0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
12cc0 20 56 41 4c 55 45 53 28 34 32 30 2c 27 63 68 64   VALUES(420,'chd
12cd0 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  ir() failed');.I
12ce0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
12cf0 56 41 4c 55 45 53 28 34 33 30 2c 27 64 75 70 28  VALUES(430,'dup(
12d00 30 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53  0) failed');.INS
12d10 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12d20 4c 55 45 53 28 34 34 30 2c 27 70 69 70 65 28 29  LUES(440,'pipe()
12d30 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
12d40 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12d50 45 53 28 34 35 30 2c 27 64 75 70 28 31 29 20 66  ES(450,'dup(1) f
12d60 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20  ailed');.INSERT 
12d70 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12d80 28 34 36 30 2c 27 45 78 63 65 73 73 20 55 52 49  (460,'Excess URI
12d90 20 63 6f 6e 74 65 6e 74 20 70 61 73 74 20 73 74   content past st
12da0 61 74 69 63 20 66 69 6c 65 20 6e 61 6d 65 27 29  atic file name')
12db0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12dc0 65 66 20 56 41 4c 55 45 53 28 34 37 30 2c 27 45  ef VALUES(470,'E
12dd0 54 61 67 20 43 61 63 68 65 20 48 69 74 27 29 3b  Tag Cache Hit');
12de0 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12df0 66 20 56 41 4c 55 45 53 28 34 38 30 2c 27 66 6f  f VALUES(480,'fo
12e00 70 65 6e 28 29 20 66 61 69 6c 65 64 20 66 6f 72  pen() failed for
12e10 20 73 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 27   static content'
12e20 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12e30 72 65 66 20 56 41 4c 55 45 53 28 32 2c 27 4e 6f  ref VALUES(2,'No
12e40 72 6d 61 6c 20 48 45 41 44 20 72 65 70 6c 79 27  rmal HEAD reply'
12e50 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12e60 72 65 66 20 56 41 4c 55 45 53 28 30 2c 27 4e 6f  ref VALUES(0,'No
12e70 72 6d 61 6c 20 72 65 70 6c 79 27 29 3b 0a 49 4e  rmal reply');.IN
12e80 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12e90 41 4c 55 45 53 28 35 30 30 2c 27 75 6e 6b 6e 6f  ALUES(500,'unkno
12ea0 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 27 29  wn IP protocol')
12eb0 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12ec0 65 66 20 56 41 4c 55 45 53 28 35 31 30 2c 27 75  ef VALUES(510,'u
12ed0 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c  nknown command-l
12ee0 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20  ine argument on 
12ef0 6c 61 75 6e 63 68 27 29 3b 0a 49 4e 53 45 52 54  launch');.INSERT
12f00 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
12f10 53 28 35 32 30 2c 27 2d 2d 72 6f 6f 74 20 61 72  S(520,'--root ar
12f20 67 75 6d 65 6e 74 20 6d 69 73 73 69 6e 67 27 29  gument missing')
12f30 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12f40 65 66 20 56 41 4c 55 45 53 28 35 33 30 2c 27 63  ef VALUES(530,'c
12f50 68 64 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b  hdir() failed');
12f60 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12f70 66 20 56 41 4c 55 45 53 28 35 34 30 2c 27 63 68  f VALUES(540,'ch
12f80 72 6f 6f 74 28 29 20 66 61 69 6c 65 64 27 29 3b  root() failed');
12f90 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12fa0 66 20 56 41 4c 55 45 53 28 35 35 30 2c 27 73 65  f VALUES(550,'se
12fb0 72 76 65 72 20 73 74 61 72 74 75 70 20 66 61 69  rver startup fai
12fc0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
12fd0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
12fe0 36 30 2c 27 73 65 74 67 69 64 28 29 20 66 61 69  60,'setgid() fai
12ff0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
13000 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
13010 37 30 2c 27 73 65 74 75 69 64 28 29 20 66 61 69  70,'setuid() fai
13020 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
13030 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
13040 38 30 2c 27 75 6e 6b 6e 6f 77 6e 20 75 73 65 72  80,'unknown user
13050 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
13060 78 72 65 66 20 56 41 4c 55 45 53 28 35 39 30 2c  xref VALUES(590,
13070 27 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72  'cannot run as r
13080 6f 6f 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  oot');.INSERT IN
13090 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 36  TO xref VALUES(6
130a0 30 30 2c 27 6d 61 6c 6c 6f 63 28 29 20 66 61 69  00,'malloc() fai
130b0 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
130c0 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 36  TO xref VALUES(6
130d0 31 30 2c 27 6d 61 6c 6c 6f 63 28 29 20 66 61 69  10,'malloc() fai
130e0 6c 65 64 27 29 3b 0a 43 4f 4d 4d 49 54 3b 0a 23  led');.COMMIT;.#
130f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 20 2a 2f 0a  endif /* SQL */.