Documentation Source Text

Hex Artifact Content
Login

Artifact fa3bbc8046563a1f8f3b68fbf49919de78a1f7c9ce1a69dceaf90f22acc4759c:


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 2a  ealm to TEXT..**
6990: 20 20 20 20 2a 20 20 22 61 6e 79 6f 6e 65 22 20      *  "anyone" 
69a0: 62 79 70 61 73 73 65 73 20 61 75 74 68 65 6e 74  bypasses authent
69b0: 69 63 61 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 6f  ication and allo
69c0: 77 73 20 61 6e 79 6f 6e 65 20 74 6f 20 73 65 65  ws anyone to see
69d0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 69   the.**       fi
69e0: 6c 65 73 2e 20 20 55 73 65 66 75 6c 20 69 6e 20  les.  Useful in 
69f0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 77 69 74 68  combination with
6a00: 20 22 68 74 74 70 2d 72 65 64 69 72 65 63 74 22   "http-redirect"
6a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 43  .*/.static int C
6a20: 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72 69  heckBasicAuthori
6a30: 7a 61 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61  zation(const cha
6a40: 72 20 2a 7a 41 75 74 68 46 69 6c 65 29 7b 0a 20  r *zAuthFile){. 
6a50: 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61   FILE *in;.  cha
6a60: 72 20 2a 7a 52 65 61 6c 6d 20 3d 20 22 75 6e 6b  r *zRealm = "unk
6a70: 6e 6f 77 6e 20 72 65 61 6c 6d 22 3b 0a 20 20 63  nown realm";.  c
6a80: 68 61 72 20 2a 7a 4c 6f 67 69 6e 50 73 77 64 3b  har *zLoginPswd;
6a90: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
6aa0: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30    char zLine[200
6ab0: 30 5d 3b 0a 0a 20 20 69 6e 20 3d 20 66 6f 70 65  0];..  in = fope
6ac0: 6e 28 7a 41 75 74 68 46 69 6c 65 2c 20 22 72 62  n(zAuthFile, "rb
6ad0: 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
6ae0: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
6af0: 31 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43  150);  /* LOG: C
6b00: 61 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61 75 74 68  annot open -auth
6b10: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 74   file */.    ret
6b20: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
6b30: 20 7a 41 75 74 68 41 72 67 20 29 20 44 65 63 6f   zAuthArg ) Deco
6b40: 64 65 36 34 28 7a 41 75 74 68 41 72 67 29 3b 0a  de64(zAuthArg);.
6b50: 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a    while( fgets(z
6b60: 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69  Line, sizeof(zLi
6b70: 6e 65 29 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20  ne), in) ){.    
6b80: 63 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65  char *zFieldName
6b90: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c  ;.    char *zVal
6ba0: 3b 0a 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d  ;..    zFieldNam
6bb0: 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  e = GetFirstElem
6bc0: 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29  ent(zLine,&zVal)
6bd0: 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64  ;.    if( zField
6be0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65  Name==0 || *zFie
6bf0: 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  ldName==0 ) cont
6c00: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 46  inue;.    if( zF
6c10: 69 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27  ieldName[0]=='#'
6c20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6c30: 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a   RemoveNewline(z
6c40: 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74  Val);.    if( st
6c50: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c  rcmp(zFieldName,
6c60: 20 22 72 65 61 6c 6d 22 29 3d 3d 30 20 29 7b 0a   "realm")==0 ){.
6c70: 20 20 20 20 20 20 7a 52 65 61 6c 6d 20 3d 20 53        zRealm = S
6c80: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
6c90: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
6ca0: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 73  p(zFieldName,"us
6cb0: 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
6cc0: 20 69 66 28 20 7a 41 75 74 68 41 72 67 3d 3d 30   if( zAuthArg==0
6cd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6ce0: 20 20 20 7a 4e 61 6d 65 20 3d 20 47 65 74 46 69     zName = GetFi
6cf0: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c  rstElement(zVal,
6d00: 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a   &zVal);.      z
6d10: 4c 6f 67 69 6e 50 73 77 64 20 3d 20 47 65 74 46  LoginPswd = GetF
6d20: 69 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c  irstElement(zVal
6d30: 2c 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &zVal);.      
6d40: 69 66 28 20 7a 4c 6f 67 69 6e 50 73 77 64 3d 3d  if( zLoginPswd==
6d50: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6d60: 20 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67      if( zAuthArg
6d70: 20 26 26 20 73 74 72 63 6d 70 28 7a 41 75 74 68   && strcmp(zAuth
6d80: 41 72 67 2c 7a 4c 6f 67 69 6e 50 73 77 64 29 3d  Arg,zLoginPswd)=
6d90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  =0 ){.        zR
6da0: 65 6d 6f 74 65 55 73 65 72 20 3d 20 53 74 72 44  emoteUser = StrD
6db0: 75 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  up(zName);.     
6dc0: 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
6dd0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
6de0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6df0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  se if( strcmp(zF
6e00: 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 73 2d  ieldName,"https-
6e10: 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  only")==0 ){.   
6e20: 20 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73     if( !useHttps
6e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46   ){.        NotF
6e40: 6f 75 6e 64 28 31 36 30 29 3b 20 20 2f 2a 20 4c  ound(160);  /* L
6e50: 4f 47 3a 20 20 68 74 74 70 20 72 65 71 75 65 73  OG:  http reques
6e60: 74 20 6f 6e 20 68 74 74 70 73 2d 6f 6e 6c 79 20  t on https-only 
6e70: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
6e80: 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
6e90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6ea0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
6eb0: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c  if( strcmp(zFiel
6ec0: 64 4e 61 6d 65 2c 22 68 74 74 70 2d 72 65 64 69  dName,"http-redi
6ed0: 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rect")==0 ){.   
6ee0: 20 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73     if( !useHttps
6ef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 48 74 74   ){.        zHtt
6f00: 70 20 3d 20 22 68 74 74 70 73 22 3b 0a 20 20 20  p = "https";.   
6f10: 20 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 53       Redirect(zS
6f20: 63 72 69 70 74 2c 20 31 2c 20 31 37 30 29 3b 20  cript, 1, 170); 
6f30: 2f 2a 20 4c 4f 47 3a 20 2d 61 75 74 68 20 72 65  /* LOG: -auth re
6f40: 64 69 72 65 63 74 20 2a 2f 0a 20 20 20 20 20 20  direct */.      
6f50: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
6f60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
6f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6f80: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
6f90: 65 6c 64 4e 61 6d 65 2c 22 61 6e 79 6f 6e 65 22  eldName,"anyone"
6fa0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 63  )==0 ){.      fc
6fb0: 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
6fc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 65  return 1;.    }e
6fd0: 6c 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f  lse{.      NotFo
6fe0: 75 6e 64 28 31 38 30 29 3b 20 20 2f 2a 20 4c 4f  und(180);  /* LO
6ff0: 47 3a 20 20 6d 61 6c 66 6f 72 6d 65 64 20 65 6e  G:  malformed en
7000: 74 72 79 20 69 6e 20 2d 61 75 74 68 20 66 69 6c  try in -auth fil
7010: 65 20 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f 73  e */.      fclos
7020: 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  e(in);.      ret
7030: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
7040: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
7050: 20 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 7a   NotAuthorized(z
7060: 52 65 61 6c 6d 29 3b 0a 20 20 72 65 74 75 72 6e  Realm);.  return
7070: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65   0;.}../*.** Gue
7080: 73 73 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65  ss the mime-type
7090: 20 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74 20 62   of a document b
70a0: 61 73 65 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65  ased on its name
70b0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
70c0: 2a 47 65 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e  *GetMimeType(con
70d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
70e0: 69 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f  int nName){.  co
70f0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
7100: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 66 69 72 73  nt i;.  int firs
7110: 74 2c 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c  t, last;.  int l
7120: 65 6e 3b 0a 20 20 63 68 61 72 20 7a 53 75 66 66  en;.  char zSuff
7130: 69 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20  ix[20];..  /* A 
7140: 74 61 62 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70  table of mimetyp
7150: 65 73 20 62 61 73 65 64 20 6f 6e 20 66 69 6c 65  es based on file
7160: 20 73 75 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a   suffixes. .  **
7170: 20 53 75 66 66 69 78 65 73 20 6d 75 73 74 20 62   Suffixes must b
7180: 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  e in sorted orde
7190: 72 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  r so that we can
71a0: 20 64 6f 20 61 20 62 69 6e 61 72 79 0a 20 20 2a   do a binary.  *
71b0: 2a 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64  * search to find
71c0: 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20   the mime-type. 
71d0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
71e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
71f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66  const char *zSuf
7200: 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  fix;       /* Th
7210: 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 2a 2f  e file suffix */
7220: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
7250: 20 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 63   suffix */.    c
7260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65  onst char *zMime
7270: 74 79 70 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  type;     /* The
7280: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d   corresponding m
7290: 69 6d 65 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61  imetype */.  } a
72a0: 4d 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  Mime[] = {.    {
72b0: 20 22 61 69 22 2c 20 20 20 20 20 20 20 20 20 32   "ai",         2
72c0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
72d0: 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20  ostscript"      
72e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
72f0: 61 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  aif",        3, 
7300: 22 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20  "audio/x-aiff"  
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69      },.    { "ai
7330: 66 63 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  fc",       4, "a
7340: 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20  udio/x-aiff"    
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 66    },.    { "aiff
7370: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64  ",       4, "aud
7380: 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20  io/x-aiff"      
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 7d 2c 0a 20 20 20 20 7b 20 22 61 72 6a 22 2c 20  },.    { "arj", 
73b0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
73c0: 63 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d  cation/x-arj-com
73d0: 70 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c  pressed"      },
73e0: 0a 20 20 20 20 7b 20 22 61 73 63 22 2c 20 20 20  .    { "asc",   
73f0: 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c       3, "text/pl
7400: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
7410: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7420: 20 20 20 7b 20 22 61 73 66 22 2c 20 20 20 20 20     { "asf",     
7430: 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d     3, "video/x-m
7440: 73 2d 61 73 66 22 20 20 20 20 20 20 20 20 20 20  s-asf"          
7450: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7460: 20 7b 20 22 61 73 78 22 2c 20 20 20 20 20 20 20   { "asx",       
7470: 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d   3, "video/x-ms-
7480: 61 73 78 22 20 20 20 20 20 20 20 20 20 20 20 20  asx"            
7490: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
74a0: 20 22 61 75 22 2c 20 20 20 20 20 20 20 20 20 32   "au",         2
74b0: 2c 20 22 61 75 64 69 6f 2f 75 6c 61 77 22 20 20  , "audio/ulaw"  
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
74e0: 61 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  avi",        3, 
74f0: 22 76 69 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f  "video/x-msvideo
7500: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7510: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61      },.    { "ba
7520: 74 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  t",        3, "a
7530: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64  pplication/x-msd
7540: 6f 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20  os-program"     
7550: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 63 70 69    },.    { "bcpi
7560: 6f 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70  o",      5, "app
7570: 6c 69 63 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f  lication/x-bcpio
7580: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7590: 7d 2c 0a 20 20 20 20 7b 20 22 62 69 6e 22 2c 20  },.    { "bin", 
75a0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
75b0: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
75c0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
75d0: 0a 20 20 20 20 7b 20 22 63 22 2c 20 20 20 20 20  .    { "c",     
75e0: 20 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c       1, "text/pl
75f0: 61 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20  ain"            
7600: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7610: 20 20 20 7b 20 22 63 63 22 2c 20 20 20 20 20 20     { "cc",      
7620: 20 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69     2, "text/plai
7630: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
7640: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7650: 20 7b 20 22 63 63 61 64 22 2c 20 20 20 20 20 20   { "ccad",      
7660: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
7670: 2f 63 6c 61 72 69 73 63 61 64 22 20 20 20 20 20  /clariscad"     
7680: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7690: 20 22 63 64 66 22 2c 20 20 20 20 20 20 20 20 33   "cdf",        3
76a0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
76b0: 2d 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20  -netcdf"        
76c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
76d0: 63 6c 61 73 73 22 2c 20 20 20 20 20 20 35 2c 20  class",      5, 
76e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74  "application/oct
76f0: 65 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20  et-stream"      
7700: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f      },.    { "co
7710: 64 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  d",        3, "a
7720: 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72  pplication/vnd.r
7730: 69 6d 2e 63 6f 64 22 20 20 20 20 20 20 20 20 20  im.cod"         
7740: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22    },.    { "com"
7750: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7760: 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73  lication/x-msdos
7770: 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20  -program"       
7780: 7d 2c 0a 20 20 20 20 7b 20 22 63 70 69 6f 22 2c  },.    { "cpio",
7790: 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69         4, "appli
77a0: 63 61 74 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20  cation/x-cpio"  
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
77c0: 0a 20 20 20 20 7b 20 22 63 70 74 22 2c 20 20 20  .    { "cpt",   
77d0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
77e0: 74 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74  tion/mac-compact
77f0: 70 72 6f 22 20 20 20 20 20 20 20 20 7d 2c 0a 20  pro"        },. 
7800: 20 20 20 7b 20 22 63 73 68 22 2c 20 20 20 20 20     { "csh",     
7810: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7820: 6f 6e 2f 78 2d 63 73 68 22 20 20 20 20 20 20 20  on/x-csh"       
7830: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7840: 20 7b 20 22 63 73 73 22 2c 20 20 20 20 20 20 20   { "css",       
7850: 20 33 2c 20 22 74 65 78 74 2f 63 73 73 22 20 20   3, "text/css"  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7880: 20 22 64 63 72 22 2c 20 20 20 20 20 20 20 20 33   "dcr",        3
7890: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
78a0: 2d 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20  -director"      
78b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
78c0: 64 65 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20  deb",        3, 
78d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64  "application/x-d
78e0: 65 62 69 61 6e 2d 70 61 63 6b 61 67 65 22 20 20  ebian-package"  
78f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69      },.    { "di
7900: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
7910: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72  pplication/x-dir
7920: 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20  ector"          
7930: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c    },.    { "dl",
7940: 20 20 20 20 20 20 20 20 20 32 2c 20 22 76 69 64           2, "vid
7950: 65 6f 2f 64 6c 22 20 20 20 20 20 20 20 20 20 20  eo/dl"          
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 7d 2c 0a 20 20 20 20 7b 20 22 64 6d 73 22 2c 20  },.    { "dms", 
7980: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
7990: 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72  cation/octet-str
79a0: 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c  eam"          },
79b0: 0a 20 20 20 20 7b 20 22 64 6f 63 22 2c 20 20 20  .    { "doc",   
79c0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
79d0: 74 69 6f 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20  tion/msword"    
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
79f0: 20 20 20 7b 20 22 64 72 77 22 2c 20 20 20 20 20     { "drw",     
7a00: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
7a10: 6f 6e 2f 64 72 61 66 74 69 6e 67 22 20 20 20 20  on/drafting"    
7a20: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7a30: 20 7b 20 22 64 76 69 22 2c 20 20 20 20 20 20 20   { "dvi",       
7a40: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7a50: 2f 78 2d 64 76 69 22 20 20 20 20 20 20 20 20 20  /x-dvi"         
7a60: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7a70: 20 22 64 77 67 22 2c 20 20 20 20 20 20 20 20 33   "dwg",        3
7a80: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61  , "application/a
7a90: 63 61 64 22 20 20 20 20 20 20 20 20 20 20 20 20  cad"            
7aa0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7ab0: 64 78 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20  dxf",        3, 
7ac0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66  "application/dxf
7ad0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7ae0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78      },.    { "dx
7af0: 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  r",        3, "a
7b00: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72  pplication/x-dir
7b10: 65 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20  ector"          
7b20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 70 73 22    },.    { "eps"
7b30: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
7b40: 6c 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72  lication/postscr
7b50: 69 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ipt"            
7b60: 7d 2c 0a 20 20 20 20 7b 20 22 65 74 78 22 2c 20  },.    { "etx", 
7b70: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
7b80: 78 2d 73 65 74 65 78 74 22 20 20 20 20 20 20 20  x-setext"       
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7ba0: 0a 20 20 20 20 7b 20 22 65 78 65 22 2c 20 20 20  .    { "exe",   
7bb0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
7bc0: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
7bd0: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
7be0: 20 20 20 7b 20 22 65 7a 22 2c 20 20 20 20 20 20     { "ez",      
7bf0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
7c00: 6f 6e 2f 61 6e 64 72 65 77 2d 69 6e 73 65 74 22  on/andrew-inset"
7c10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7c20: 20 7b 20 22 66 22 2c 20 20 20 20 20 20 20 20 20   { "f",         
7c30: 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22   1, "text/plain"
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7c60: 20 22 66 39 30 22 2c 20 20 20 20 20 20 20 20 33   "f90",        3
7c70: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7ca0: 66 6c 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  fli",        3, 
7cb0: 22 76 69 64 65 6f 2f 66 6c 69 22 20 20 20 20 20  "video/fli"     
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 6c      },.    { "fl
7ce0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  v",        3, "v
7cf0: 69 64 65 6f 2f 66 6c 76 22 20 20 20 20 20 20 20  ideo/flv"       
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 69 66 22    },.    { "gif"
7d20: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
7d30: 67 65 2f 67 69 66 22 20 20 20 20 20 20 20 20 20  ge/gif"         
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 7d 2c 0a 20 20 20 20 7b 20 22 67 6c 22 2c 20 20  },.    { "gl",  
7d60: 20 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f         2, "video
7d70: 2f 67 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  /gl"            
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
7d90: 0a 20 20 20 20 7b 20 22 67 74 61 72 22 2c 20 20  .    { "gtar",  
7da0: 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61       4, "applica
7db0: 74 69 6f 6e 2f 78 2d 67 74 61 72 22 20 20 20 20  tion/x-gtar"    
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
7dd0: 20 20 20 7b 20 22 67 7a 22 2c 20 20 20 20 20 20     { "gz",      
7de0: 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69     2, "applicati
7df0: 6f 6e 2f 78 2d 67 7a 69 70 22 20 20 20 20 20 20  on/x-gzip"      
7e00: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
7e10: 20 7b 20 22 68 64 66 22 2c 20 20 20 20 20 20 20   { "hdf",       
7e20: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
7e30: 2f 78 2d 68 64 66 22 20 20 20 20 20 20 20 20 20  /x-hdf"         
7e40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
7e50: 20 22 68 68 22 2c 20 20 20 20 20 20 20 20 20 32   "hh",         2
7e60: 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 20  , "text/plain"  
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
7e90: 68 71 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  hqx",        3, 
7ea0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63  "application/mac
7eb0: 2d 62 69 6e 68 65 78 34 30 22 20 20 20 20 20 20  -binhex40"      
7ec0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22      },.    { "h"
7ed0: 2c 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74  ,          1, "t
7ee0: 65 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20  ext/plain"      
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22    },.    { "htm"
7f10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
7f20: 74 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d  t/html; charset=
7f30: 75 74 66 2d 38 22 20 20 20 20 20 20 20 20 20 20  utf-8"          
7f40: 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c  },.    { "html",
7f50: 20 20 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f         4, "text/
7f60: 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74  html; charset=ut
7f70: 66 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c  f-8"          },
7f80: 0a 20 20 20 20 7b 20 22 69 63 65 22 2c 20 20 20  .    { "ice",   
7f90: 20 20 20 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65       3, "x-confe
7fa0: 72 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b  rence/x-cooltalk
7fb0: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
7fc0: 20 20 20 7b 20 22 69 65 66 22 2c 20 20 20 20 20     { "ief",     
7fd0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 69 65 66     3, "image/ief
7fe0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7ff0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8000: 20 7b 20 22 69 67 65 73 22 2c 20 20 20 20 20 20   { "iges",      
8010: 20 34 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22   4, "model/iges"
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8040: 20 22 69 67 73 22 2c 20 20 20 20 20 20 20 20 33   "igs",        3
8050: 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 20  , "model/iges"  
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8080: 69 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ips",        3, 
8090: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69  "application/x-i
80a0: 70 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20  pscript"        
80b0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70      },.    { "ip
80c0: 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  x",        3, "a
80d0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69  pplication/x-ipi
80e0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
80f0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22    },.    { "jad"
8100: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
8110: 74 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61  t/vnd.sun.j2me.a
8120: 70 70 2d 64 65 73 63 72 69 70 74 6f 72 22 20 20  pp-descriptor"  
8130: 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 72 22 2c 20  },.    { "jar", 
8140: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8150: 63 61 74 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68  cation/java-arch
8160: 69 76 65 22 20 20 20 20 20 20 20 20 20 20 7d 2c  ive"          },
8170: 0a 20 20 20 20 7b 20 22 6a 70 65 67 22 2c 20 20  .    { "jpeg",  
8180: 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a       4, "image/j
8190: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
81b0: 20 20 20 7b 20 22 6a 70 65 22 2c 20 20 20 20 20     { "jpe",     
81c0: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65     3, "image/jpe
81d0: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
81e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
81f0: 20 7b 20 22 6a 70 67 22 2c 20 20 20 20 20 20 20   { "jpg",       
8200: 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22   3, "image/jpeg"
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8230: 20 22 6a 73 22 2c 20 20 20 20 20 20 20 20 20 32   "js",         2
8240: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8250: 2d 6a 61 76 61 73 63 72 69 70 74 22 20 20 20 20  -javascript"    
8260: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8270: 6b 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20  kar",        3, 
8280: 22 61 75 64 69 6f 2f 6d 69 64 69 22 20 20 20 20  "audio/midi"    
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 61      },.    { "la
82b0: 74 65 78 22 2c 20 20 20 20 20 20 35 2c 20 22 61  tex",      5, "a
82c0: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74  pplication/x-lat
82d0: 65 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ex"             
82e0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22    },.    { "lha"
82f0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8300: 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73  lication/octet-s
8310: 74 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20  tream"          
8320: 7d 2c 0a 20 20 20 20 7b 20 22 6c 73 70 22 2c 20  },.    { "lsp", 
8330: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8340: 63 61 74 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20  cation/x-lisp"  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8360: 0a 20 20 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20  .    { "lzh",   
8370: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8380: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
8390: 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  m"          },. 
83a0: 20 20 20 7b 20 22 6d 22 2c 20 20 20 20 20 20 20     { "m",       
83b0: 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69     1, "text/plai
83c0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
83d0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
83e0: 20 7b 20 22 6d 33 75 22 2c 20 20 20 20 20 20 20   { "m3u",       
83f0: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65   3, "audio/x-mpe
8400: 67 75 72 6c 22 20 20 20 20 20 20 20 20 20 20 20  gurl"           
8410: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8420: 20 22 6d 61 6e 22 2c 20 20 20 20 20 20 20 20 33   "man",        3
8430: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8440: 2d 74 72 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20  -troff-man"     
8450: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8460: 6d 65 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  me",         2, 
8470: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
8480: 72 6f 66 66 2d 6d 65 22 20 20 20 20 20 20 20 20  roff-me"        
8490: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65      },.    { "me
84a0: 73 68 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  sh",       4, "m
84b0: 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20  odel/mesh"      
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22    },.    { "mid"
84e0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
84f0: 69 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20  io/midi"        
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 69 22 2c  },.    { "midi",
8520: 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f         4, "audio
8530: 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20 20  /midi"          
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8550: 0a 20 20 20 20 7b 20 22 6d 69 66 22 2c 20 20 20  .    { "mif",   
8560: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8570: 74 69 6f 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20  tion/x-mif"     
8580: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8590: 20 20 20 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20     { "mime",    
85a0: 20 20 20 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22     4, "www/mime"
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
85d0: 20 7b 20 22 6d 6f 76 69 65 22 2c 20 20 20 20 20   { "movie",     
85e0: 20 35 2c 20 22 76 69 64 65 6f 2f 78 2d 73 67 69   5, "video/x-sgi
85f0: 2d 6d 6f 76 69 65 22 20 20 20 20 20 20 20 20 20  -movie"         
8600: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8610: 20 22 6d 6f 76 22 2c 20 20 20 20 20 20 20 20 33   "mov",        3
8620: 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69  , "video/quickti
8630: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
8640: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8650: 6d 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20  mp2",        3, 
8660: 22 61 75 64 69 6f 2f 6d 70 65 67 22 20 20 20 20  "audio/mpeg"    
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70      },.    { "mp
8690: 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76  2",        3, "v
86a0: 69 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20  ideo/mpeg"      
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22    },.    { "mp3"
86d0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
86e0: 69 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20  io/mpeg"        
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 65 67 22 2c  },.    { "mpeg",
8710: 20 20 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f         4, "video
8720: 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20 20  /mpeg"          
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8740: 0a 20 20 20 20 7b 20 22 6d 70 65 22 2c 20 20 20  .    { "mpe",   
8750: 20 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d       3, "video/m
8760: 70 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20  peg"            
8770: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8780: 20 20 20 7b 20 22 6d 70 67 61 22 2c 20 20 20 20     { "mpga",    
8790: 20 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65     4, "audio/mpe
87a0: 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g"              
87b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
87c0: 20 7b 20 22 6d 70 67 22 2c 20 20 20 20 20 20 20   { "mpg",       
87d0: 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22   3, "video/mpeg"
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8800: 20 22 6d 73 22 2c 20 20 20 20 20 20 20 20 20 32   "ms",         2
8810: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8820: 2d 74 72 6f 66 66 2d 6d 73 22 20 20 20 20 20 20  -troff-ms"      
8830: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8840: 6d 73 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20  msh",        3, 
8850: 22 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 20 20 20  "model/mesh"    
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 63      },.    { "nc
8880: 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61  ",         2, "a
8890: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74  pplication/x-net
88a0: 63 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20  cdf"            
88b0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22    },.    { "oda"
88c0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
88d0: 6c 69 63 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20  lication/oda"   
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 7d 2c 0a 20 20 20 20 7b 20 22 6f 67 67 22 2c 20  },.    { "ogg", 
8900: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8910: 63 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20  cation/ogg"     
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8930: 0a 20 20 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20  .    { "ogm",   
8940: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8950: 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20  tion/ogg"       
8960: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8970: 20 20 20 7b 20 22 70 62 6d 22 2c 20 20 20 20 20     { "pbm",     
8980: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70     3, "image/x-p
8990: 6f 72 74 61 62 6c 65 2d 62 69 74 6d 61 70 22 20  ortable-bitmap" 
89a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
89b0: 20 7b 20 22 70 64 62 22 2c 20 20 20 20 20 20 20   { "pdb",       
89c0: 20 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d   3, "chemical/x-
89d0: 70 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20  pdb"            
89e0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
89f0: 20 22 70 64 66 22 2c 20 20 20 20 20 20 20 20 33   "pdf",        3
8a00: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70  , "application/p
8a10: 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  df"             
8a20: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8a30: 70 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  pgm",        3, 
8a40: 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c  "image/x-portabl
8a50: 65 2d 67 72 61 79 6d 61 70 22 20 20 20 20 20 20  e-graymap"      
8a60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67      },.    { "pg
8a70: 6e 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  n",        3, "a
8a80: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65  pplication/x-che
8a90: 73 73 2d 70 67 6e 22 20 20 20 20 20 20 20 20 20  ss-pgn"         
8aa0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 70 22    },.    { "pgp"
8ab0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8ac0: 6c 69 63 61 74 69 6f 6e 2f 70 67 70 22 20 20 20  lication/pgp"   
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 7d 2c 0a 20 20 20 20 7b 20 22 70 6c 22 2c 20 20  },.    { "pl",  
8af0: 20 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69         2, "appli
8b00: 63 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20  cation/x-perl"  
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8b20: 0a 20 20 20 20 7b 20 22 70 6d 22 2c 20 20 20 20  .    { "pm",    
8b30: 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61       2, "applica
8b40: 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20  tion/x-perl"    
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8b60: 20 20 20 7b 20 22 70 6e 67 22 2c 20 20 20 20 20     { "png",     
8b70: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67     3, "image/png
8b80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
8b90: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8ba0: 20 7b 20 22 70 6e 6d 22 2c 20 20 20 20 20 20 20   { "pnm",       
8bb0: 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72   3, "image/x-por
8bc0: 74 61 62 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20  table-anymap"   
8bd0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8be0: 20 22 70 6f 74 22 2c 20 20 20 20 20 20 20 20 33   "pot",        3
8bf0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d  , "application/m
8c00: 73 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20  spowerpoint"    
8c10: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8c20: 70 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  ppm",        3, 
8c30: 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c  "image/x-portabl
8c40: 65 2d 70 69 78 6d 61 70 22 20 20 20 20 20 20 20  e-pixmap"       
8c50: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70      },.    { "pp
8c60: 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  s",        3, "a
8c70: 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77  pplication/mspow
8c80: 65 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20  erpoint"        
8c90: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 74 22    },.    { "ppt"
8ca0: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8cb0: 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72  lication/mspower
8cc0: 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20  point"          
8cd0: 7d 2c 0a 20 20 20 20 7b 20 22 70 70 7a 22 2c 20  },.    { "ppz", 
8ce0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
8cf0: 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f  cation/mspowerpo
8d00: 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c  int"          },
8d10: 0a 20 20 20 20 7b 20 22 70 72 65 22 2c 20 20 20  .    { "pre",   
8d20: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
8d30: 74 69 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65  tion/x-freelance
8d40: 22 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  "           },. 
8d50: 20 20 20 7b 20 22 70 72 74 22 2c 20 20 20 20 20     { "prt",     
8d60: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
8d70: 6f 6e 2f 70 72 6f 5f 65 6e 67 22 20 20 20 20 20  on/pro_eng"     
8d80: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8d90: 20 7b 20 22 70 73 22 2c 20 20 20 20 20 20 20 20   { "ps",        
8da0: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
8db0: 2f 70 6f 73 74 73 63 72 69 70 74 22 20 20 20 20  /postscript"    
8dc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8dd0: 20 22 71 74 22 2c 20 20 20 20 20 20 20 20 20 32   "qt",         2
8de0: 2c 20 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69  , "video/quickti
8df0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
8e00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
8e10: 72 61 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  ra",         2, 
8e20: 22 61 75 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64  "audio/x-realaud
8e30: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
8e40: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61      },.    { "ra
8e50: 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  m",        3, "a
8e60: 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75  udio/x-pn-realau
8e70: 64 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  dio"            
8e80: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 72 22    },.    { "rar"
8e90: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70  ,        3, "app
8ea0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63  lication/x-rar-c
8eb0: 6f 6d 70 72 65 73 73 65 64 22 20 20 20 20 20 20  ompressed"      
8ec0: 7d 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20  },.    { "ras", 
8ed0: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
8ee0: 2f 63 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20  /cmu-raster"    
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
8f00: 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20  .    { "ras",   
8f10: 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78       3, "image/x
8f20: 2d 63 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20  -cmu-raster"    
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
8f40: 20 20 20 7b 20 22 72 67 62 22 2c 20 20 20 20 20     { "rgb",     
8f50: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72     3, "image/x-r
8f60: 67 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gb"             
8f70: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
8f80: 20 7b 20 22 72 6d 22 2c 20 20 20 20 20 20 20 20   { "rm",        
8f90: 20 32 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d   2, "audio/x-pn-
8fa0: 72 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20  realaudio"      
8fb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
8fc0: 20 22 72 6f 66 66 22 2c 20 20 20 20 20 20 20 34   "roff",       4
8fd0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
8fe0: 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20 20  -troff"         
8ff0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9000: 72 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20  rpm",        3, 
9010: 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c  "audio/x-pn-real
9020: 61 75 64 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20  audio-plugin"   
9030: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74      },.    { "rt
9040: 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61  f",        3, "a
9050: 70 70 6c 69 63 61 74 69 6f 6e 2f 72 74 66 22 20  pplication/rtf" 
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22    },.    { "rtf"
9080: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
9090: 74 2f 72 74 66 22 20 20 20 20 20 20 20 20 20 20  t/rtf"          
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 7d 2c 0a 20 20 20 20 7b 20 22 72 74 78 22 2c 20  },.    { "rtx", 
90c0: 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f         3, "text/
90d0: 72 69 63 68 74 65 78 74 22 20 20 20 20 20 20 20  richtext"       
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
90f0: 0a 20 20 20 20 7b 20 22 73 63 6d 22 2c 20 20 20  .    { "scm",   
9100: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9110: 74 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65  tion/x-lotusscre
9120: 65 6e 63 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20  encam"      },. 
9130: 20 20 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20     { "set",     
9140: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9150: 6f 6e 2f 73 65 74 22 20 20 20 20 20 20 20 20 20  on/set"         
9160: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9170: 20 7b 20 22 73 67 6d 6c 22 2c 20 20 20 20 20 20   { "sgml",      
9180: 20 34 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20   4, "text/sgml" 
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
91b0: 20 22 73 67 6d 22 2c 20 20 20 20 20 20 20 20 33   "sgm",        3
91c0: 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 20 20  , "text/sgml"   
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
91f0: 73 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20  sh",         2, 
9200: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73  "application/x-s
9210: 68 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h"              
9220: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68      },.    { "sh
9230: 61 72 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  ar",       4, "a
9240: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61  pplication/x-sha
9250: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r"              
9260: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f    },.    { "silo
9270: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64  ",       4, "mod
9280: 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20  el/mesh"        
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 7d 2c 0a 20 20 20 20 7b 20 22 73 69 74 22 2c 20  },.    { "sit", 
92b0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
92c0: 63 61 74 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74  cation/x-stuffit
92d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  "             },
92e0: 0a 20 20 20 20 7b 20 22 73 6b 64 22 2c 20 20 20  .    { "skd",   
92f0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9300: 74 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20  tion/x-koan"    
9310: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9320: 20 20 20 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20     { "skm",     
9330: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9340: 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20  on/x-koan"      
9350: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9360: 20 7b 20 22 73 6b 70 22 2c 20 20 20 20 20 20 20   { "skp",       
9370: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9380: 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20  /x-koan"        
9390: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
93a0: 20 22 73 6b 74 22 2c 20 20 20 20 20 20 20 20 33   "skt",        3
93b0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
93c0: 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20  -koan"          
93d0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
93e0: 73 6d 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20  smi",        3, 
93f0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69  "application/smi
9400: 6c 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l"              
9410: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d      },.    { "sm
9420: 69 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  il",       4, "a
9430: 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22  pplication/smil"
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22    },.    { "snd"
9460: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64  ,        3, "aud
9470: 69 6f 2f 62 61 73 69 63 22 20 20 20 20 20 20 20  io/basic"       
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 7d 2c 0a 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20  },.    { "sol", 
94a0: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
94b0: 63 61 74 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20  cation/solids"  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
94d0: 0a 20 20 20 20 7b 20 22 73 70 6c 22 2c 20 20 20  .    { "spl",   
94e0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
94f0: 74 69 6f 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c  tion/x-futurespl
9500: 61 73 68 22 20 20 20 20 20 20 20 20 7d 2c 0a 20  ash"        },. 
9510: 20 20 20 7b 20 22 73 72 63 22 2c 20 20 20 20 20     { "src",     
9520: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9530: 6f 6e 2f 78 2d 77 61 69 73 2d 73 6f 75 72 63 65  on/x-wais-source
9540: 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  "         },.   
9550: 20 7b 20 22 73 74 65 70 22 2c 20 20 20 20 20 20   { "step",      
9560: 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   4, "application
9570: 2f 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20  /STEP"          
9580: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9590: 20 22 73 74 6c 22 2c 20 20 20 20 20 20 20 20 33   "stl",        3
95a0: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53  , "application/S
95b0: 4c 41 22 20 20 20 20 20 20 20 20 20 20 20 20 20  LA"             
95c0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
95d0: 73 74 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  stp",        3, 
95e0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45  "application/STE
95f0: 50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P"              
9600: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76      },.    { "sv
9610: 34 63 70 69 6f 22 2c 20 20 20 20 37 2c 20 22 61  4cpio",    7, "a
9620: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34  pplication/x-sv4
9630: 63 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20  cpio"           
9640: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63    },.    { "sv4c
9650: 72 63 22 2c 20 20 20 20 20 36 2c 20 22 61 70 70  rc",     6, "app
9660: 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72  lication/x-sv4cr
9670: 63 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c"              
9680: 7d 2c 0a 20 20 20 20 7b 20 22 73 76 67 22 2c 20  },.    { "svg", 
9690: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
96a0: 2f 73 76 67 2b 78 6d 6c 22 20 20 20 20 20 20 20  /svg+xml"       
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
96c0: 0a 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20  .    { "swf",   
96d0: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
96e0: 74 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65  tion/x-shockwave
96f0: 2d 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20  -flash"     },. 
9700: 20 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20     { "t",       
9710: 20 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69     1, "applicati
9720: 6f 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20  on/x-troff"     
9730: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9740: 20 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20   { "tar",       
9750: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9760: 2f 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20  /x-tar"         
9770: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9780: 20 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33   "tcl",        3
9790: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78  , "application/x
97a0: 2d 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20  -tcl"           
97b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
97c0: 74 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tex",        3, 
97d0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74  "application/x-t
97e0: 65 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ex"             
97f0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65      },.    { "te
9800: 78 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61  xi",       4, "a
9810: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78  pplication/x-tex
9820: 69 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20  info"           
9830: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69    },.    { "texi
9840: 6e 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70  nfo",    7, "app
9850: 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e  lication/x-texin
9860: 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  fo"             
9870: 7d 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20  },.    { "tgz", 
9880: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9890: 63 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22  cation/x-tar-gz"
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
98b0: 0a 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20  .    { "tiff",  
98c0: 20 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74       4, "image/t
98d0: 69 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20  iff"            
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
98f0: 20 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20     { "tif",     
9900: 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66     3, "image/tif
9910: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
9920: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9930: 20 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20   { "tr",        
9940: 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   2, "application
9950: 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20  /x-troff"       
9960: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9970: 20 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33   "tsi",        3
9980: 2c 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64  , "audio/TSP-aud
9990: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
99a0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
99b0: 74 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20  tsp",        3, 
99c0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70  "application/dsp
99d0: 74 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20  type"           
99e0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73      },.    { "ts
99f0: 76 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  v",        3, "t
9a00: 65 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65  ext/tab-separate
9a10: 64 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20  d-values"       
9a20: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22    },.    { "txt"
9a30: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78  ,        3, "tex
9a40: 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20  t/plain"        
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20  },.    { "unv", 
9a70: 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69         3, "appli
9a80: 63 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20  cation/i-deas"  
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9aa0: 0a 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20  .    { "ustar", 
9ab0: 20 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61       5, "applica
9ac0: 74 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20  tion/x-ustar"   
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9ae0: 20 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20     { "vcd",     
9af0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9b00: 6f 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20  on/x-cdlink"    
9b10: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9b20: 20 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20   { "vda",       
9b30: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9b40: 2f 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20  /vda"           
9b50: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9b60: 20 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33   "viv",        3
9b70: 2c 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76  , "video/vnd.viv
9b80: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
9b90: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9ba0: 76 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20  vivo",       4, 
9bb0: 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22  "video/vnd.vivo"
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72      },.    { "vr
9be0: 6d 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d  ml",       4, "m
9bf0: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 73 69 78    },.    { "vsix
9c20: 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70  ",       4, "app
9c30: 6c 69 63 61 74 69 6f 6e 2f 76 73 69 78 22 20 20  lication/vsix"  
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 7d 2c 0a 20 20 20 20 7b 20 22 77 61 76 22 2c 20  },.    { "wav", 
9c60: 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f         3, "audio
9c70: 2f 78 2d 77 61 76 22 20 20 20 20 20 20 20 20 20  /x-wav"         
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9c90: 0a 20 20 20 20 7b 20 22 77 61 78 22 2c 20 20 20  .    { "wax",   
9ca0: 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78       3, "audio/x
9cb0: 2d 6d 73 2d 77 61 78 22 20 20 20 20 20 20 20 20  -ms-wax"        
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
9cd0: 20 20 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20     { "wiki",    
9ce0: 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69     4, "applicati
9cf0: 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69  on/x-fossil-wiki
9d00: 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  "         },.   
9d10: 20 7b 20 22 77 6d 61 22 2c 20 20 20 20 20 20 20   { "wma",       
9d20: 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d   3, "audio/x-ms-
9d30: 77 6d 61 22 20 20 20 20 20 20 20 20 20 20 20 20  wma"            
9d40: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9d50: 20 22 77 6d 76 22 2c 20 20 20 20 20 20 20 20 33   "wmv",        3
9d60: 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d  , "video/x-ms-wm
9d70: 76 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v"              
9d80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9d90: 77 6d 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20  wmx",        3, 
9da0: 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22  "video/x-ms-wmx"
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 72      },.    { "wr
9dd0: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d  l",        3, "m
9de0: 6f 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20  odel/vrml"      
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78 22    },.    { "wvx"
9e10: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64  ,        3, "vid
9e20: 65 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20 20  eo/x-ms-wvx"    
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 7d 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c 20  },.    { "xbm", 
9e50: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
9e60: 2f 78 2d 78 62 69 74 6d 61 70 22 20 20 20 20 20  /x-xbitmap"     
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
9e80: 0a 20 20 20 20 7b 20 22 78 6c 63 22 2c 20 20 20  .    { "xlc",   
9e90: 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61       3, "applica
9ea0: 74 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65  tion/vnd.ms-exce
9eb0: 6c 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  l"          },. 
9ec0: 20 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20 20     { "xll",     
9ed0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
9ee0: 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22  on/vnd.ms-excel"
9ef0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
9f00: 20 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20 20 20   { "xlm",       
9f10: 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e   3, "application
9f20: 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20  /vnd.ms-excel"  
9f30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
9f40: 20 22 78 6c 73 22 2c 20 20 20 20 20 20 20 20 33   "xls",        3
9f50: 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76  , "application/v
9f60: 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20  nd.ms-excel"    
9f70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
9f80: 78 6c 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20  xlw",        3, 
9f90: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64  "application/vnd
9fa0: 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20  .ms-excel"      
9fb0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6d      },.    { "xm
9fc0: 6c 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74  l",        3, "t
9fd0: 65 78 74 2f 78 6d 6c 22 20 20 20 20 20 20 20 20  ext/xml"        
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d 22    },.    { "xpm"
a000: 2c 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61  ,        3, "ima
a010: 67 65 2f 78 2d 78 70 69 78 6d 61 70 22 20 20 20  ge/x-xpixmap"   
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 7d 2c 0a 20 20 20 20 7b 20 22 78 77 64 22 2c 20  },.    { "xwd", 
a040: 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65         3, "image
a050: 2f 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22 20  /x-xwindowdump" 
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
a070: 0a 20 20 20 20 7b 20 22 78 79 7a 22 2c 20 20 20  .    { "xyz",   
a080: 20 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61       3, "chemica
a090: 6c 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20  l/x-pdb"        
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
a0b0: 20 20 20 7b 20 22 7a 69 70 22 2c 20 20 20 20 20     { "zip",     
a0c0: 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69     3, "applicati
a0d0: 6f 6e 2f 7a 69 70 22 20 20 20 20 20 20 20 20 20  on/zip"         
a0e0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d            },.  }
a0f0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d 65  ;..  for(i=nName
a100: 2d 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d 65  -1; i>0 && zName
a110: 5b 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d  [i]!='.'; i--){}
a120: 0a 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b  .  z = &zName[i+
a130: 31 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d  1];.  len = nNam
a140: 65 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65 6e  e - i;.  if( len
a150: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 53 75  <(int)sizeof(zSu
a160: 66 66 69 78 29 2d 31 20 29 7b 0a 20 20 20 20 73  ffix)-1 ){.    s
a170: 74 72 63 70 79 28 7a 53 75 66 66 69 78 2c 20 7a  trcpy(zSuffix, z
a180: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
a190: 7a 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b 2b 29  zSuffix[i]; i++)
a1a0: 20 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20 74 6f   zSuffix[i] = to
a1b0: 6c 6f 77 65 72 28 7a 53 75 66 66 69 78 5b 69 5d  lower(zSuffix[i]
a1c0: 29 3b 0a 20 20 20 20 66 69 72 73 74 20 3d 20 30  );.    first = 0
a1d0: 3b 0a 20 20 20 20 6c 61 73 74 20 3d 20 73 69 7a  ;.    last = siz
a1e0: 65 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a 65 6f  eof(aMime)/sizeo
a1f0: 66 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20 20 20  f(aMime[0]);.   
a200: 20 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c   while( first<=l
a210: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ast ){.      int
a220: 20 63 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 66   c;.      i = (f
a230: 69 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20  irst+last)/2;.  
a240: 20 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28 7a      c = strcmp(z
a250: 53 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b 69 5d  Suffix, aMime[i]
a260: 2e 7a 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20  .zSuffix);.     
a270: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
a280: 72 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d 69 6d  rn aMime[i].zMim
a290: 65 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  etype;.      if(
a2a0: 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
a2b0: 6c 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20  last = i-1;.    
a2c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a2d0: 20 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20   first = i+1;.  
a2e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a2f0: 20 20 72 65 74 75 72 6e 20 22 61 70 70 6c 69 63    return "applic
a300: 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65  ation/octet-stre
a310: 61 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  am";.}../*.** Th
a320: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
a330: 65 20 63 6f 6e 74 61 69 6e 73 20 31 20 66 6f 72  e contains 1 for
a340: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
a350: 74 68 61 74 20 61 72 65 20 70 65 72 6d 69 74 74  that are permitt
a360: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61 72  ed in.** the par
a370: 74 20 6f 66 20 74 68 65 20 55 52 4c 20 62 65 66  t of the URL bef
a380: 6f 72 65 20 74 68 65 20 71 75 65 72 79 20 70 61  ore the query pa
a390: 72 61 6d 65 74 65 72 73 20 61 6e 64 20 66 72 61  rameters and fra
a3a0: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  gment..**.** All
a3b0: 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73 3a  owed characters:
a3c0: 20 20 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a    0-9a-zA-Z,-./:
a3d0: 5f 7e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f  _~.**.** Disallo
a3e0: 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20 69  wed characters i
a3f0: 6e 63 6c 75 64 65 3a 20 20 21 22 23 24 25 26 27  nclude:  !"#$%&'
a400: 28 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d  ()*+;<=>?[\]^{|}
a410: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
a420: 20 63 68 61 72 20 61 6c 6c 6f 77 65 64 49 6e 4e   char allowedInN
a430: 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ame[] = {.      
a440: 2f 2a 20 20 78 30 20 20 78 31 20 20 78 32 20 20  /*  x0  x1  x2  
a450: 78 33 20 20 78 34 20 20 78 35 20 20 78 36 20 20  x3  x4  x5  x6  
a460: 78 37 20 20 78 38 20 20 78 39 20 20 78 61 20 20  x7  x8  x9  xa  
a470: 78 62 20 20 78 63 20 20 78 64 20 20 78 65 20 20  xb  xc  xd  xe  
a480: 78 66 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20  xf */./* 0x */  
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 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a4c0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
a4d0: 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 1x */   0,  0
a4e0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a4f0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a500: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a510: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 32 78 20  ,  0,  0,./* 2x 
a520: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
a530: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a540: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a550: 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   0,  1,  1,  1, 
a560: 20 31 2c 0a 2f 2a 20 33 78 20 2a 2f 20 20 20 31   1,./* 3x */   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 31 2c 20 20 31  ,  1,  1,  1,  1
a590: 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30  ,  1,  1,  0,  0
a5a0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
a5b0: 20 34 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20   4x */   0,  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 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a5f0: 20 31 2c 20 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f   1,  1,./* 5x */
a600: 20 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 31  ,  1,  1,  1,  1
a620: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30  ,  1,  1,  1,  0
a630: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
a640: 2c 0a 2f 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20  ,./* 6x */   0, 
a650: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a660: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a670: 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20   1,  1,  1,  1, 
a680: 20 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 37   1,  1,  1,./* 7
a690: 78 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31  x */   1,  1,  1
a6a0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
a6b0: 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31  ,  1,  1,  1,  1
a6c0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31  ,  0,  0,  0,  1
a6d0: 2c 20 20 30 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20  ,  0,./* 8x */  
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 20   0,  0,  0,  0, 
a710: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a   0,  0,  0,  0,.
a720: 2f 2a 20 39 78 20 2a 2f 20 20 20 30 2c 20 20 30  /* 9x */   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 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a760: 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 41 78 20  ,  0,  0,./* Ax 
a770: 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   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 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a7b0: 20 30 2c 0a 2f 2a 20 42 78 20 2a 2f 20 20 20 30   0,./* Bx */   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 20 20 30  ,  0,  0,  0,  0
a7f0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a  ,  0,  0,  0,./*
a800: 20 43 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20   Cx */   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 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a840: 20 30 2c 20 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f   0,  0,./* Dx */
a850: 20 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 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a890: 2c 0a 2f 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20  ,./* Ex */   0, 
a8a0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a8b0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a8c0: 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20   0,  0,  0,  0, 
a8d0: 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 46   0,  0,  0,./* F
a8e0: 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30  x */   0,  0,  0
a8f0: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a900: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a910: 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30  ,  0,  0,  0,  0
a920: 2c 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ,  0,.};../*.** 
a930: 52 65 6d 6f 76 65 20 61 6c 6c 20 64 69 73 61 6c  Remove all disal
a940: 6c 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73  lowed characters
a950: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74   in the input st
a960: 72 69 6e 67 20 7a 5b 5d 2e 20 20 43 6f 6e 76 65  ring z[].  Conve
a970: 72 74 20 61 6e 79 0a 2a 2a 20 64 69 73 61 6c 6c  rt any.** disall
a980: 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20  owed characters 
a990: 69 6e 74 6f 20 22 5f 22 2e 0a 2a 2a 0a 2a 2a 20  into "_"..**.** 
a9a0: 4e 6f 74 20 74 68 61 74 20 74 68 65 20 74 68 72  Not that the thr
a9b0: 65 65 20 63 68 61 72 61 63 74 65 72 20 73 65 71  ee character seq
a9c0: 75 65 6e 63 65 20 22 25 58 58 22 20 77 68 65 72  uence "%XX" wher
a9d0: 65 20 58 20 69 73 20 61 6e 79 20 62 79 74 65 20  e X is any byte 
a9e0: 69 73 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20  is.** converted 
a9f0: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 22 5f  into a single "_
aa00: 22 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a  " character..**.
aa10: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
aa20: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
aa30: 72 73 20 63 6f 6e 76 65 72 74 65 64 2e 20 20 41  rs converted.  A
aa40: 6e 20 22 25 58 58 22 20 2d 3e 20 22 5f 22 20 63  n "%XX" -> "_" c
aa50: 6f 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20 63 6f 75  onversion.** cou
aa60: 6e 74 73 20 61 73 20 61 20 73 69 6e 67 6c 65 20  nts as a single 
aa70: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
aa80: 61 74 69 63 20 69 6e 74 20 73 61 6e 69 74 69 7a  atic int sanitiz
aa90: 65 53 74 72 69 6e 67 28 63 68 61 72 20 2a 7a 29  eString(char *z)
aaa0: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 20  {.  int nChange 
aab0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a  = 0;.  while( *z
aac0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 61 6c 6c   ){.    if( !all
aad0: 6f 77 65 64 49 6e 4e 61 6d 65 5b 2a 28 75 6e 73  owedInName[*(uns
aae0: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 5d 20 29  igned char*)z] )
aaf0: 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  {.      if( *z==
ab00: 27 25 27 20 26 26 20 7a 5b 31 5d 21 3d 30 20 26  '%' && z[1]!=0 &
ab10: 26 20 7a 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20  & z[2]!=0 ){.   
ab20: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
ab30: 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 28 7a 5b      for(i=3; (z[
ab40: 69 2d 32 5d 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  i-2] = z[i])!=0;
ab50: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7d 0a   i++){}.      }.
ab60: 20 20 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a        *z = '_';.
ab70: 20 20 20 20 20 20 6e 43 68 61 6e 67 65 2b 2b 3b        nChange++;
ab80: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 2b 2b 3b 0a  .    }.    z++;.
ab90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
aba0: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ange;.}../*.** C
abb0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
abc0: 6f 66 20 22 2f 22 20 63 68 61 72 61 63 74 65 72  of "/" character
abd0: 73 20 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a  s in a string..*
abe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
abf0: 6e 74 53 6c 61 73 68 65 73 28 63 6f 6e 73 74 20  ntSlashes(const 
ac00: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
ac10: 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  n = 0;.  while( 
ac20: 2a 7a 20 29 20 69 66 28 20 2a 28 7a 2b 2b 29 3d  *z ) if( *(z++)=
ac30: 3d 27 2f 27 20 29 20 6e 2b 2b 3b 0a 20 20 72 65  ='/' ) n++;.  re
ac40: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
ac50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72   This routine pr
ac60: 6f 63 65 73 73 65 73 20 61 20 73 69 6e 67 6c 65  ocesses a single
ac70: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 6f 6e   HTTP request on
ac80: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20   standard input 
ac90: 61 6e 64 0a 2a 2a 20 73 65 6e 64 73 20 74 68 65  and.** sends the
aca0: 20 72 65 70 6c 79 20 74 6f 20 73 74 61 6e 64 61   reply to standa
acb0: 72 64 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74  rd output.  If t
acc0: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31  he argument is 1
acd0: 20 69 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61   it means.** tha
ace0: 74 20 77 65 20 61 72 65 20 73 68 6f 75 6c 64 20  t we are should 
acf0: 63 6c 6f 73 65 20 74 68 65 20 73 6f 63 6b 65 74  close the socket
ad00: 20 77 69 74 68 6f 75 74 20 70 72 6f 63 65 73 73   without process
ad10: 69 6e 67 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  ing additional.*
ad20: 2a 20 48 54 54 50 20 72 65 71 75 65 73 74 73 20  * HTTP requests 
ad30: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
ad40: 74 20 72 65 71 75 65 73 74 20 66 69 6e 69 73 68  t request finish
ad50: 65 73 2e 20 20 30 20 6d 65 61 6e 73 20 77 65 20  es.  0 means we 
ad60: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74  are.** allowed t
ad70: 6f 20 6b 65 65 70 20 74 68 65 20 63 6f 6e 6e 65  o keep the conne
ad80: 63 74 69 6f 6e 20 6f 70 65 6e 20 61 6e 64 20 74  ction open and t
ad90: 6f 20 70 72 6f 63 65 73 73 20 61 64 64 69 74 69  o process additi
ada0: 6f 6e 61 6c 20 72 65 71 75 65 73 74 73 2e 0a 2a  onal requests..*
adb0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
adc0: 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 63 6c 6f  ay choose to clo
add0: 73 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  se the connectio
ade0: 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 61 72  n even if the ar
adf0: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 30 2e 0a  gument.** is 0..
ae00: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  ** .** If the co
ae10: 6e 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  nnection should 
ae20: 62 65 20 63 6c 6f 73 65 64 2c 20 74 68 69 73 20  be closed, this 
ae30: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 65 78  routine calls ex
ae40: 69 74 28 29 20 61 6e 64 0a 2a 2a 20 74 68 75 73  it() and.** thus
ae50: 20 6e 65 76 65 72 20 72 65 74 75 72 6e 73 2e 20   never returns. 
ae60: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
ae70: 20 64 6f 65 73 20 72 65 74 75 72 6e 20 69 74 20   does return it 
ae80: 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 6f 74 68  means that anoth
ae90: 65 72 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65  er.** HTTP reque
aea0: 73 74 20 6d 61 79 20 61 70 70 65 61 72 20 6f 6e  st may appear on
aeb0: 20 74 68 65 20 77 69 72 65 2e 0a 2a 2f 0a 76 6f   the wire..*/.vo
aec0: 69 64 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71  id ProcessOneReq
aed0: 75 65 73 74 28 69 6e 74 20 66 6f 72 63 65 43 6c  uest(int forceCl
aee0: 6f 73 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  ose){.  int i, j
aef0: 2c 20 6a 30 2c 20 63 3b 0a 20 20 63 68 61 72 20  , j0, c;.  char 
af00: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
af10: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
af20: 70 61 72 73 65 20 75 70 20 61 20 73 74 72 69 6e  parse up a strin
af30: 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  g */.  struct st
af40: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
af50: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
af60: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
af70: 6f 20 62 65 20 72 65 74 72 69 65 76 65 64 20 2a  o be retrieved *
af80: 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  /.  FILE *in;   
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
afa0: 20 46 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f   For reading fro
afb0: 6d 20 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f  m CGI scripts */
afc0: 0a 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44  .#ifdef LOG_HEAD
afd0: 45 52 0a 20 20 46 49 4c 45 20 2a 68 64 72 4c 6f  ER.  FILE *hdrLo
afe0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
aff0: 2a 20 4c 6f 67 20 66 69 6c 65 20 66 6f 72 20 63  * Log file for c
b000: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 63  omplete header c
b010: 6f 6e 74 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  ontent */.#endif
b020: 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30  .  char zLine[10
b030: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  00];         /* 
b040: 41 20 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70  A buffer for inp
b050: 75 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d  ut lines or form
b060: 69 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20  ing names */..  
b070: 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74  /* Change direct
b080: 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f  ories to the roo
b090: 74 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69  t of the HTTP fi
b0a0: 6c 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20  lesystem.  */.  
b0b0: 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b  if( chdir(zRoot[
b0c0: 30 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22  0] ? zRoot : "/"
b0d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )!=0 ){.    char
b0e0: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20   zBuf[1000];.   
b0f0: 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 31 39 30   Malfunction(190
b100: 2c 20 20 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69  ,   /* LOG: chdi
b110: 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  r() failed */.  
b120: 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
b130: 68 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f  hdir to [%s] fro
b140: 6d 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20  m [%s]",.       
b150: 20 20 7a 52 6f 6f 74 2c 20 67 65 74 63 77 64 28    zRoot, getcwd(
b160: 7a 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a  zBuf,999));.  }.
b170: 20 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20    nRequest++;.. 
b180: 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74   /*.  ** We must
b190: 20 72 65 63 65 69 76 65 20 61 20 63 6f 6d 70 6c   receive a compl
b1a0: 65 74 65 20 68 65 61 64 65 72 20 77 69 74 68 69  ete header withi
b1b0: 6e 20 31 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a  n 15 seconds.  *
b1c0: 2f 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 41 4c  /.  signal(SIGAL
b1d0: 52 4d 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20  RM, Timeout);.  
b1e0: 73 69 67 6e 61 6c 28 53 49 47 53 45 47 56 2c 20  signal(SIGSEGV, 
b1f0: 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e  Timeout);.  sign
b200: 61 6c 28 53 49 47 50 49 50 45 2c 20 54 69 6d 65  al(SIGPIPE, Time
b210: 6f 75 74 29 3b 0a 20 20 69 66 28 20 75 73 65 54  out);.  if( useT
b220: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31  imeout ) alarm(1
b230: 35 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  5);..  /* Get th
b240: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20  e first line of 
b250: 74 68 65 20 72 65 71 75 65 73 74 20 61 6e 64 20  the request and 
b260: 70 61 72 73 65 20 6f 75 74 20 74 68 65 0a 20 20  parse out the.  
b270: 2a 2a 20 6d 65 74 68 6f 64 2c 20 74 68 65 20 73  ** method, the s
b280: 63 72 69 70 74 20 61 6e 64 20 74 68 65 20 70 72  cript and the pr
b290: 6f 74 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69  otocol..  */.  i
b2a0: 66 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73  f( fgets(zLine,s
b2b0: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64  izeof(zLine),std
b2c0: 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  in)==0 ){.    ex
b2d0: 69 74 28 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d 69  it(0);.  }.  omi
b2e0: 74 4c 6f 67 20 3d 20 30 3b 0a 20 20 6e 49 6e 20  tLog = 0;.  nIn 
b2f0: 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29  += strlen(zLine)
b300: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
b310: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20  e first line of 
b320: 74 68 65 20 48 54 54 50 20 72 65 71 75 65 73 74  the HTTP request
b330: 20 2a 2f 0a 20 20 7a 4d 65 74 68 6f 64 20 3d 20   */.  zMethod = 
b340: 53 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45  StrDup(GetFirstE
b350: 6c 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29  lement(zLine,&z)
b360: 29 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69 70 74  );.  zRealScript
b370: 20 3d 20 7a 53 63 72 69 70 74 20 3d 20 53 74 72   = zScript = Str
b380: 44 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d  Dup(GetFirstElem
b390: 65 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50  ent(z,&z));.  zP
b3a0: 72 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44 75 70  rotocol = StrDup
b3b0: 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74  (GetFirstElement
b3c0: 28 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28 20 7a  (z,&z));.  if( z
b3d0: 50 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73  Protocol==0 || s
b3e0: 74 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c  trncmp(zProtocol
b3f0: 2c 22 48 54 54 50 2f 22 2c 35 29 21 3d 30 20 7c  ,"HTTP/",5)!=0 |
b400: 7c 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74 6f 63  | strlen(zProtoc
b410: 6f 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 53 74  ol)!=8 ){.    St
b420: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 30  artResponse("400
b430: 20 42 61 64 20 52 65 71 75 65 73 74 22 29 3b 0a   Bad Request");.
b440: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
b450: 74 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65  tf(.      "Conte
b460: 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c  nt-type: text/pl
b470: 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22  ain\r\n".      "
b480: 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 69  \r\n".      "Thi
b490: 73 20 73 65 72 76 65 72 20 64 6f 65 73 20 6e 6f  s server does no
b4a0: 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  t understand the
b4b0: 20 72 65 71 75 65 73 74 65 64 20 70 72 6f 74 6f   requested proto
b4c0: 63 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20  col\n".    );.  
b4d0: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
b4e0: 2c 20 32 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  , 200); /* LOG: 
b4f0: 62 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20  bad protocol in 
b500: 48 54 54 50 20 68 65 61 64 65 72 20 2a 2f 0a 20  HTTP header */. 
b510: 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a     exit(0);.  }.
b520: 20 20 69 66 28 20 7a 53 63 72 69 70 74 5b 30 5d    if( zScript[0]
b530: 3d 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 32  ==0 ) NotFound(2
b540: 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 6d 70  10); /* LOG: Emp
b550: 74 79 20 72 65 71 75 65 73 74 20 55 52 49 20 2a  ty request URI *
b560: 2f 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c 6f  /.  if( forceClo
b570: 73 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43  se ){.    closeC
b580: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20  onnection = 1;. 
b590: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f 74   }else if( zProt
b5a0: 6f 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a  ocol[5]<'1' || z
b5b0: 50 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20  Protocol[7]<'1' 
b5c0: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e  ){.    closeConn
b5d0: 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a  ection = 1;.  }.
b5e0: 0a 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79 20  .  /* This very 
b5f0: 73 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f 6e  simple server on
b600: 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74  ly understands t
b610: 68 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a  he GET, POST.  *
b620: 2a 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68 6f  * and HEAD metho
b630: 64 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74  ds.  */.  if( st
b640: 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45  rcmp(zMethod,"GE
b650: 54 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d 70  T")!=0 && strcmp
b660: 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22 29  (zMethod,"POST")
b670: 21 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 74  !=0.       && st
b680: 72 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45  rcmp(zMethod,"HE
b690: 41 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 53  AD")!=0 ){.    S
b6a0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
b6b0: 31 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65  1 Not Implemente
b6c0: 64 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  d");.    nOut +=
b6d0: 20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22   printf(.      "
b6e0: 43 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65  Content-type: te
b6f0: 78 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20  xt/plain\r\n".  
b700: 20 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20      "\r\n".     
b710: 20 22 54 68 65 20 25 73 20 6d 65 74 68 6f 64 20   "The %s method 
b720: 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74  is not implement
b730: 65 64 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65  ed on this serve
b740: 72 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65  r.\n",.      zMe
b750: 74 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c  thod);.    MakeL
b760: 6f 67 45 6e 74 72 79 28 30 2c 20 32 32 30 29 3b  ogEntry(0, 220);
b770: 20 2f 2a 20 4c 4f 47 3a 20 55 6e 6b 6e 6f 77 6e   /* LOG: Unknown
b780: 20 72 65 71 75 65 73 74 20 6d 65 74 68 6f 64 20   request method 
b790: 2a 2f 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a  */.    exit(0);.
b7a0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
b7b0: 72 65 20 69 73 20 61 20 6c 6f 67 20 66 69 6c 65  re is a log file
b7c0: 20 28 69 66 20 7a 4c 6f 67 46 69 6c 65 21 3d 30   (if zLogFile!=0
b7d0: 29 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 74  ) and if the pat
b7e0: 68 6e 61 6d 65 20 69 6e 0a 20 20 2a 2a 20 74 68  hname in.  ** th
b7f0: 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20  e first line of 
b800: 74 68 65 20 68 74 74 70 20 72 65 71 75 65 73 74  the http request
b810: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61   contains the ma
b820: 67 69 63 20 73 74 72 69 6e 67 0a 20 20 2a 2a 20  gic string.  ** 
b830: 22 46 75 6c 6c 48 65 61 64 65 72 4c 6f 67 22 20  "FullHeaderLog" 
b840: 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
b850: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 74  omplete header t
b860: 65 78 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ext into the.  *
b870: 2a 20 66 69 6c 65 20 25 73 28 7a 4c 6f 67 46 69  * file %s(zLogFi
b880: 6c 65 29 2d 68 64 72 2e 20 20 4f 76 65 72 77 72  le)-hdr.  Overwr
b890: 69 74 65 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ite the file.  T
b8a0: 68 69 73 20 69 73 20 66 6f 72 20 70 72 6f 74 6f  his is for proto
b8b0: 63 6f 6c 0a 20 20 2a 2a 20 64 65 62 75 67 67 69  col.  ** debuggi
b8c0: 6e 67 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 6f  ng only and is o
b8d0: 6e 6c 79 20 65 6e 61 62 6c 65 64 20 69 66 20 61  nly enabled if a
b8e0: 6c 74 68 74 74 70 64 20 69 73 20 63 6f 6d 70 69  lthttpd is compi
b8f0: 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  led with.  ** th
b900: 65 20 2d 44 4c 4f 47 5f 48 45 41 44 45 52 3d 31  e -DLOG_HEADER=1
b910: 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69   option..  */.#i
b920: 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a  fdef LOG_HEADER.
b930: 20 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 0a 20    if( zLogFile. 
b940: 20 20 26 26 20 73 74 72 73 74 72 28 7a 53 63 72    && strstr(zScr
b950: 69 70 74 2c 22 46 75 6c 6c 48 65 61 64 65 72 4c  ipt,"FullHeaderL
b960: 6f 67 22 29 21 3d 30 0a 20 20 20 26 26 20 73 74  og")!=0.   && st
b970: 72 6c 65 6e 28 7a 4c 6f 67 46 69 6c 65 29 3c 73  rlen(zLogFile)<s
b980: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 35 30 0a  izeof(zLine)-50.
b990: 20 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66    ){.    sprintf
b9a0: 28 7a 4c 69 6e 65 2c 20 22 25 73 2d 68 64 72 22  (zLine, "%s-hdr"
b9b0: 2c 20 7a 4c 6f 67 46 69 6c 65 29 3b 0a 20 20 20  , zLogFile);.   
b9c0: 20 68 64 72 4c 6f 67 20 3d 20 66 6f 70 65 6e 28   hdrLog = fopen(
b9d0: 7a 4c 69 6e 65 2c 20 22 77 62 22 29 3b 0a 20 20  zLine, "wb");.  
b9e0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20  }.#endif...  /* 
b9f0: 47 65 74 20 61 6c 6c 20 74 68 65 20 6f 70 74 69  Get all the opti
ba00: 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74 68 61 74  onal fields that
ba10: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69 72 73   follow the firs
ba20: 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a  t line..  */.  z
ba30: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 7a 41  Cookie = 0;.  zA
ba40: 75 74 68 54 79 70 65 20 3d 20 30 3b 0a 20 20 7a  uthType = 0;.  z
ba50: 52 65 6d 6f 74 65 55 73 65 72 20 3d 20 30 3b 0a  RemoteUser = 0;.
ba60: 20 20 7a 52 65 66 65 72 65 72 20 3d 20 30 3b 0a    zReferer = 0;.
ba70: 20 20 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 3d    zIfNoneMatch =
ba80: 20 30 3b 0a 20 20 7a 49 66 4d 6f 64 69 66 69 65   0;.  zIfModifie
ba90: 64 53 69 6e 63 65 20 3d 20 30 3b 0a 20 20 77 68  dSince = 0;.  wh
baa0: 69 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65  ile( fgets(zLine
bab0: 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73  ,sizeof(zLine),s
bac0: 74 64 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61  tdin) ){.    cha
bad0: 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20  r *zFieldName;. 
bae0: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a     char *zVal;..
baf0: 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45  #ifdef LOG_HEADE
bb00: 52 0a 20 20 20 20 69 66 28 20 68 64 72 4c 6f 67  R.    if( hdrLog
bb10: 20 29 20 66 70 72 69 6e 74 66 28 68 64 72 4c 6f   ) fprintf(hdrLo
bb20: 67 2c 20 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b  g, "%s", zLine);
bb30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 49 6e 20  .#endif.    nIn 
bb40: 2b 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29  += strlen(zLine)
bb50: 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65  ;.    zFieldName
bb60: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
bb70: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b  nt(zLine,&zVal);
bb80: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
bb90: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c  ame==0 || *zFiel
bba0: 64 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  dName==0 ) break
bbb0: 3b 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c  ;.    RemoveNewl
bbc0: 69 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69  ine(zVal);.    i
bbd0: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
bbe0: 69 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41  ieldName,"User-A
bbf0: 67 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  gent:")==0 ){.  
bc00: 20 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72      zAgent = Str
bc10: 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d  Dup(zVal);.    }
bc20: 65 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65  else if( strcase
bc30: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22  cmp(zFieldName,"
bc40: 41 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a  Accept:")==0 ){.
bc50: 20 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20        zAccept = 
bc60: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
bc70: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
bc80: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
bc90: 65 2c 22 41 63 63 65 70 74 2d 45 6e 63 6f 64 69  e,"Accept-Encodi
bca0: 6e 67 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ng:")==0 ){.    
bcb0: 20 20 7a 41 63 63 65 70 74 45 6e 63 6f 64 69 6e    zAcceptEncodin
bcc0: 67 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  g = StrDup(zVal)
bcd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bce0: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
bcf0: 64 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c  dName,"Content-l
bd00: 65 6e 67 74 68 3a 22 29 3d 3d 30 20 29 7b 0a 20  ength:")==0 ){. 
bd10: 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e       zContentLen
bd20: 67 74 68 20 3d 20 53 74 72 44 75 70 28 7a 56 61  gth = StrDup(zVa
bd30: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
bd40: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
bd50: 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74  eldName,"Content
bd60: 2d 74 79 70 65 3a 22 29 3d 3d 30 20 29 7b 0a 20  -type:")==0 ){. 
bd70: 20 20 20 20 20 7a 43 6f 6e 74 65 6e 74 54 79 70       zContentTyp
bd80: 65 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29  e = StrDup(zVal)
bd90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
bda0: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
bdb0: 64 4e 61 6d 65 2c 22 52 65 66 65 72 65 72 3a 22  dName,"Referer:"
bdc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52  )==0 ){.      zR
bdd0: 65 66 65 72 65 72 20 3d 20 53 74 72 44 75 70 28  eferer = StrDup(
bde0: 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  zVal);.      if(
bdf0: 20 73 74 72 73 74 72 28 7a 56 61 6c 2c 20 22 64   strstr(zVal, "d
be00: 65 76 69 64 73 2e 6e 65 74 2f 22 29 21 3d 30 20  evids.net/")!=0 
be10: 29 7b 20 7a 52 65 66 65 72 65 72 20 3d 20 22 64  ){ zReferer = "d
be20: 65 76 69 64 73 2e 6e 65 74 2e 73 6d 75 74 22 3b  evids.net.smut";
be30: 0a 20 20 20 20 20 20 20 20 46 6f 72 62 69 64 64  .        Forbidd
be40: 65 6e 28 32 33 30 29 3b 20 2f 2a 20 4c 4f 47 3a  en(230); /* LOG:
be50: 20 52 65 66 65 72 72 65 72 20 69 73 20 64 65 76   Referrer is dev
be60: 69 64 73 2e 6e 65 74 20 2a 2f 0a 20 20 20 20 20  ids.net */.     
be70: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
be80: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
be90: 6c 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22  ldName,"Cookie:"
bea0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43  )==0 ){.      zC
beb0: 6f 6f 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e  ookie = StrAppen
bec0: 64 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a  d(zCookie,"; ",z
bed0: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Val);.    }else 
bee0: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
bef0: 46 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65  FieldName,"Conne
bf00: 63 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20  ction:")==0 ){. 
bf10: 20 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65       if( strcase
bf20: 63 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22  cmp(zVal,"close"
bf30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
bf40: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
bf50: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
bf60: 20 69 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65   if( !forceClose
bf70: 20 26 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a   && strcasecmp(z
bf80: 56 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65  Val, "keep-alive
bf90: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
bfa0: 20 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e   closeConnection
bfb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
bfc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
bfd0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
bfe0: 65 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b  e,"Host:")==0 ){
bff0: 0a 20 20 20 20 20 20 69 6e 74 20 69 6e 53 71 75  .      int inSqu
c000: 61 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  are = 0;.      c
c010: 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69 66 28  har c;.      if(
c020: 20 73 61 6e 69 74 69 7a 65 53 74 72 69 6e 67 28   sanitizeString(
c030: 7a 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  zVal) ){.       
c040: 20 46 6f 72 62 69 64 64 65 6e 28 32 34 30 29 3b   Forbidden(240);
c050: 20 20 2f 2a 20 4c 4f 47 3a 20 49 6c 6c 65 67 61    /* LOG: Illega
c060: 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53  l content in HOS
c070: 54 3a 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  T: parameter */.
c080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 48        }.      zH
c090: 74 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70  ttpHost = StrDup
c0a0: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zVal);.      zS
c0b0: 65 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72  erverPort = zSer
c0c0: 76 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70  verName = StrDup
c0d0: 28 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20  (zHttpHost);.   
c0e0: 20 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65     while( zServe
c0f0: 72 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a  rPort && (c = *z
c100: 53 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20  ServerPort)!=0. 
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
c120: 28 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75  (c!=':' || inSqu
c130: 61 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  are) ){.        
c140: 69 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53  if( c=='[' ) inS
c150: 71 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20  quare = 1;.     
c160: 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20     if( c==']' ) 
c170: 69 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20  inSquare = 0;.  
c180: 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72        zServerPor
c190: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
c1a0: 20 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f     if( zServerPo
c1b0: 72 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f  rt && *zServerPo
c1c0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a  rt ){.        *z
c1d0: 53 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a  ServerPort = 0;.
c1e0: 20 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50          zServerP
c1f0: 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ort++;.      }. 
c200: 20 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f       if( zRealPo
c210: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  rt ){.        zS
c220: 65 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44  erverPort = StrD
c230: 75 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20  up(zRealPort);. 
c240: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c250: 20 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28   if( strcasecmp(
c260: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68  zFieldName,"Auth
c270: 6f 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20  orization:")==0 
c280: 29 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79  ){.      zAuthTy
c290: 70 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65  pe = GetFirstEle
c2a0: 6d 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c  ment(StrDup(zVal
c2b0: 29 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20  ), &zAuthArg);. 
c2c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
c2d0: 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61  casecmp(zFieldNa
c2e0: 6d 65 2c 22 49 66 2d 4e 6f 6e 65 2d 4d 61 74 63  me,"If-None-Matc
c2f0: 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  h:")==0 ){.     
c300: 20 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20   zIfNoneMatch = 
c310: 53 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20  StrDup(zVal);.  
c320: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
c330: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
c340: 65 2c 22 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53  e,"If-Modified-S
c350: 69 6e 63 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  ince:")==0 ){.  
c360: 20 20 20 20 7a 49 66 4d 6f 64 69 66 69 65 64 53      zIfModifiedS
c370: 69 6e 63 65 20 3d 20 53 74 72 44 75 70 28 7a 56  ince = StrDup(zV
c380: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  al);.    }.  }.#
c390: 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52  ifdef LOG_HEADER
c3a0: 0a 20 20 69 66 28 20 68 64 72 4c 6f 67 20 29 20  .  if( hdrLog ) 
c3b0: 66 63 6c 6f 73 65 28 68 64 72 4c 6f 67 29 3b 0a  fclose(hdrLog);.
c3c0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 69 73  #endif..  /* Dis
c3d0: 61 6c 6c 6f 77 20 72 65 71 75 65 73 74 73 20 66  allow requests f
c3e0: 72 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c 69 65  rom certain clie
c3f0: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a 41 67  nts */.  if( zAg
c400: 65 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ent ){.    if( s
c410: 74 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 57  trstr(zAgent, "W
c420: 69 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a 20 20  indows_9")!=0.  
c430: 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67     || strstr(zAg
c440: 65 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d  ent, "Download_M
c450: 61 73 74 65 72 22 29 21 3d 30 0a 20 20 20 20 20  aster")!=0.     
c460: 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74  || strstr(zAgent
c470: 2c 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30 0a  , "Ezooms/")!=0.
c480: 20 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a       || strstr(z
c490: 41 67 65 6e 74 2c 20 22 48 54 54 72 61 63 6b 22  Agent, "HTTrack"
c4a0: 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72  )!=0.     || str
c4b0: 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 41 68 72  str(zAgent, "Ahr
c4c0: 65 66 73 42 6f 74 22 29 21 3d 30 0a 20 20 20 20  efsBot")!=0.    
c4d0: 29 7b 0a 20 20 20 20 20 20 46 6f 72 62 69 64 64  ){.      Forbidd
c4e0: 65 6e 28 32 35 30 29 3b 20 20 2f 2a 20 4c 4f 47  en(250);  /* LOG
c4f0: 3a 20 44 69 73 61 6c 6c 6f 77 65 64 20 75 73 65  : Disallowed use
c500: 72 20 61 67 65 6e 74 20 2a 2f 0a 20 20 20 20 7d  r agent */.    }
c510: 0a 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28  .  }.#if 0.  if(
c520: 20 7a 52 65 66 65 72 65 72 20 29 7b 0a 20 20 20   zReferer ){.   
c530: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
c540: 61 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d  ar *azDisallow[]
c550: 20 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b 69 64   = {.      "skid
c560: 72 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20  rowcrack.com",. 
c570: 20 20 20 20 20 22 68 6f 73 68 69 79 75 75 67 69       "hoshiyuugi
c580: 2e 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20  .tistory.com",. 
c590: 20 20 20 20 20 22 73 6b 69 64 72 6f 77 67 61 6d       "skidrowgam
c5a0: 65 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d 3b 0a  es.net",.    };.
c5b0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
c5c0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
c5d0: 28 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73 69 7a  (azDisallow)/siz
c5e0: 65 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 5b 30  eof(azDisallow[0
c5f0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
c600: 69 66 28 20 73 74 72 73 74 72 28 7a 52 65 66 65  if( strstr(zRefe
c610: 72 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f 77 5b  rer, azDisallow[
c620: 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])!=0 ){.      
c630: 20 20 4e 6f 74 46 6f 75 6e 64 28 32 36 30 29 3b    NotFound(260);
c640: 20 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c    /* LOG: Disall
c650: 6f 77 65 64 20 72 65 66 65 72 72 65 72 20 2a 2f  owed referrer */
c660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c670: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
c680: 4d 61 6b 65 20 61 6e 20 65 78 74 72 61 20 65 66  Make an extra ef
c690: 66 6f 72 74 20 74 6f 20 67 65 74 20 61 20 76 61  fort to get a va
c6a0: 6c 69 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  lid server name 
c6b0: 61 6e 64 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e  and port number.
c6c0: 0a 20 20 2a 2a 20 4f 6e 6c 79 20 4e 65 74 73 63  .  ** Only Netsc
c6d0: 61 70 65 20 70 72 6f 76 69 64 65 73 20 74 68 69  ape provides thi
c6e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  s information.  
c6f0: 49 66 20 74 68 65 20 62 72 6f 77 73 65 72 20 69  If the browser i
c700: 73 0a 20 20 2a 2a 20 49 6e 74 65 72 6e 65 74 20  s.  ** Internet 
c710: 45 78 70 6c 6f 72 65 72 2c 20 74 68 65 6e 20 77  Explorer, then w
c720: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 6f  e have to find o
c730: 75 74 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ut the informati
c740: 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 6f 75 72 73  on for.  ** ours
c750: 65 6c 76 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  elves..  */.  if
c760: 28 20 7a 53 65 72 76 65 72 4e 61 6d 65 3d 3d 30  ( zServerName==0
c770: 20 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 4e   ){.    zServerN
c780: 61 6d 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63  ame = SafeMalloc
c790: 28 20 31 30 30 20 29 3b 0a 20 20 20 20 67 65 74  ( 100 );.    get
c7a0: 68 6f 73 74 6e 61 6d 65 28 7a 53 65 72 76 65 72  hostname(zServer
c7b0: 4e 61 6d 65 2c 31 30 30 29 3b 0a 20 20 7d 0a 20  Name,100);.  }. 
c7c0: 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74   if( zServerPort
c7d0: 3d 3d 30 20 7c 7c 20 2a 7a 53 65 72 76 65 72 50  ==0 || *zServerP
c7e0: 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  ort==0 ){.    zS
c7f0: 65 72 76 65 72 50 6f 72 74 20 3d 20 44 45 46 41  erverPort = DEFA
c800: 55 4c 54 5f 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20  ULT_PORT;.  }.. 
c810: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 71   /* Remove the q
c820: 75 65 72 79 20 73 74 72 69 6e 67 20 66 72 6f 6d  uery string from
c830: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c840: 72 65 71 75 65 73 74 65 64 20 66 69 6c 65 2e 0a  requested file..
c850: 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63    */.  for(z=zSc
c860: 72 69 70 74 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d  ript; *z && *z!=
c870: 27 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66  '?'; z++){}.  if
c880: 28 20 2a 7a 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  ( *z=='?' ){.   
c890: 20 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20   zQuerySuffix = 
c8a0: 53 74 72 44 75 70 28 7a 29 3b 0a 20 20 20 20 2a  StrDup(z);.    *
c8b0: 7a 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  z = 0;.  }else{.
c8c0: 20 20 20 20 7a 51 75 65 72 79 53 75 66 66 69 78      zQuerySuffix
c8d0: 20 3d 20 22 22 3b 0a 20 20 7d 0a 20 20 7a 51 75   = "";.  }.  zQu
c8e0: 65 72 79 53 74 72 69 6e 67 20 3d 20 2a 7a 51 75  eryString = *zQu
c8f0: 65 72 79 53 75 66 66 69 78 20 3f 20 26 7a 51 75  erySuffix ? &zQu
c900: 65 72 79 53 75 66 66 69 78 5b 31 5d 20 3a 20 7a  erySuffix[1] : z
c910: 51 75 65 72 79 53 75 66 66 69 78 3b 0a 0a 20 20  QuerySuffix;..  
c920: 2f 2a 20 43 72 65 61 74 65 20 61 20 66 69 6c 65  /* Create a file
c930: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 50 4f 53   to hold the POS
c940: 54 20 71 75 65 72 79 20 64 61 74 61 2c 20 69 66  T query data, if
c950: 20 61 6e 79 2e 20 20 57 65 20 68 61 76 65 20 74   any.  We have t
c960: 6f 0a 20 20 2a 2a 20 64 6f 20 69 74 20 74 68 69  o.  ** do it thi
c970: 73 20 77 61 79 2e 20 20 57 65 20 63 61 6e 27 74  s way.  We can't
c980: 20 6a 75 73 74 20 70 61 73 73 20 74 68 65 20 66   just pass the f
c990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 64  ile descriptor d
c9a0: 6f 77 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  own to.  ** the 
c9b0: 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 62 65  child process be
c9c0: 63 61 75 73 65 20 74 68 65 20 66 67 65 74 73 28  cause the fgets(
c9d0: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68  ) function may h
c9e0: 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
c9f0: 20 72 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   read part of th
ca00: 65 20 50 4f 53 54 20 64 61 74 61 20 69 6e 74 6f  e POST data into
ca10: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 62 75   its internal bu
ca20: 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
ca30: 20 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27   zMethod[0]=='P'
ca40: 20 26 26 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67   && zContentLeng
ca50: 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  th!=0 ){.    int
ca60: 20 6c 65 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e   len = atoi(zCon
ca70: 74 65 6e 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20  tentLength);.   
ca80: 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20   FILE *out;.    
ca90: 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20  char *zBuf;.    
caa0: 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20  int n;..    if( 
cab0: 6c 65 6e 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f  len>MAX_CONTENT_
cac0: 4c 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20  LENGTH ){.      
cad0: 53 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35  StartResponse("5
cae0: 30 30 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c  00 Request too l
caf0: 61 72 67 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f  arge");.      nO
cb00: 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20  ut += printf(.  
cb10: 20 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74        "Content-t
cb20: 79 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c  ype: text/plain\
cb30: 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72  r\n".        "\r
cb40: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 54 6f 6f  \n".        "Too
cb50: 20 6d 75 63 68 20 50 4f 53 54 20 64 61 74 61 5c   much POST data\
cb60: 6e 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  n".      );.    
cb70: 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30    MakeLogEntry(0
cb80: 2c 20 32 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  , 270); /* LOG: 
cb90: 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67  Request too larg
cba0: 65 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28  e */.      exit(
cbb0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70  0);.    }.    sp
cbc0: 72 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66  rintf(zTmpNamBuf
cbd0: 2c 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61  , "/tmp/-post-da
cbe0: 74 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20 20  ta-XXXXXX");.   
cbf0: 20 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e   zTmpNam = zTmpN
cc00: 61 6d 42 75 66 3b 0a 20 20 20 20 69 66 28 20 6d  amBuf;.    if( m
cc10: 6b 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c  kstemp(zTmpNam)<
cc20: 30 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75  0 ){.      Malfu
cc30: 6e 63 74 69 6f 6e 28 32 38 30 2c 20 20 2f 2a 20  nction(280,  /* 
cc40: 4c 4f 47 3a 20 6d 6b 73 74 65 6d 70 28 29 20 66  LOG: mkstemp() f
cc50: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
cc60: 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20          "Cannot 
cc70: 63 72 65 61 74 65 20 61 20 74 65 6d 70 20 66 69  create a temp fi
cc80: 6c 65 20 69 6e 20 77 68 69 63 68 20 74 6f 20 73  le in which to s
cc90: 74 6f 72 65 20 50 4f 53 54 20 64 61 74 61 22 29  tore POST data")
cca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 20  ;.    }.    out 
ccb0: 3d 20 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c  = fopen(zTmpNam,
ccc0: 22 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 6f  "wb");.    if( o
ccd0: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ut==0 ){.      S
cce0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
ccf0: 30 20 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20  0 Cannot create 
cd00: 2f 74 6d 70 20 66 69 6c 65 22 29 3b 0a 20 20 20  /tmp file");.   
cd10: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
cd20: 66 28 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74  f(.        "Cont
cd30: 65 6e 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70  ent-type: text/p
cd40: 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20  lain\r\n".      
cd50: 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20    "\r\n".       
cd60: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "Could not open
cd70: 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74   \"%s\" for writ
cd80: 69 6e 67 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a  ing\n", zTmpNam.
cd90: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d        );.      M
cda0: 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32  akeLogEntry(0, 2
cdb0: 39 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e  90); /* LOG: can
cdc0: 6e 6f 74 20 63 72 65 61 74 65 20 74 65 6d 70 20  not create temp 
cdd0: 66 69 6c 65 20 66 6f 72 20 50 4f 53 54 20 2a 2f  file for POST */
cde0: 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a  .      exit(0);.
cdf0: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d      }.    zBuf =
ce00: 20 53 61 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e   SafeMalloc( len
ce10: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73  +1 );.    if( us
ce20: 65 54 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d  eTimeout ) alarm
ce30: 28 31 35 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b  (15 + len/2000);
ce40: 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a  .    n = fread(z
ce50: 42 75 66 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29  Buf,1,len,stdin)
ce60: 3b 0a 20 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a  ;.    nIn += n;.
ce70: 20 20 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c      fwrite(zBuf,
ce80: 31 2c 6e 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72  1,n,out);.    fr
ce90: 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 66 63  ee(zBuf);.    fc
cea0: 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a  lose(out);.  }..
ceb0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
cec0: 68 65 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20  he running time 
ced0: 69 73 20 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74  is not too great
cee0: 20 2a 2f 0a 20 20 69 66 28 20 75 73 65 54 69 6d   */.  if( useTim
cef0: 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 30 29  eout ) alarm(10)
cf00: 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  ;..  /* Convert 
cf10: 61 6c 6c 20 75 6e 75 73 75 61 6c 20 63 68 61 72  all unusual char
cf20: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 63  acters in the sc
cf30: 72 69 70 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22  ript name into "
cf40: 5f 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  _"..  **.  ** Th
cf50: 69 73 20 69 73 20 61 20 64 65 66 65 6e 73 65 20  is is a defense 
cf60: 61 67 61 69 6e 73 74 20 76 61 72 69 6f 75 73 20  against various 
cf70: 61 74 74 61 63 6b 73 2c 20 58 53 53 20 61 74 74  attacks, XSS att
cf80: 61 63 6b 73 20 69 6e 20 70 61 72 74 69 63 75 6c  acks in particul
cf90: 61 72 2e 0a 20 20 2a 2f 0a 20 20 73 61 6e 69 74  ar..  */.  sanit
cfa0: 69 7a 65 53 74 72 69 6e 67 28 7a 53 63 72 69 70  izeString(zScrip
cfb0: 74 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  t);..  /* Do not
cfc0: 20 61 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22   allow "/." or "
cfd0: 2f 2d 22 20 74 6f 20 74 6f 20 6f 63 63 75 72 20  /-" to to occur 
cfe0: 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20  anywhere in the 
cff0: 65 6e 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a  entity name..  *
d000: 2a 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  * This prevents 
d010: 61 74 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e  attacks involvin
d020: 67 20 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20  g ".." and also 
d030: 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 63 72 65  allows us to cre
d040: 61 74 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61  ate.  ** files a
d050: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 77  nd directories w
d060: 68 6f 73 65 20 6e 61 6d 65 73 20 62 65 67 69 6e  hose names begin
d070: 20 77 69 74 68 20 22 2d 22 20 6f 72 20 22 2e 22   with "-" or "."
d080: 20 77 68 69 63 68 20 61 72 65 0a 20 20 2a 2a 20   which are.  ** 
d090: 69 6e 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65  invisible to the
d0a0: 20 77 65 62 73 65 72 76 65 72 2e 0a 20 20 2a 2a   webserver..  **
d0b0: 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
d0c0: 20 20 41 6c 6c 6f 77 20 74 68 65 20 22 2f 2e 77    Allow the "/.w
d0d0: 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 20 70 72 65 66  ell-known/" pref
d0e0: 69 78 20 69 6e 20 61 63 63 6f 72 64 61 6e 63 65  ix in accordance
d0f0: 20 77 69 74 68 0a 20 20 2a 2a 20 52 46 43 2d 35   with.  ** RFC-5
d100: 37 38 35 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a  785.  */.  for(z
d110: 3d 7a 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b  =zScript; *z; z+
d120: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
d130: 27 2f 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e  '/' && (z[1]=='.
d140: 27 20 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 0a  ' || z[1]=='-').
d150: 20 20 20 20 20 26 26 20 28 7a 3e 7a 53 63 72 69       && (z>zScri
d160: 70 74 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 2c  pt || strncmp(z,
d170: 22 2f 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c  "/.well-known/",
d180: 31 33 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  13)!=0).    ){. 
d190: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33        NotFound(3
d1a0: 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74  00); /* LOG: Pat
d1b0: 68 20 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73  h element begins
d1c0: 20 77 69 74 68 20 22 2e 22 20 6f 72 20 22 2d 22   with "." or "-"
d1d0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   */.    }.  }.. 
d1e0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
d1f0: 68 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  hat the root of 
d200: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 73  the filesystem s
d210: 68 6f 75 6c 64 20 62 65 2e 20 20 49 66 20 74 68  hould be.  If th
d220: 65 0a 20 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54  e.  ** HTTP_HOST
d230: 20 70 61 72 61 6d 65 74 65 72 20 65 78 69 73 74   parameter exist
d240: 73 20 28 73 74 6f 72 65 64 20 69 6e 20 7a 48 74  s (stored in zHt
d250: 74 70 48 6f 73 74 29 20 74 68 65 6e 20 72 65 6d  tpHost) then rem
d260: 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72  ove the.  ** por
d270: 74 20 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68  t number from th
d280: 65 20 65 6e 64 20 28 69 66 20 61 6e 79 29 2c 20  e end (if any), 
d290: 63 6f 6e 76 65 72 74 20 61 6c 6c 20 63 68 61 72  convert all char
d2a0: 61 63 74 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a  acters to lower.
d2b0: 20 20 2a 2a 20 63 61 73 65 2c 20 61 6e 64 20 63    ** case, and c
d2c0: 6f 6e 76 65 72 74 20 61 6c 6c 20 22 2e 22 20 74  onvert all "." t
d2d0: 6f 20 22 5f 22 2e 20 20 54 68 65 6e 20 74 72 79  o "_".  Then try
d2e0: 20 74 6f 20 66 69 6e 64 20 61 20 64 69 72 65 63   to find a direc
d2f0: 74 6f 72 79 0a 20 20 2a 2a 20 77 69 74 68 20 74  tory.  ** with t
d300: 68 61 74 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  hat name and the
d310: 20 65 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73   extension .webs
d320: 69 74 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75  ite.  If not fou
d330: 6e 64 2c 20 6c 6f 6f 6b 0a 20 20 2a 2a 20 66 6f  nd, look.  ** fo
d340: 72 20 22 64 65 66 61 75 6c 74 2e 77 65 62 73 69  r "default.websi
d350: 74 65 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  te"..  */.  if( 
d360: 7a 53 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20  zScript[0]!='/' 
d370: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
d380: 33 31 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52  310); /* LOG: UR
d390: 49 20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74  I does not start
d3a0: 20 77 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20 7d   with "/" */.  }
d3b0: 0a 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52  .  if( strlen(zR
d3c0: 6f 6f 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f  oot)+40 >= sizeo
d3d0: 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20  f(zLine) ){.    
d3e0: 20 4e 6f 74 46 6f 75 6e 64 28 33 32 30 29 3b 20   NotFound(320); 
d3f0: 2f 2a 20 4c 4f 47 3a 20 55 52 49 20 74 6f 6f 20  /* LOG: URI too 
d400: 6c 6f 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  long */.  }.  if
d410: 28 20 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c  ( zHttpHost==0 |
d420: 7c 20 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d  | zHttpHost[0]==
d430: 30 20 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e  0 ){.    NotFoun
d440: 64 28 33 33 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  d(330);  /* LOG:
d450: 20 4d 69 73 73 69 6e 67 20 48 4f 53 54 3a 20 70   Missing HOST: p
d460: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65  arameter */.  }e
d470: 6c 73 65 20 69 66 28 20 73 74 72 6c 65 6e 28 7a  lse if( strlen(z
d480: 48 74 74 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e  HttpHost)+strlen
d490: 28 7a 52 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69  (zRoot)+10 >= si
d4a0: 7a 65 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20  zeof(zLine) ){. 
d4b0: 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 34 30 29     NotFound(340)
d4c0: 3b 20 20 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20  ;  /* LOG: HOST 
d4d0: 70 61 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f  parameter too lo
d4e0: 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ng */.  }else{. 
d4f0: 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
d500: 2c 20 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74  , "%s/%s", zRoot
d510: 2c 20 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20  , zHttpHost);.  
d520: 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a    for(i=strlen(z
d530: 52 6f 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69  Root)+1; zLine[i
d540: 5d 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27  ] && zLine[i]!='
d550: 3a 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  :'; i++){.      
d560: 69 6e 74 20 63 20 3d 20 7a 4c 69 6e 65 5b 69 5d  int c = zLine[i]
d570: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61  ;.      if( !isa
d580: 6c 6e 75 6d 28 63 29 20 29 7b 0a 20 20 20 20 20  lnum(c) ){.     
d590: 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 27 5f     zLine[i] = '_
d5a0: 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
d5b0: 66 28 20 69 73 75 70 70 65 72 28 63 29 20 29 7b  f( isupper(c) ){
d5c0: 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69  .        zLine[i
d5d0: 5d 20 3d 20 74 6f 6c 6f 77 65 72 28 63 29 3b 0a  ] = tolower(c);.
d5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d5f0: 20 20 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b    strcpy(&zLine[
d600: 69 5d 2c 20 22 2e 77 65 62 73 69 74 65 22 29 3b  i], ".website");
d610: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 28  .  }.  if( stat(
d620: 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20  zLine,&statbuf) 
d630: 7c 7c 20 21 53 5f 49 53 44 49 52 28 73 74 61 74  || !S_ISDIR(stat
d640: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a  buf.st_mode) ){.
d650: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e      sprintf(zLin
d660: 65 2c 20 22 25 73 2f 64 65 66 61 75 6c 74 2e 77  e, "%s/default.w
d670: 65 62 73 69 74 65 22 2c 20 7a 52 6f 6f 74 29 3b  ebsite", zRoot);
d680: 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c  .    if( stat(zL
d690: 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20 7c 7c  ine,&statbuf) ||
d6a0: 20 21 53 5f 49 53 44 49 52 28 73 74 61 74 62 75   !S_ISDIR(statbu
d6b0: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20  f.st_mode) ){.  
d6c0: 20 20 20 20 69 66 28 20 73 74 61 6e 64 61 6c 6f      if( standalo
d6d0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  ne ){.        sp
d6e0: 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
d6f0: 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ", zRoot);.     
d700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d710: 4e 6f 74 46 6f 75 6e 64 28 33 35 30 29 3b 20 20  NotFound(350);  
d720: 2f 2a 20 4c 4f 47 3a 20 2a 2e 77 65 62 73 69 74  /* LOG: *.websit
d730: 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 2a 2f  e permissions */
d740: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d750: 20 7d 0a 20 20 7a 48 6f 6d 65 20 3d 20 53 74 72   }.  zHome = Str
d760: 44 75 70 28 7a 4c 69 6e 65 29 3b 0a 0a 20 20 2f  Dup(zLine);..  /
d770: 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f  * Change directo
d780: 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74  ries to the root
d790: 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c   of the HTTP fil
d7a0: 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69  esystem.  */.  i
d7b0: 66 28 20 63 68 64 69 72 28 7a 48 6f 6d 65 29 21  f( chdir(zHome)!
d7c0: 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  =0 ){.    char z
d7d0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d  Buf[1000];.    M
d7e0: 61 6c 66 75 6e 63 74 69 6f 6e 28 33 36 30 2c 20  alfunction(360, 
d7f0: 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29   /* LOG: chdir()
d800: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
d810: 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69      "cannot chdi
d820: 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b  r to [%s] from [
d830: 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  %s]",.         z
d840: 48 6f 6d 65 2c 20 67 65 74 63 77 64 28 7a 42 75  Home, getcwd(zBu
d850: 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 0a 20 20  f,999));.  }..  
d860: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 66 69  /* Locate the fi
d870: 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  le in the filesy
d880: 73 74 65 6d 2e 20 20 57 65 20 6d 69 67 68 74 20  stem.  We might 
d890: 68 61 76 65 20 74 6f 20 61 70 70 65 6e 64 0a 20  have to append. 
d8a0: 20 2a 2a 20 74 68 65 20 6e 61 6d 65 20 22 69 6e   ** the name "in
d8b0: 64 65 78 2e 68 74 6d 6c 22 20 69 6e 20 6f 72 64  dex.html" in ord
d8c0: 65 72 20 74 6f 20 66 69 6e 64 20 69 74 2e 20 20  er to find it.  
d8d0: 41 6e 79 20 65 78 63 65 73 73 20 70 61 74 68 0a  Any excess path.
d8e0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
d8f0: 20 69 73 20 70 75 74 20 69 6e 74 6f 20 74 68 65   is put into the
d900: 20 7a 50 61 74 68 49 6e 66 6f 20 76 61 72 69 61   zPathInfo varia
d910: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ble..  */.  j = 
d920: 6a 30 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  j0 = (int)strlen
d930: 28 7a 4c 69 6e 65 29 3b 0a 20 20 69 20 3d 20 30  (zLine);.  i = 0
d940: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69  ;.  while( zScri
d950: 70 74 5b 69 5d 20 29 7b 0a 20 20 20 20 77 68 69  pt[i] ){.    whi
d960: 6c 65 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 26  le( zScript[i] &
d970: 26 20 28 69 3d 3d 30 20 7c 7c 20 7a 53 63 72 69  & (i==0 || zScri
d980: 70 74 5b 69 5d 21 3d 27 2f 27 29 20 29 7b 0a 20  pt[i]!='/') ){. 
d990: 20 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20       zLine[j] = 
d9a0: 7a 53 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20  zScript[i];.    
d9b0: 20 20 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 20 20    i++; j++;.    
d9c0: 7d 0a 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d  }.    zLine[j] =
d9d0: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74   0;.    if( stat
d9e0: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
d9f0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
da00: 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20   stillSearching 
da10: 3d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 1;.      while
da20: 28 20 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67  ( stillSearching
da30: 20 26 26 20 69 3e 30 20 26 26 20 6a 3e 6a 30 20   && i>0 && j>j0 
da40: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
da50: 28 20 6a 3e 6a 30 20 26 26 20 7a 4c 69 6e 65 5b  ( j>j0 && zLine[
da60: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
da70: 3b 20 7d 0a 20 20 20 20 20 20 20 20 73 74 72 63  ; }.        strc
da80: 70 79 28 26 7a 4c 69 6e 65 5b 6a 2d 31 5d 2c 20  py(&zLine[j-1], 
da90: 22 2f 6e 6f 74 2d 66 6f 75 6e 64 2e 68 74 6d 6c  "/not-found.html
daa0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
dab0: 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74  stat(zLine,&stat
dac0: 62 75 66 29 3d 3d 30 20 26 26 20 53 5f 49 53 52  buf)==0 && S_ISR
dad0: 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  EG(statbuf.st_mo
dae0: 64 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  de).            
daf0: 26 26 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c  && access(zLine,
db00: 52 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  R_OK)==0 ){.    
db10: 20 20 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70        zRealScrip
db20: 74 20 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e  t = StrDup(&zLin
db30: 65 5b 6a 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  e[j0]);.        
db40: 20 20 52 65 64 69 72 65 63 74 28 7a 52 65 61 6c    Redirect(zReal
db50: 53 63 72 69 70 74 2c 20 31 2c 20 33 37 30 29 3b  Script, 1, 370);
db60: 20 2f 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63   /* LOG: redirec
db70: 74 20 74 6f 20 6e 6f 74 2d 66 6f 75 6e 64 20 2a  t to not-found *
db80: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
db90: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rn;.        }els
dba0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d  e{.          j--
dbb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dbc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
dbd0: 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 29 20 4e  illSearching ) N
dbe0: 6f 74 46 6f 75 6e 64 28 33 38 30 29 3b 20 2f 2a  otFound(380); /*
dbf0: 20 4c 4f 47 3a 20 55 52 49 20 6e 6f 74 20 66 6f   LOG: URI not fo
dc00: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  und */.      bre
dc10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
dc20: 28 20 53 5f 49 53 52 45 47 28 73 74 61 74 62 75  ( S_ISREG(statbu
dc30: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20  f.st_mode) ){.  
dc40: 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 7a      if( access(z
dc50: 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20  Line,R_OK) ){.  
dc60: 20 20 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33        NotFound(3
dc70: 39 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 46 69  90);  /* LOG: Fi
dc80: 6c 65 20 6e 6f 74 20 72 65 61 64 61 62 6c 65 20  le not readable 
dc90: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
dca0: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53   zRealScript = S
dcb0: 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d  trDup(&zLine[j0]
dcc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
dcd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53      }.    if( zS
dce0: 63 72 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a  cript[i]==0 || z
dcf0: 53 63 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29  Script[i+1]==0 )
dd00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20  {.      int k = 
dd10: 6a 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 6a 2d 31  j>0 && zLine[j-1
dd20: 5d 3d 3d 27 2f 27 20 3f 20 6a 2d 31 20 3a 20 6a  ]=='/' ? j-1 : j
dd30: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 26  ;.      strcpy(&
dd40: 7a 4c 69 6e 65 5b 6b 5d 2c 22 2f 69 6e 64 65 78  zLine[k],"/index
dd50: 2e 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 69  .html");.      i
dd60: 66 28 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73  f( stat(zLine,&s
dd70: 74 61 74 62 75 66 29 21 3d 30 20 7c 7c 20 21 53  tatbuf)!=0 || !S
dd80: 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e 73  _ISREG(statbuf.s
dd90: 74 5f 6d 6f 64 65 29 20 0a 20 20 20 20 20 20 7c  t_mode) .      |
dda0: 7c 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52  | access(zLine,R
ddb0: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  _OK) ){.        
ddc0: 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 6b 5d  strcpy(&zLine[k]
ddd0: 2c 22 2f 69 6e 64 65 78 2e 63 67 69 22 29 3b 0a  ,"/index.cgi");.
dde0: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 61 74          if( stat
ddf0: 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29  (zLine,&statbuf)
de00: 21 3d 30 20 7c 7c 20 21 53 5f 49 53 52 45 47 28  !=0 || !S_ISREG(
de10: 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29  statbuf.st_mode)
de20: 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 61 63 63   .        || acc
de30: 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20  ess(zLine,R_OK) 
de40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 74  ){.          Not
de50: 46 6f 75 6e 64 28 34 30 30 29 3b 20 2f 2a 20 4c  Found(400); /* L
de60: 4f 47 3a 20 55 52 49 20 69 73 20 61 20 64 69 72  OG: URI is a dir
de70: 65 63 74 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78  ectory w/o index
de80: 2e 68 74 6d 6c 20 2a 2f 0a 20 20 20 20 20 20 20  .html */.       
de90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
dea0: 20 7a 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53   zRealScript = S
deb0: 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d  trDup(&zLine[j0]
dec0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 53 63  );.      if( zSc
ded0: 72 69 70 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  ript[i]==0 ){.  
dee0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
def0: 72 65 71 75 65 73 74 65 64 20 55 52 4c 20 64 6f  requested URL do
df00: 65 73 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20  es not end with 
df10: 22 2f 22 20 62 75 74 20 77 65 20 68 61 64 20 74  "/" but we had t
df20: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70  o.        ** app
df30: 65 6e 64 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22  end "index.html"
df40: 2c 20 74 68 65 6e 20 61 20 72 65 64 69 72 65 63  , then a redirec
df50: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  t is necessary. 
df60: 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 20   Otherwise.     
df70: 20 20 20 2a 2a 20 6e 6f 6e 65 20 6f 66 20 74 68     ** none of th
df80: 65 20 72 65 6c 61 74 69 76 65 20 55 52 4c 73 20  e relative URLs 
df90: 69 6e 20 74 68 65 20 64 65 6c 69 76 65 72 65 64  in the delivered
dfa0: 20 64 6f 63 75 6d 65 6e 74 20 77 69 6c 6c 20 62   document will b
dfb0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 72  e.        ** cor
dfc0: 72 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rect. */.       
dfd0: 20 52 65 64 69 72 65 63 74 28 7a 52 65 61 6c 53   Redirect(zRealS
dfe0: 63 72 69 70 74 2c 31 2c 34 31 30 29 3b 20 2f 2a  cript,1,410); /*
dff0: 20 4c 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74   LOG: redirect t
e000: 6f 20 61 64 64 20 74 72 61 69 6c 69 6e 67 20 2f  o add trailing /
e010: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
e020: 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rn;.      }.    
e030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e040: 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53     zLine[j] = zS
e050: 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69 2b  cript[i];.    i+
e060: 2b 3b 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46  +; j++;.  }.  zF
e070: 69 6c 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69  ile = StrDup(zLi
e080: 6e 65 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f  ne);.  zPathInfo
e090: 20 3d 20 53 74 72 44 75 70 28 26 7a 53 63 72 69   = StrDup(&zScri
e0a0: 70 74 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c  pt[i]);.  lenFil
e0b0: 65 20 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  e = strlen(zFile
e0c0: 29 3b 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44  );.  zDir = StrD
e0d0: 75 70 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72  up(zFile);.  for
e0e0: 28 69 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d  (i=strlen(zDir)-
e0f0: 31 3b 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69  1; i>0 && zDir[i
e100: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a  ]!='/'; i--){};.
e110: 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
e120: 20 20 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22     strcpy(zDir,"
e130: 2f 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  /");.  }else{.  
e140: 20 20 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a     zDir[i] = 0;.
e150: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
e160: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
e170: 69 73 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  is an authorizat
e180: 69 6f 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ion file.  If th
e190: 65 72 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f  ere is,.  ** pro
e1a0: 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  cess it..  */.  
e1b0: 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22  sprintf(zLine, "
e1c0: 25 73 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29  %s/-auth", zDir)
e1d0: 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a  ;.  if( access(z
e1e0: 4c 69 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26  Line,R_OK)==0 &&
e1f0: 20 21 43 68 65 63 6b 42 61 73 69 63 41 75 74 68   !CheckBasicAuth
e200: 6f 72 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29  orization(zLine)
e210: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
e220: 20 54 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74   Take appropriat
e230: 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  e action.  */.  
e240: 69 66 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f  if( (statbuf.st_
e250: 6d 6f 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31  mode & 0100)==01
e260: 30 30 20 26 26 20 61 63 63 65 73 73 28 7a 46 69  00 && access(zFi
e270: 6c 65 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  le,X_OK)==0 ){. 
e280: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
e290: 20 66 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74   followings stat
e2a0: 69 63 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ic variables are
e2b0: 20 75 73 65 64 20 74 6f 20 73 65 74 75 70 20 74   used to setup t
e2c0: 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20  he environment. 
e2d0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47     ** for the CG
e2e0: 49 20 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a  I script.    */.
e2f0: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
e300: 2a 64 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20  *default_path = 
e310: 22 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b  "/bin:/usr/bin";
e320: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
e330: 20 2a 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66   *gateway_interf
e340: 61 63 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b  ace = "CGI/1.0";
e350: 0a 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75  .    static stru
e360: 63 74 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ct {.      char 
e370: 2a 7a 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20  *zEnvName;.     
e380: 20 63 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c   char **pzEnvVal
e390: 75 65 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76  ue;.    } cgienv
e3a0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
e3b0: 41 55 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20  AUTH_TYPE",     
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
e3d0: 41 75 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20  AuthType },.    
e3e0: 20 20 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e    { "AUTH_CONTEN
e3f0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
e400: 20 20 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a     &zAuthArg },.
e410: 20 20 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54        { "CONTENT
e420: 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20  _LENGTH",       
e430: 20 20 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74         &zContent
e440: 4c 65 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20  Length },.      
e450: 7b 20 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22  { "CONTENT_TYPE"
e460: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e470: 20 26 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d   &zContentType }
e480: 2c 0a 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d  ,.      { "DOCUM
e490: 45 4e 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20  ENT_ROOT",      
e4a0: 20 20 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20           &zHome 
e4b0: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45  },.      { "GATE
e4c0: 57 41 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20  WAY_INTERFACE", 
e4d0: 20 20 20 20 20 20 20 20 20 20 26 67 61 74 65 77            &gatew
e4e0: 61 79 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a  ay_interface },.
e4f0: 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43        { "HTTP_AC
e500: 43 45 50 54 22 2c 20 20 20 20 20 20 20 20 20 20  CEPT",          
e510: 20 20 20 20 20 20 20 26 7a 41 63 63 65 70 74 20         &zAccept 
e520: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50  },.      { "HTTP
e530: 5f 41 43 43 45 50 54 5f 45 4e 43 4f 44 49 4e 47  _ACCEPT_ENCODING
e540: 22 2c 20 20 20 20 20 20 20 20 26 7a 41 63 63 65  ",        &zAcce
e550: 70 74 45 6e 63 6f 64 69 6e 67 20 7d 2c 0a 20 20  ptEncoding },.  
e560: 20 20 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f 4b      { "HTTP_COOK
e570: 49 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  IE",            
e580: 20 20 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d 2c       &zCookie },
e590: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 48  .      { "HTTP_H
e5a0: 4f 53 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  OST",           
e5b0: 20 20 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f          &zHttpHo
e5c0: 73 74 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48  st },.      { "H
e5d0: 54 54 50 5f 49 46 5f 4d 4f 44 49 46 49 45 44 5f  TTP_IF_MODIFIED_
e5e0: 53 49 4e 43 45 22 2c 20 20 20 20 20 20 26 7a 49  SINCE",      &zI
e5f0: 66 4d 6f 64 69 66 69 65 64 53 69 6e 63 65 20 7d  fModifiedSince }
e600: 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f  ,.      { "HTTP_
e610: 49 46 5f 4e 4f 4e 45 5f 4d 41 54 43 48 22 2c 20  IF_NONE_MATCH", 
e620: 20 20 20 20 20 20 20 20 20 26 7a 49 66 4e 6f 6e           &zIfNon
e630: 65 4d 61 74 63 68 20 7d 2c 0a 20 20 20 20 20 20  eMatch },.      
e640: 7b 20 22 48 54 54 50 5f 52 45 46 45 52 45 52 22  { "HTTP_REFERER"
e650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e660: 20 26 7a 52 65 66 65 72 65 72 20 7d 2c 0a 20 20   &zReferer },.  
e670: 20 20 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52      { "HTTP_USER
e680: 5f 41 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20  _AGENT",        
e690: 20 20 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a       &zAgent },.
e6a0: 20 20 20 20 20 20 7b 20 22 50 41 54 48 22 2c 20        { "PATH", 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 20 26 64 65 66 61 75 6c 74 5f         &default_
e6d0: 70 61 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  path },.      { 
e6e0: 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20  "PATH_INFO",    
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e700: 7a 50 61 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20  zPathInfo },.   
e710: 20 20 20 7b 20 22 51 55 45 52 59 5f 53 54 52 49     { "QUERY_STRI
e720: 4e 47 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NG",            
e730: 20 20 20 20 26 7a 51 75 65 72 79 53 74 72 69 6e      &zQueryStrin
e740: 67 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45  g },.      { "RE
e750: 4d 4f 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20  MOTE_ADDR",     
e760: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 52 65              &zRe
e770: 6d 6f 74 65 41 64 64 72 20 7d 2c 0a 20 20 20 20  moteAddr },.    
e780: 20 20 7b 20 22 52 45 51 55 45 53 54 5f 4d 45 54    { "REQUEST_MET
e790: 48 4f 44 22 2c 20 20 20 20 20 20 20 20 20 20 20  HOD",           
e7a0: 20 20 20 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20     &zMethod },. 
e7b0: 20 20 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f       { "REQUEST_
e7c0: 55 52 49 22 2c 20 20 20 20 20 20 20 20 20 20 20  URI",           
e7d0: 20 20 20 20 20 20 26 7a 53 63 72 69 70 74 20 7d        &zScript }
e7e0: 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54  ,.      { "REMOT
e7f0: 45 5f 55 53 45 52 22 2c 20 20 20 20 20 20 20 20  E_USER",        
e800: 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74           &zRemot
e810: 65 55 73 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b  eUser },.      {
e820: 20 22 53 43 52 49 50 54 5f 44 49 52 45 43 54 4f   "SCRIPT_DIRECTO
e830: 52 59 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RY",            
e840: 26 7a 44 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b  &zDir },.      {
e850: 20 22 53 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d   "SCRIPT_FILENAM
e860: 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  E",             
e870: 26 7a 46 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20  &zFile },.      
e880: 7b 20 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c  { "SCRIPT_NAME",
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 26 7a 52 65 61 6c 53 63 72 69 70 74 20 7d 2c   &zRealScript },
e8b0: 0a 20 20 20 20 20 20 7b 20 22 53 45 52 56 45 52  .      { "SERVER
e8c0: 5f 4e 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20  _NAME",         
e8d0: 20 20 20 20 20 20 20 20 26 7a 53 65 72 76 65 72          &zServer
e8e0: 4e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  Name },.      { 
e8f0: 22 53 45 52 56 45 52 5f 50 4f 52 54 22 2c 20 20  "SERVER_PORT",  
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e910: 7a 53 65 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20  zServerPort },. 
e920: 20 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50       { "SERVER_P
e930: 52 4f 54 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20  ROTOCOL",       
e940: 20 20 20 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c        &zProtocol
e950: 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63   },.    };.    c
e960: 68 61 72 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61  har *zBaseFilena
e970: 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  me;         /* F
e980: 69 6c 65 6e 61 6d 65 20 77 69 74 68 6f 75 74 20  ilename without 
e990: 64 69 72 65 63 74 6f 72 79 20 70 72 65 66 69 78  directory prefix
e9a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
e9b0: 43 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20  ContentLength = 
e9c0: 30 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  0;   /* True if 
e9d0: 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20  Content-length: 
e9e0: 68 65 61 64 65 72 20 73 65 65 6e 20 2a 2f 0a 20  header seen */. 
e9f0: 20 20 20 69 6e 74 20 63 6f 6e 74 65 6e 74 4c 65     int contentLe
ea00: 6e 67 74 68 20 3d 20 30 3b 20 20 20 20 20 20 20  ngth = 0;       
ea10: 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6c  /* The content l
ea20: 65 6e 67 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74  ength */.    int
ea30: 20 6e 52 65 73 20 3d 20 30 3b 20 20 20 20 20 20   nRes = 0;      
ea40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
ea50: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 2a 2f  es of payload */
ea60: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 6c 6c 6f 63  .    int nMalloc
ea70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ea80: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
ea90: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
eaa0: 20 61 52 65 73 20 2a 2f 0a 20 20 20 20 63 68 61   aRes */.    cha
eab0: 72 20 2a 61 52 65 73 20 3d 20 30 3b 20 20 20 20  r *aRes = 0;    
eac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79            /* Pay
ead0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  load */..    /* 
eae0: 49 66 20 69 74 73 20 65 78 65 63 75 74 61 62 6c  If its executabl
eaf0: 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 61 20  e, it must be a 
eb00: 43 47 49 20 70 72 6f 67 72 61 6d 2e 20 20 53 74  CGI program.  St
eb10: 61 72 74 20 62 79 0a 20 20 20 20 2a 2a 20 63 68  art by.    ** ch
eb20: 61 6e 67 69 6e 67 20 64 69 72 65 63 74 6f 72 69  anging directori
eb30: 65 73 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  es to the direct
eb40: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ory holding the 
eb50: 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a  program..    */.
eb60: 20 20 20 20 69 66 28 20 63 68 64 69 72 28 7a 44      if( chdir(zD
eb70: 69 72 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ir) ){.      cha
eb80: 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20  r zBuf[1000];.  
eb90: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
eba0: 34 32 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 64  420, /* LOG: chd
ebb0: 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20  ir() failed */. 
ebc0: 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
ebd0: 74 20 63 68 64 69 72 20 74 6f 20 5b 25 73 5d 20  t chdir to [%s] 
ebe0: 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 0a 20 20 20  from [%s]", .   
ebf0: 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 67 65          zDir, ge
ec00: 74 63 77 64 28 7a 42 75 66 2c 39 39 39 29 29 3b  tcwd(zBuf,999));
ec10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
ec20: 65 74 75 70 20 74 68 65 20 65 6e 76 69 72 6f 6e  etup the environ
ec30: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
ec40: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ly..    */.    f
ec50: 6f 72 28 69 3d 30 3b 20 69 3c 28 69 6e 74 29 28  or(i=0; i<(int)(
ec60: 73 69 7a 65 6f 66 28 63 67 69 65 6e 76 29 2f 73  sizeof(cgienv)/s
ec70: 69 7a 65 6f 66 28 63 67 69 65 6e 76 5b 30 5d 29  izeof(cgienv[0])
ec80: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
ec90: 66 28 20 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a  f( *cgienv[i].pz
eca0: 45 6e 76 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  EnvValue ){.    
ecb0: 20 20 20 20 53 65 74 45 6e 76 28 63 67 69 65 6e      SetEnv(cgien
ecc0: 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d 65 2c 2a 63  v[i].zEnvName,*c
ecd0: 67 69 65 6e 76 5b 69 5d 2e 70 7a 45 6e 76 56 61  gienv[i].pzEnvVa
ece0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lue);.      }.  
ecf0: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 48    }.    if( useH
ed00: 74 74 70 73 20 29 7b 0a 20 20 20 20 20 20 70 75  ttps ){.      pu
ed10: 74 65 6e 76 28 22 48 54 54 50 53 3d 6f 6e 22 29  tenv("HTTPS=on")
ed20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
ed30: 20 20 20 20 2a 2a 20 41 62 6f 72 74 20 77 69 74      ** Abort wit
ed40: 68 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  h an error if th
ed50: 65 20 43 47 49 20 73 63 72 69 70 74 20 69 73 20  e CGI script is 
ed60: 77 72 69 74 61 62 6c 65 20 62 79 20 61 6e 79 6f  writable by anyo
ed70: 6e 65 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ne other.    ** 
ed80: 74 68 61 6e 20 69 74 73 20 6f 77 6e 65 72 2e 0a  than its owner..
ed90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
eda0: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26  tatbuf.st_mode &
edb0: 20 30 30 32 32 20 29 7b 0a 20 20 20 20 20 20 43   0022 ){.      C
edc0: 67 69 53 63 72 69 70 74 57 72 69 74 61 62 6c 65  giScriptWritable
edd0: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ();.    }..    /
ede0: 2a 20 46 6f 72 20 74 68 65 20 50 4f 53 54 20 6d  * For the POST m
edf0: 65 74 68 6f 64 20 61 6c 6c 20 69 6e 70 75 74 20  ethod all input 
ee00: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
ee10: 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20   to a temporary 
ee20: 66 69 6c 65 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  file,.    ** so 
ee30: 77 65 20 68 61 76 65 20 74 6f 20 72 65 64 69 72  we have to redir
ee40: 65 63 74 20 69 6e 70 75 74 20 74 6f 20 74 68 65  ect input to the
ee50: 20 43 47 49 20 73 63 72 69 70 74 20 66 72 6f 6d   CGI script from
ee60: 20 74 68 61 74 20 66 69 6c 65 2e 0a 20 20 20 20   that file..    
ee70: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 4d 65 74 68  */.    if( zMeth
ee80: 6f 64 5b 30 5d 3d 3d 27 50 27 20 29 7b 0a 20 20  od[0]=='P' ){.  
ee90: 20 20 20 20 69 66 28 20 64 75 70 28 30 29 3c 30      if( dup(0)<0
eea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
eeb0: 75 6e 63 74 69 6f 6e 28 34 33 30 2c 20 20 2f 2a  unction(430,  /*
eec0: 20 4c 4f 47 3a 20 64 75 70 28 30 29 20 66 61 69   LOG: dup(0) fai
eed0: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
eee0: 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 61 62             "Unab
eef0: 6c 65 20 74 6f 20 64 75 70 6c 69 63 61 74 69 6f  le to duplicatio
ef00: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
ef10: 72 20 30 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r 0");.      }. 
ef20: 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b 0a 20       close(0);. 
ef30: 20 20 20 20 20 6f 70 65 6e 28 7a 54 6d 70 4e 61       open(zTmpNa
ef40: 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20  m, O_RDONLY);.  
ef50: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 73    }..    for(i=s
ef60: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2d 31 3b 20  trlen(zFile)-1; 
ef70: 69 3e 3d 30 20 26 26 20 7a 46 69 6c 65 5b 69 5d  i>=0 && zFile[i]
ef80: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
ef90: 20 20 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 20    zBaseFilename 
efa0: 3d 20 26 7a 46 69 6c 65 5b 69 2b 31 5d 3b 0a 20  = &zFile[i+1];. 
efb0: 20 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 73     if( i>=0 && s
efc0: 74 72 6e 63 6d 70 28 7a 42 61 73 65 46 69 6c 65  trncmp(zBaseFile
efd0: 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c 34 29 3d 3d  name,"nph-",4)==
efe0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
eff0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f000: 20 43 47 49 20 73 63 72 69 70 74 20 62 65 67 69   CGI script begi
f010: 6e 73 20 77 69 74 68 20 22 6e 70 68 2d 22 20 74  ns with "nph-" t
f020: 68 65 6e 20 77 65 20 61 72 65 0a 20 20 20 20 20  hen we are.     
f030: 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
f040: 20 61 20 22 6e 6f 6e 2d 70 61 72 73 65 64 20 68   a "non-parsed h
f050: 65 61 64 65 72 73 22 20 43 47 49 20 73 63 72 69  eaders" CGI scri
f060: 70 74 2e 20 20 4a 75 73 74 20 65 78 65 63 28 29  pt.  Just exec()
f070: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 64 69 72  .      ** it dir
f080: 65 63 74 6c 79 20 61 6e 64 20 6c 65 74 20 69 74  ectly and let it
f090: 20 68 61 6e 64 6c 65 20 61 6c 6c 20 69 74 73 20   handle all its 
f0a0: 6f 77 6e 20 68 65 61 64 65 72 20 67 65 6e 65 72  own header gener
f0b0: 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
f0c0: 20 20 20 20 20 20 65 78 65 63 6c 28 7a 42 61 73        execl(zBas
f0d0: 65 46 69 6c 65 6e 61 6d 65 2c 7a 42 61 73 65 46  eFilename,zBaseF
f0e0: 69 6c 65 6e 61 6d 65 2c 28 63 68 61 72 2a 29 30  ilename,(char*)0
f0f0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45  );.      /* NOTE
f100: 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74 72 79 20 77  : No log entry w
f110: 72 69 74 74 65 6e 20 66 6f 72 20 6e 70 68 2d 20  ritten for nph- 
f120: 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 20 20 20  scripts */.     
f130: 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 0a   exit(0);.    }.
f140: 0a 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  .    /* Fall thr
f150: 75 20 74 6f 20 68 65 72 65 20 6f 6e 6c 79 20 69  u to here only i
f160: 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 28  f this process (
f170: 74 68 65 20 73 65 72 76 65 72 29 20 69 73 20 67  the server) is g
f180: 6f 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 72  oing.    ** to r
f190: 65 61 64 20 61 6e 64 20 61 75 67 6d 65 6e 74 20  ead and augment 
f1a0: 74 68 65 20 68 65 61 64 65 72 20 73 65 6e 74 20  the header sent 
f1b0: 62 61 63 6b 20 62 79 20 74 68 65 20 43 47 49 20  back by the CGI 
f1c0: 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2a 2a 20  process..    ** 
f1d0: 4f 70 65 6e 20 61 20 70 69 70 65 20 74 6f 20 72  Open a pipe to r
f1e0: 65 63 65 69 76 65 20 74 68 65 20 6f 75 74 70 75  eceive the outpu
f1f0: 74 20 66 72 6f 6d 20 74 68 65 20 43 47 49 20 70  t from the CGI p
f200: 72 6f 63 65 73 73 2e 20 20 54 68 65 6e 0a 20 20  rocess.  Then.  
f210: 20 20 2a 2a 20 66 6f 72 6b 20 74 68 65 20 43 47    ** fork the CG
f220: 49 20 70 72 6f 63 65 73 73 2e 20 20 4f 6e 63 65  I process.  Once
f230: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 64   everything is d
f240: 6f 6e 65 2c 20 77 65 20 73 68 6f 75 6c 64 20 62  one, we should b
f250: 65 0a 20 20 20 20 2a 2a 20 61 62 6c 65 20 74 6f  e.    ** able to
f260: 20 72 65 61 64 20 74 68 65 20 6f 75 74 70 75 74   read the output
f270: 20 6f 66 20 43 47 49 20 6f 6e 20 74 68 65 20 22   of CGI on the "
f280: 69 6e 22 20 73 74 72 65 61 6d 2e 0a 20 20 20 20  in" stream..    
f290: 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  */.    {.      i
f2a0: 6e 74 20 70 78 5b 32 5d 3b 0a 20 20 20 20 20 20  nt px[2];.      
f2b0: 69 66 28 20 70 69 70 65 28 70 78 29 20 29 7b 0a  if( pipe(px) ){.
f2c0: 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
f2d0: 69 6f 6e 28 34 34 30 2c 20 2f 2a 20 4c 4f 47 3a  ion(440, /* LOG:
f2e0: 20 70 69 70 65 28 29 20 66 61 69 6c 65 64 20 2a   pipe() failed *
f2f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
f300: 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
f310: 20 63 72 65 61 74 65 20 61 20 70 69 70 65 20 66   create a pipe f
f320: 6f 72 20 74 68 65 20 43 47 49 20 70 72 6f 67 72  or the CGI progr
f330: 61 6d 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  am");.      }.  
f340: 20 20 20 20 69 66 28 20 66 6f 72 6b 28 29 3d 3d      if( fork()==
f350: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
f360: 73 65 28 70 78 5b 30 5d 29 3b 0a 20 20 20 20 20  se(px[0]);.     
f370: 20 20 20 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20     close(1);.   
f380: 20 20 20 20 20 69 66 28 20 64 75 70 28 70 78 5b       if( dup(px[
f390: 31 5d 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  1])!=1 ){.      
f3a0: 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28      Malfunction(
f3b0: 34 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20 64 75 70  450, /* LOG: dup
f3c0: 28 31 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  (1) failed */.  
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f3e0: 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69 63  Unable to duplic
f3f0: 61 74 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ate file descrip
f400: 74 6f 72 20 25 64 20 74 6f 20 31 22 2c 0a 20 20  tor %d to 1",.  
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f420: 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  x[1]);.        }
f430: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70  .        close(p
f440: 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  x[1]);.        f
f450: 6f 72 28 69 3d 33 3b 20 63 6c 6f 73 65 28 69 29  or(i=3; close(i)
f460: 3d 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  ==0; i++){}.    
f470: 20 20 20 20 65 78 65 63 6c 28 7a 42 61 73 65 46      execl(zBaseF
f480: 69 6c 65 6e 61 6d 65 2c 20 7a 42 61 73 65 46 69  ilename, zBaseFi
f490: 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  lename, (char*)0
f4a0: 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
f4b0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f4c0: 20 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b 0a    close(px[1]);.
f4d0: 20 20 20 20 20 20 69 6e 20 3d 20 66 64 6f 70 65        in = fdope
f4e0: 6e 28 70 78 5b 30 5d 2c 20 22 72 62 22 29 3b 0a  n(px[0], "rb");.
f4f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 6e      }.    if( in
f500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 43 67 69  ==0 ){.      Cgi
f510: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 0a  Error();.    }..
f520: 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
f530: 70 72 6f 63 65 73 73 20 74 68 65 20 66 69 72 73  process the firs
f540: 74 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 68 65  t line of the he
f550: 61 64 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  ader returned by
f560: 20 74 68 65 0a 20 20 20 20 2a 2a 20 43 47 49 20   the.    ** CGI 
f570: 73 63 72 69 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  script..    */. 
f580: 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75     if( useTimeou
f590: 74 20 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a 20  t ) alarm(15);. 
f5a0: 20 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28     while( fgets(
f5b0: 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69  zLine,sizeof(zLi
f5c0: 6e 65 29 2c 69 6e 29 20 26 26 20 21 69 73 73 70  ne),in) && !issp
f5d0: 61 63 65 28 7a 4c 69 6e 65 5b 30 5d 29 20 29 7b  ace(zLine[0]) ){
f5e0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
f5f0: 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f  asecmp(zLine,"Lo
f600: 63 61 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29  cation:",9)==0 )
f610: 7b 0a 20 20 20 20 20 20 20 20 53 74 61 72 74 52  {.        StartR
f620: 65 73 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64  esponse("302 Red
f630: 69 72 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20  irect");.       
f640: 20 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a   RemoveNewline(z
f650: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Line);.        z
f660: 20 3d 20 26 7a 4c 69 6e 65 5b 31 30 5d 3b 0a 20   = &zLine[10];. 
f670: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73         while( is
f680: 73 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b  space(*z) ){ z++
f690: 3b 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75 74  ; }.        nOut
f6a0: 20 2b 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61   += printf("Loca
f6b0: 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 22 2c 7a 29  tion: %s\r\n",z)
f6c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f6d0: 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c  ( strncasecmp(zL
f6e0: 69 6e 65 2c 22 53 74 61 74 75 73 3a 22 2c 37 29  ine,"Status:",7)
f6f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
f700: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
f710: 72 28 69 3d 37 3b 20 69 73 73 70 61 63 65 28 7a  r(i=7; isspace(z
f720: 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  Line[i]); i++){}
f730: 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d  .        nOut +=
f740: 20 70 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c   printf("%s %s",
f750: 20 7a 50 72 6f 74 6f 63 6f 6c 2c 20 26 7a 4c 69   zProtocol, &zLi
f760: 6e 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ne[i]);.        
f770: 73 74 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74  strncpy(zReplySt
f780: 61 74 75 73 2c 20 26 7a 4c 69 6e 65 5b 69 5d 2c  atus, &zLine[i],
f790: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65   3);.        zRe
f7a0: 70 6c 79 53 74 61 74 75 73 5b 33 5d 20 3d 20 30  plyStatus[3] = 0
f7b0: 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 75 73  ;.        status
f7c0: 53 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sent = 1;.      
f7d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 2f 2a 20 20 31 32 33 34 35 36 37 38 39     /*  123456789
f800: 20 31 32 33 34 35 20 2a 2f 0a 20 20 20 20 20 20   12345 */.      
f810: 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d    if( strncasecm
f820: 70 28 7a 4c 69 6e 65 2c 20 22 43 6f 6e 74 65 6e  p(zLine, "Conten
f830: 74 2d 6c 65 6e 67 74 68 3a 22 2c 20 31 35 29 3d  t-length:", 15)=
f840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f850: 73 65 65 6e 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  seenContentLengt
f860: 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  h = 1;.         
f870: 20 63 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d   contentLength =
f880: 20 61 74 6f 69 28 7a 4c 69 6e 65 2b 31 35 29 3b   atoi(zLine+15);
f890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f8a0: 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73 65     StartResponse
f8b0: 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20 20  ("200 OK");.    
f8c0: 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e      nOut += prin
f8d0: 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b 0a  tf("%s",zLine);.
f8e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f8f0: 20 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72 79     /* Copy every
f900: 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75 20  thing else thru 
f910: 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20 6f  without change o
f920: 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 20 20  r analysis..    
f930: 2a 2f 0a 20 20 20 20 53 74 61 72 74 52 65 73 70  */.    StartResp
f940: 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a  onse("200 OK");.
f950: 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f      if( useTimeo
f960: 75 74 20 29 20 61 6c 61 72 6d 28 36 30 2a 35 29  ut ) alarm(60*5)
f970: 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6e 43 6f  ;.    if( seenCo
f980: 6e 74 65 6e 74 4c 65 6e 67 74 68 20 29 7b 0a 20  ntentLength ){. 
f990: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
f9a0: 6e 74 66 28 22 25 73 22 2c 20 7a 4c 69 6e 65 29  ntf("%s", zLine)
f9b0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
f9c0: 63 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 2d 2d 29  contentLength--)
f9d0: 3e 30 20 26 26 20 28 63 20 3d 20 67 65 74 63 28  >0 && (c = getc(
f9e0: 69 6e 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20  in))!=EOF ){.   
f9f0: 20 20 20 20 20 70 75 74 63 28 63 2c 73 74 64 6f       putc(c,stdo
fa00: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75  ut);.        nOu
fa10: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
fa20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
fa30: 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4d  es = 0;.      nM
fa40: 61 6c 6c 6f 63 20 3d 20 31 30 30 30 3b 0a 20 20  alloc = 1000;.  
fa50: 20 20 20 20 61 52 65 73 20 3d 20 6d 61 6c 6c 6f      aRes = mallo
fa60: 63 28 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20  c(nMalloc+1);.  
fa70: 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20      if( aRes==0 
fa80: 29 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 36 30  ) Malfunction(60
fa90: 30 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  0,"Out of memory
faa0: 3a 20 25 64 20 62 79 74 65 73 22 2c 20 6e 4d 61  : %d bytes", nMa
fab0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 77 68 69  lloc);.      whi
fac0: 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e  le( (c = getc(in
fad0: 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20  ))!=EOF ){.     
fae0: 20 20 20 69 66 28 20 6e 52 65 73 3e 3d 6e 4d 61     if( nRes>=nMa
faf0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
fb00: 20 20 6e 4d 61 6c 6c 6f 63 20 3d 20 6e 4d 61 6c    nMalloc = nMal
fb10: 6c 6f 63 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  loc*2;.         
fb20: 20 61 52 65 73 20 3d 20 72 65 61 6c 6c 6f 63 28   aRes = realloc(
fb30: 61 52 65 73 2c 20 6e 4d 61 6c 6c 6f 63 2b 31 29  aRes, nMalloc+1)
fb40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
fb50: 61 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aRes==0 ){.     
fb60: 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
fb70: 69 6f 6e 28 36 31 30 2c 20 22 4f 75 74 20 6f 66  ion(610, "Out of
fb80: 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62 79 74 65   memory: %d byte
fb90: 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b 0a 20 20  s", nMalloc);.  
fba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fbb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 52 65 73    }.        aRes
fbc0: 5b 6e 52 65 73 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [nRes++] = c;.  
fbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 52 65 73      }.      aRes
fbe0: 5b 6e 52 65 73 5d 20 3d 20 30 3b 0a 20 20 20 20  [nRes] = 0;.    
fbf0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
fc00: 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68  ("Content-length
fc10: 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 25 73 22 2c  : %d\r\n\r\n%s",
fc20: 20 6e 52 65 73 2c 20 61 52 65 73 29 3b 0a 20 20   nRes, aRes);.  
fc30: 20 20 20 20 66 72 65 65 28 61 52 65 73 29 3b 0a      free(aRes);.
fc40: 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
fc50: 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  (in);.  }else if
fc60: 28 20 63 6f 75 6e 74 53 6c 61 73 68 65 73 28 7a  ( countSlashes(z
fc70: 52 65 61 6c 53 63 72 69 70 74 29 21 3d 63 6f 75  RealScript)!=cou
fc80: 6e 74 53 6c 61 73 68 65 73 28 7a 53 63 72 69 70  ntSlashes(zScrip
fc90: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  t) ){.    /* If 
fca0: 74 68 65 20 72 65 71 75 65 73 74 20 55 52 49 20  the request URI 
fcb0: 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65  for static conte
fcc0: 6e 74 20 63 6f 6e 74 61 69 6e 73 20 6d 61 74 65  nt contains mate
fcd0: 72 69 61 6c 20 70 61 73 74 20 74 68 65 0a 20 20  rial past the.  
fce0: 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74    ** actual cont
fcf0: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 2c 20 72  ent file name, r
fd00: 65 70 6f 72 74 20 74 68 61 74 20 61 73 20 61 20  eport that as a 
fd10: 34 30 34 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20  404 error. */.  
fd20: 20 20 4e 6f 74 46 6f 75 6e 64 28 34 36 30 29 3b    NotFound(460);
fd30: 20 2f 2a 20 4c 4f 47 3a 20 45 78 63 65 73 73 20   /* LOG: Excess 
fd40: 55 52 49 20 63 6f 6e 74 65 6e 74 20 70 61 73 74  URI content past
fd50: 20 73 74 61 74 69 63 20 66 69 6c 65 20 6e 61 6d   static file nam
fd60: 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e */.  }else{.  
fd70: 20 20 2f 2a 20 49 66 20 69 74 20 69 73 6e 27 74    /* If it isn't
fd80: 20 65 78 65 63 75 74 61 62 6c 65 20 74 68 65 6e   executable then
fd90: 20 69 74 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20   it.    ** must 
fda0: 61 20 73 69 6d 70 6c 65 20 66 69 6c 65 20 74 68  a simple file th
fdb0: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63  at needs to be c
fdc0: 6f 70 69 65 64 20 74 6f 20 6f 75 74 70 75 74 2e  opied to output.
fdd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  .    */.    cons
fde0: 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74  t char *zContent
fdf0: 54 79 70 65 20 3d 20 47 65 74 4d 69 6d 65 54 79  Type = GetMimeTy
fe00: 70 65 28 7a 46 69 6c 65 2c 20 6c 65 6e 46 69 6c  pe(zFile, lenFil
fe10: 65 29 3b 0a 20 20 20 20 74 69 6d 65 5f 74 20 74  e);.    time_t t
fe20: 3b 0a 20 20 20 20 63 68 61 72 20 7a 45 54 61 67  ;.    char zETag
fe30: 5b 31 30 30 5d 3b 0a 0a 20 20 20 20 69 66 28 20  [100];..    if( 
fe40: 7a 54 6d 70 4e 61 6d 20 29 20 75 6e 6c 69 6e 6b  zTmpNam ) unlink
fe50: 28 7a 54 6d 70 4e 61 6d 29 3b 0a 20 20 20 20 73  (zTmpNam);.    s
fe60: 70 72 69 6e 74 66 28 7a 45 54 61 67 2c 20 22 6d  printf(zETag, "m
fe70: 25 78 73 25 78 22 2c 20 28 69 6e 74 29 73 74 61  %xs%x", (int)sta
fe80: 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65 2c 20 28  tbuf.st_mtime, (
fe90: 69 6e 74 29 73 74 61 74 62 75 66 2e 73 74 5f 73  int)statbuf.st_s
fea0: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 43 6f  ize);.    if( Co
feb0: 6d 70 61 72 65 45 74 61 67 73 28 7a 49 66 4e 6f  mpareEtags(zIfNo
fec0: 6e 65 4d 61 74 63 68 2c 7a 45 54 61 67 29 3d 3d  neMatch,zETag)==
fed0: 30 0a 20 20 20 20 20 7c 7c 20 28 7a 49 66 4d 6f  0.     || (zIfMo
fee0: 64 69 66 69 65 64 53 69 6e 63 65 21 3d 30 0a 20  difiedSince!=0. 
fef0: 20 20 20 20 20 20 20 20 20 26 26 20 28 74 20 3d           && (t =
ff00: 20 50 61 72 73 65 52 66 63 38 32 32 44 61 74 65   ParseRfc822Date
ff10: 28 7a 49 66 4d 6f 64 69 66 69 65 64 53 69 6e 63  (zIfModifiedSinc
ff20: 65 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 20  e))>0.          
ff30: 26 26 20 74 3e 3d 73 74 61 74 62 75 66 2e 73 74  && t>=statbuf.st
ff40: 5f 6d 74 69 6d 65 29 0a 20 20 20 20 29 7b 0a 20  _mtime).    ){. 
ff50: 20 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e       StartRespon
ff60: 73 65 28 22 33 30 34 20 4e 6f 74 20 4d 6f 64 69  se("304 Not Modi
ff70: 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 6e 4f  fied");.      nO
ff80: 75 74 20 2b 3d 20 44 61 74 65 54 61 67 28 22 4c  ut += DateTag("L
ff90: 61 73 74 2d 4d 6f 64 69 66 69 65 64 22 2c 20 73  ast-Modified", s
ffa0: 74 61 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65 29  tatbuf.st_mtime)
ffb0: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
ffc0: 70 72 69 6e 74 66 28 22 43 61 63 68 65 2d 43 6f  printf("Cache-Co
ffd0: 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d 25  ntrol: max-age=%
ffe0: 64 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29 3b 0a  d\r\n", mxAge);.
fff0: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
10000 69 6e 74 66 28 22 45 54 61 67 3a 20 5c 22 25 73  intf("ETag: \"%s
10010 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b  \"\r\n", zETag);
10020 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70  .      nOut += p
10030 72 69 6e 74 66 28 22 5c 72 5c 6e 22 29 3b 0a 20  rintf("\r\n");. 
10040 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f       fflush(stdo
10050 75 74 29 3b 0a 20 20 20 20 20 20 4d 61 6b 65 4c  ut);.      MakeL
10060 6f 67 45 6e 74 72 79 28 30 2c 20 34 37 30 29 3b  ogEntry(0, 470);
10070 20 20 2f 2a 20 4c 4f 47 3a 20 45 54 61 67 20 43    /* LOG: ETag C
10080 61 63 68 65 20 48 69 74 20 2a 2f 0a 20 20 20 20  ache Hit */.    
10090 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
100a0 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a      in = fopen(z
100b0 46 69 6c 65 2c 22 72 62 22 29 3b 0a 20 20 20 20  File,"rb");.    
100c0 69 66 28 20 69 6e 3d 3d 30 20 29 20 4e 6f 74 46  if( in==0 ) NotF
100d0 6f 75 6e 64 28 34 38 30 29 3b 20 2f 2a 20 4c 4f  ound(480); /* LO
100e0 47 3a 20 66 6f 70 65 6e 28 29 20 66 61 69 6c 65  G: fopen() faile
100f0 64 20 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e  d for static con
10100 74 65 6e 74 20 2a 2f 0a 20 20 20 20 53 74 61 72  tent */.    Star
10110 74 52 65 73 70 6f 6e 73 65 28 22 32 30 30 20 4f  tResponse("200 O
10120 4b 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d  K");.    nOut +=
10130 20 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d   DateTag("Last-M
10140 6f 64 69 66 69 65 64 22 2c 20 73 74 61 74 62 75  odified", statbu
10150 66 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20  f.st_mtime);.   
10160 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
10170 22 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20  "Cache-Control: 
10180 6d 61 78 2d 61 67 65 3d 25 64 5c 72 5c 6e 22 2c  max-age=%d\r\n",
10190 20 6d 78 41 67 65 29 3b 0a 20 20 20 20 6e 4f 75   mxAge);.    nOu
101a0 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 45 54 61  t += printf("ETa
101b0 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e 22 2c 20  g: \"%s\"\r\n", 
101c0 7a 45 54 61 67 29 3b 0a 20 20 20 20 6e 4f 75 74  zETag);.    nOut
101d0 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74   += printf("Cont
101e0 65 6e 74 2d 74 79 70 65 3a 20 25 73 5c 72 5c 6e  ent-type: %s\r\n
101f0 22 2c 7a 43 6f 6e 74 65 6e 74 54 79 70 65 29 3b  ",zContentType);
10200 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
10210 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e  ntf("Content-len
10220 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 22  gth: %d\r\n\r\n"
10230 2c 28 69 6e 74 29 73 74 61 74 62 75 66 2e 73 74  ,(int)statbuf.st
10240 5f 73 69 7a 65 29 3b 0a 20 20 20 20 66 66 6c 75  _size);.    fflu
10250 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
10260 69 66 28 20 73 74 72 63 6d 70 28 7a 4d 65 74 68  if( strcmp(zMeth
10270 6f 64 2c 22 48 45 41 44 22 29 3d 3d 30 20 29 7b  od,"HEAD")==0 ){
10280 0a 20 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e  .      MakeLogEn
10290 74 72 79 28 30 2c 20 32 29 3b 20 2f 2a 20 4c 4f  try(0, 2); /* LO
102a0 47 3a 20 4e 6f 72 6d 61 6c 20 48 45 41 44 20 72  G: Normal HEAD r
102b0 65 70 6c 79 20 2a 2f 0a 20 20 20 20 20 20 66 63  eply */.      fc
102c0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20  lose(in);.      
102d0 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
102e0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
102f0 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 54    }.    if( useT
10300 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33  imeout ) alarm(3
10310 30 20 2b 20 73 74 61 74 62 75 66 2e 73 74 5f 73  0 + statbuf.st_s
10320 69 7a 65 2f 31 30 30 30 29 3b 0a 23 69 66 64 65  ize/1000);.#ifde
10330 66 20 6c 69 6e 75 78 0a 20 20 20 20 7b 0a 20 20  f linux.    {.  
10340 20 20 20 20 6f 66 66 5f 74 20 6f 66 66 73 65 74      off_t offset
10350 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74   = 0;.      nOut
10360 20 2b 3d 20 73 65 6e 64 66 69 6c 65 28 66 69 6c   += sendfile(fil
10370 65 6e 6f 28 73 74 64 6f 75 74 29 2c 20 66 69 6c  eno(stdout), fil
10380 65 6e 6f 28 69 6e 29 2c 20 26 6f 66 66 73 65 74  eno(in), &offset
10390 2c 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  , statbuf.st_siz
103a0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  e);.    }.#else.
103b0 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
103c0 67 65 74 63 28 69 6e 29 29 21 3d 45 4f 46 20 29  getc(in))!=EOF )
103d0 7b 0a 20 20 20 20 20 20 70 75 74 63 28 63 2c 73  {.      putc(c,s
103e0 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 6e 4f  tdout);.      nO
103f0 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ut++;.    }.#end
10400 69 66 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  if.    fclose(in
10410 29 3b 0a 20 20 7d 0a 20 20 66 66 6c 75 73 68 28  );.  }.  fflush(
10420 73 74 64 6f 75 74 29 3b 0a 20 20 4d 61 6b 65 4c  stdout);.  MakeL
10430 6f 67 45 6e 74 72 79 28 30 2c 20 30 29 3b 20 20  ogEntry(0, 0);  
10440 2f 2a 20 4c 4f 47 3a 20 4e 6f 72 6d 61 6c 20 72  /* LOG: Normal r
10450 65 70 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  eply */..  /* Th
10460 65 20 6e 65 78 74 20 72 65 71 75 65 73 74 20 6d  e next request m
10470 75 73 74 20 61 72 72 69 76 65 20 77 69 74 68 69  ust arrive withi
10480 6e 20 33 30 20 73 65 63 6f 6e 64 73 20 6f 72 20  n 30 seconds or 
10490 77 65 20 63 6c 6f 73 65 20 74 68 65 20 63 6f 6e  we close the con
104a0 6e 65 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6f  nection.  */.  o
104b0 6d 69 74 4c 6f 67 20 3d 20 31 3b 0a 20 20 69 66  mitLog = 1;.  if
104c0 28 20 75 73 65 54 69 6d 65 6f 75 74 20 29 20 61  ( useTimeout ) a
104d0 6c 61 72 6d 28 33 30 29 3b 0a 7d 0a 0a 23 64 65  larm(30);.}..#de
104e0 66 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45  fine MAX_PARALLE
104f0 4c 20 35 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20  L 50  /* Number 
10500 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
10510 63 68 69 6c 64 72 65 6e 20 2a 2f 0a 0a 2f 2a 0a  children */../*.
10520 2a 2a 20 41 6c 6c 20 70 6f 73 73 69 62 6c 65 20  ** All possible 
10530 66 6f 72 6d 73 20 6f 66 20 61 6e 20 49 50 20 61  forms of an IP a
10540 64 64 72 65 73 73 2e 20 20 4e 65 65 64 65 64 20  ddress.  Needed 
10550 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 47  to work around G
10560 43 43 20 73 74 72 69 63 74 0a 2a 2a 20 61 6c 69  CC strict.** ali
10570 61 73 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  asing rules..*/.
10580 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 0a  typedef union {.
10590 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64    struct sockadd
105a0 72 20 73 61 3b 20 20 20 20 20 20 20 20 20 20 20  r sa;           
105b0 20 20 20 2f 2a 20 41 62 73 74 72 61 63 74 20 73     /* Abstract s
105c0 75 70 65 72 63 6c 61 73 73 20 2a 2f 0a 20 20 73  uperclass */.  s
105d0 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69  truct sockaddr_i
105e0 6e 20 73 61 34 3b 20 20 20 20 20 20 20 20 20 20  n sa4;          
105f0 2f 2a 20 49 50 76 34 20 2a 2f 0a 20 20 73 74 72  /* IPv4 */.  str
10600 75 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 36  uct sockaddr_in6
10610 20 73 61 36 3b 20 20 20 20 20 20 20 20 20 2f 2a   sa6;         /*
10620 20 49 50 76 36 20 2a 2f 0a 20 20 73 74 72 75 63   IPv6 */.  struc
10630 74 20 73 6f 63 6b 61 64 64 72 5f 73 74 6f 72 61  t sockaddr_stora
10640 67 65 20 73 61 73 3b 20 20 20 20 20 2f 2a 20 53  ge sas;     /* S
10650 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6d 61 78  hould be the max
10660 69 6d 75 6d 20 6f 66 20 74 68 65 20 61 62 6f 76  imum of the abov
10670 65 20 33 20 2a 2f 0a 7d 20 61 64 64 72 65 73 73  e 3 */.} address
10680 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
10690 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 76 65  nt an HTTP serve
106a0 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65 6e 69  r daemon listeni
106b0 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f 72 74  ng on port iPort
106c0 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 20 63  ..**.** As new c
106d0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72 69 76  onnections arriv
106e0 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c 64 20  e, fork a child 
106f0 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20 72 65  and let child re
10700 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 20 74  turn.** out of t
10710 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 61  his procedure ca
10720 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64 20 77  ll.  The child w
10730 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 20 72  ill handle the r
10740 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65 20 70  equest..** The p
10750 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65 74 75  arent never retu
10760 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 72  rns from this pr
10770 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 52  ocedure..**.** R
10780 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63 68 20  eturn 0 to each 
10790 63 68 69 6c 64 20 61 73 20 69 74 20 72 75 6e 73  child as it runs
107a0 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  .  If unable to 
107b0 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a 20 6c  establish a.** l
107c0 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 2c  istening socket,
107d0 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
107e0 2e 0a 2a 2f 0a 69 6e 74 20 68 74 74 70 5f 73 65  ..*/.int http_se
107f0 72 76 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  rver(const char 
10800 2a 7a 50 6f 72 74 2c 20 69 6e 74 20 6c 6f 63 61  *zPort, int loca
10810 6c 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 6c 69  lOnly){.  int li
10820 73 74 65 6e 65 72 5b 32 30 5d 3b 20 20 20 20 20  stener[20];     
10830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65         /* The se
10840 72 76 65 72 20 73 6f 63 6b 65 74 73 20 2a 2f 0a  rver sockets */.
10850 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e    int connection
10860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10870 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f 72 20 65  * A socket for e
10880 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 63  ach individual c
10890 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 66  onnection */.  f
108a0 64 5f 73 65 74 20 72 65 61 64 66 64 73 3b 20 20  d_set readfds;  
108b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
108c0 65 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  et of file descr
108d0 69 70 74 6f 72 73 20 66 6f 72 20 73 65 6c 65 63  iptors for selec
108e0 74 28 29 20 2a 2f 0a 20 20 61 64 64 72 65 73 73  t() */.  address
108f0 20 69 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20   inaddr;        
10900 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 74 65 20        /* Remote 
10910 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 73 6f 63  address */.  soc
10920 6b 6c 65 6e 5f 74 20 6c 65 6e 61 64 64 72 3b 20  klen_t lenaddr; 
10930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
10940 67 74 68 20 6f 66 20 74 68 65 20 69 6e 61 64 64  gth of the inadd
10950 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
10960 20 69 6e 74 20 63 68 69 6c 64 3b 20 20 20 20 20   int child;     
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10980 20 50 49 44 20 6f 66 20 74 68 65 20 63 68 69 6c   PID of the chil
10990 64 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69  d process */.  i
109a0 6e 74 20 6e 63 68 69 6c 64 72 65 6e 20 3d 20 30  nt nchildren = 0
109b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
109c0 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64 20 70  umber of child p
109d0 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 73 74  rocesses */.  st
109e0 72 75 63 74 20 74 69 6d 65 76 61 6c 20 64 65 6c  ruct timeval del
109f0 61 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  ay;        /* Ho
10a00 77 20 6c 6f 6e 67 20 74 6f 20 77 61 69 74 20 69  w long to wait i
10a10 6e 73 69 64 65 20 73 65 6c 65 63 74 28 29 20 2a  nside select() *
10a20 2f 0a 20 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b  /.  int opt = 1;
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 2f 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20 66   /* setsockopt f
10a50 6c 61 67 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  lag */.  struct 
10a60 61 64 64 72 69 6e 66 6f 20 73 48 69 6e 74 73 3b  addrinfo sHints;
10a70 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10a80 20 68 69 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75   hints */.  stru
10a90 63 74 20 61 64 64 72 69 6e 66 6f 20 2a 70 41 64  ct addrinfo *pAd
10aa0 64 72 73 2c 20 2a 70 3b 20 2f 2a 20 2a 2f 0a 20  drs, *p; /* */. 
10ab0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ad0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
10ae0 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e    int i, n;.  in
10af0 74 20 6d 61 78 46 64 20 3d 20 2d 31 3b 0a 20 20  t maxFd = -1;.  
10b00 0a 20 20 6d 65 6d 73 65 74 28 26 73 48 69 6e 74  .  memset(&sHint
10b10 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 48 69  s, 0, sizeof(sHi
10b20 6e 74 73 29 29 3b 0a 20 20 69 66 28 20 69 70 76  nts));.  if( ipv
10b30 34 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69  4Only ){.    sHi
10b40 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20  nts.ai_family = 
10b50 50 46 5f 49 4e 45 54 3b 0a 20 20 20 20 2f 2a 70  PF_INET;.    /*p
10b60 72 69 6e 74 66 28 22 69 70 76 34 20 6f 6e 6c 79  rintf("ipv4 only
10b70 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65 20  \n");*/.  }else 
10b80 69 66 28 20 69 70 76 36 4f 6e 6c 79 20 29 7b 0a  if( ipv6Only ){.
10b90 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f 66 61      sHints.ai_fa
10ba0 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54 36 3b  mily = PF_INET6;
10bb0 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22 69  .    /*printf("i
10bc0 70 76 36 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f 0a  pv6 only\n");*/.
10bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 48 69    }else{.    sHi
10be0 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20  nts.ai_family = 
10bf0 50 46 5f 55 4e 53 50 45 43 3b 0a 20 20 7d 0a 20  PF_UNSPEC;.  }. 
10c00 20 73 48 69 6e 74 73 2e 61 69 5f 73 6f 63 6b 74   sHints.ai_sockt
10c10 79 70 65 20 3d 20 53 4f 43 4b 5f 53 54 52 45 41  ype = SOCK_STREA
10c20 4d 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 66  M;.  sHints.ai_f
10c30 6c 61 67 73 20 3d 20 41 49 5f 50 41 53 53 49 56  lags = AI_PASSIV
10c40 45 3b 0a 20 20 73 48 69 6e 74 73 2e 61 69 5f 70  E;.  sHints.ai_p
10c50 72 6f 74 6f 63 6f 6c 20 3d 20 30 3b 0a 20 20 72  rotocol = 0;.  r
10c60 63 20 3d 20 67 65 74 61 64 64 72 69 6e 66 6f 28  c = getaddrinfo(
10c70 6c 6f 63 61 6c 4f 6e 6c 79 20 3f 20 22 6c 6f 63  localOnly ? "loc
10c80 61 6c 68 6f 73 74 22 3a 20 30 2c 20 7a 50 6f 72  alhost": 0, zPor
10c90 74 2c 20 26 73 48 69 6e 74 73 2c 20 26 70 41 64  t, &sHints, &pAd
10ca0 64 72 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  drs);.  if( rc )
10cb0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
10cc0 64 65 72 72 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  derr, "could not
10cd0 20 67 65 74 20 61 64 64 72 20 69 6e 66 6f 3a 20   get addr info: 
10ce0 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
10cf0 20 20 72 63 21 3d 45 41 49 5f 53 59 53 54 45 4d    rc!=EAI_SYSTEM
10d00 20 3f 20 67 61 69 5f 73 74 72 65 72 72 6f 72 28   ? gai_strerror(
10d10 72 63 29 20 3a 20 73 74 72 65 72 72 6f 72 28 65  rc) : strerror(e
10d20 72 72 6e 6f 29 29 3b 0a 20 20 20 20 72 65 74 75  rrno));.    retu
10d30 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  rn 1;.  }.  for(
10d40 6e 3d 30 2c 20 70 3d 70 41 64 64 72 73 3b 20 6e  n=0, p=pAddrs; n
10d50 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 6c 69  <(int)(sizeof(li
10d60 73 74 65 6e 65 72 29 2f 73 69 7a 65 6f 66 28 6c  stener)/sizeof(l
10d70 69 73 74 65 6e 65 72 5b 30 5d 29 29 20 26 26 20  istener[0])) && 
10d80 70 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 70 3d  p!=0;.        p=
10d90 70 2d 3e 61 69 5f 6e 65 78 74 29 7b 0a 20 20 20  p->ai_next){.   
10da0 20 6c 69 73 74 65 6e 65 72 5b 6e 5d 20 3d 20 73   listener[n] = s
10db0 6f 63 6b 65 74 28 70 2d 3e 61 69 5f 66 61 6d 69  ocket(p->ai_fami
10dc0 6c 79 2c 20 70 2d 3e 61 69 5f 73 6f 63 6b 74 79  ly, p->ai_sockty
10dd0 70 65 2c 20 70 2d 3e 61 69 5f 70 72 6f 74 6f 63  pe, p->ai_protoc
10de0 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 6c 69 73  ol);.    if( lis
10df0 74 65 6e 65 72 5b 6e 5d 3e 3d 30 20 29 7b 0a 20  tener[n]>=0 ){. 
10e00 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 63 61       /* if we ca
10e10 6e 27 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69  n't terminate ni
10e20 63 65 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61  cely, at least a
10e30 6c 6c 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20  llow the socket 
10e40 74 6f 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a  to be reused */.
10e50 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f 70 74        setsockopt
10e60 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 53 4f  (listener[n], SO
10e70 4c 5f 53 4f 43 4b 45 54 2c 20 53 4f 5f 52 45 55  L_SOCKET, SO_REU
10e80 53 45 41 44 44 52 2c 26 6f 70 74 2c 20 73 69 7a  SEADDR,&opt, siz
10e90 65 6f 66 28 6f 70 74 29 29 3b 0a 20 20 20 20 20  eof(opt));.     
10ea0 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 50   .#if defined(IP
10eb0 56 36 5f 56 36 4f 4e 4c 59 29 0a 20 20 20 20 20  V6_V6ONLY).     
10ec0 20 69 66 28 20 70 2d 3e 61 69 5f 66 61 6d 69 6c   if( p->ai_famil
10ed0 79 3d 3d 41 46 5f 49 4e 45 54 36 20 29 7b 0a 20  y==AF_INET6 ){. 
10ee0 20 20 20 20 20 20 20 69 6e 74 20 76 36 6f 6e 6c         int v6onl
10ef0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  y = 1;.        s
10f00 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e  etsockopt(listen
10f10 65 72 5b 6e 5d 2c 20 49 50 50 52 4f 54 4f 5f 49  er[n], IPPROTO_I
10f20 50 56 36 2c 20 49 50 56 36 5f 56 36 4f 4e 4c 59  PV6, IPV6_V6ONLY
10f30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10f40 20 20 20 20 20 20 26 76 36 6f 6e 6c 79 2c 20 73        &v6only, s
10f50 69 7a 65 6f 66 28 76 36 6f 6e 6c 79 29 29 3b 0a  izeof(v6only));.
10f60 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
10f70 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
10f80 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 5b 6e 5d  bind(listener[n]
10f90 2c 20 70 2d 3e 61 69 5f 61 64 64 72 2c 20 70 2d  , p->ai_addr, p-
10fa0 3e 61 69 5f 61 64 64 72 6c 65 6e 29 3c 30 20 29  >ai_addrlen)<0 )
10fb0 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
10fc0 28 22 62 69 6e 64 20 66 61 69 6c 65 64 3a 20 25  ("bind failed: %
10fd0 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65  s\n", strerror(e
10fe0 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  rrno));.        
10ff0 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e  close(listener[n
11000 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ]);.        cont
11010 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
11020 20 20 20 20 69 66 28 20 6c 69 73 74 65 6e 28 6c      if( listen(l
11030 69 73 74 65 6e 65 72 5b 6e 5d 2c 20 32 30 29 3c  istener[n], 20)<
11040 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
11050 6e 74 66 28 22 6c 69 73 74 65 6e 28 29 20 66 61  ntf("listen() fa
11060 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 74 72  iled: %s\n", str
11070 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b 0a 20  error(errno));. 
11080 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73         close(lis
11090 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20 20 20  tener[n]);.     
110a0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
110b0 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a     }.      n++;.
110c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
110d0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
110e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e  ntf(stderr, "can
110f0 6e 6f 74 20 6f 70 65 6e 20 61 6e 79 20 73 6f 63  not open any soc
11100 6b 65 74 73 5c 6e 22 29 3b 0a 20 20 20 20 72 65  kets\n");.    re
11110 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 77  turn 1;.  }..  w
11120 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
11130 66 28 20 6e 63 68 69 6c 64 72 65 6e 3e 4d 41 58  f( nchildren>MAX
11140 5f 50 41 52 41 4c 4c 45 4c 20 29 7b 0a 20 20 20  _PARALLEL ){.   
11150 20 20 20 2f 2a 20 53 6c 6f 77 20 64 6f 77 6e 20     /* Slow down 
11160 69 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  if connections a
11170 72 65 20 61 72 72 69 76 69 6e 67 20 74 6f 6f 20  re arriving too 
11180 66 61 73 74 20 2a 2f 0a 20 20 20 20 20 20 73 6c  fast */.      sl
11190 65 65 70 28 20 6e 63 68 69 6c 64 72 65 6e 2d 4d  eep( nchildren-M
111a0 41 58 5f 50 41 52 41 4c 4c 45 4c 20 29 3b 0a 20  AX_PARALLEL );. 
111b0 20 20 20 7d 0a 20 20 20 20 64 65 6c 61 79 2e 74     }.    delay.t
111c0 76 5f 73 65 63 20 3d 20 36 30 3b 0a 20 20 20 20  v_sec = 60;.    
111d0 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 20 3d 20  delay.tv_usec = 
111e0 30 3b 0a 20 20 20 20 46 44 5f 5a 45 52 4f 28 26  0;.    FD_ZERO(&
111f0 72 65 61 64 66 64 73 29 3b 0a 20 20 20 20 66 6f  readfds);.    fo
11200 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
11210 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11220 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 3d 30 20 29  listener[i]>=0 )
11230 3b 0a 20 20 20 20 20 20 46 44 5f 53 45 54 28 20  ;.      FD_SET( 
11240 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26 72 65  listener[i], &re
11250 61 64 66 64 73 29 3b 0a 20 20 20 20 20 20 69 66  adfds);.      if
11260 28 20 6c 69 73 74 65 6e 65 72 5b 69 5d 3e 6d 61  ( listener[i]>ma
11270 78 46 64 20 29 20 6d 61 78 46 64 20 3d 20 6c 69  xFd ) maxFd = li
11280 73 74 65 6e 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  stener[i];.    }
11290 0a 20 20 20 20 73 65 6c 65 63 74 28 20 6d 61 78  .    select( max
112a0 46 64 2b 31 2c 20 26 72 65 61 64 66 64 73 2c 20  Fd+1, &readfds, 
112b0 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20  0, 0, &delay);. 
112c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
112d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
112e0 20 46 44 5f 49 53 53 45 54 28 6c 69 73 74 65 6e   FD_ISSET(listen
112f0 65 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29  er[i], &readfds)
11300 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 61   ){.        lena
11310 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e 61  ddr = sizeof(ina
11320 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ddr);.        co
11330 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70  nnection = accep
11340 74 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20 26  t(listener[i], &
11350 69 6e 61 64 64 72 2e 73 61 2c 20 26 6c 65 6e 61  inaddr.sa, &lena
11360 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ddr);.        if
11370 28 20 63 6f 6e 6e 65 63 74 69 6f 6e 3e 3d 30 20  ( connection>=0 
11380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 69  ){.          chi
11390 6c 64 20 3d 20 66 6f 72 6b 28 29 3b 0a 20 20 20  ld = fork();.   
113a0 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c 64         if( child
113b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
113c0 20 20 20 69 66 28 20 63 68 69 6c 64 3e 30 20 29     if( child>0 )
113d0 20 6e 63 68 69 6c 64 72 65 6e 2b 2b 3b 0a 20 20   nchildren++;.  
113e0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
113f0 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20  connection);.   
11400 20 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e           /* prin
11410 74 66 28 22 73 75 62 70 72 6f 63 65 73 73 20 25  tf("subprocess %
11420 64 20 73 74 61 72 74 65 64 2e 2e 2e 5c 6e 22 2c  d started...\n",
11430 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73 68 28   child); fflush(
11440 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 20 20  stdout); */.    
11450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11460 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 72           int nEr
11470 72 20 3d 20 30 2c 20 66 64 3b 0a 20 20 20 20 20  r = 0, fd;.     
11480 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30 29 3b         close(0);
11490 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64 20  .            fd 
114a0 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e  = dup(connection
114b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
114c0 66 28 20 66 64 21 3d 30 20 29 20 6e 45 72 72 2b  f( fd!=0 ) nErr+
114d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
114e0 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 20  lose(1);.       
114f0 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f       fd = dup(co
11500 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  nnection);.     
11510 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d 31         if( fd!=1
11520 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20   ) nErr++;.     
11530 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e         close(con
11540 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  nection);.      
11550 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72        return nEr
11560 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
11570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11580 0a 20 20 20 20 20 20 2f 2a 20 42 75 72 79 20 64  .      /* Bury d
11590 65 61 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f 0a  ead children */.
115a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 68        while( (ch
115b0 69 6c 64 20 3d 20 77 61 69 74 70 69 64 28 30 2c  ild = waitpid(0,
115c0 20 30 2c 20 57 4e 4f 48 41 4e 47 29 29 3e 30 20   0, WNOHANG))>0 
115d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 72  ){.        /* pr
115e0 69 6e 74 66 28 22 70 72 6f 63 65 73 73 20 25 64  intf("process %d
115f0 20 65 6e 64 73 5c 6e 22 2c 20 63 68 69 6c 64 29   ends\n", child)
11600 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
11610 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 63 68  ; */.        nch
11620 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20  ildren--;.      
11630 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
11640 20 4e 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 20   NOT REACHED */ 
11650 20 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a   .  exit(1);.}..
11660 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
11670 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
11680 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
116a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
116b0 0a 20 20 63 68 61 72 20 2a 7a 50 65 72 6d 55 73  .  char *zPermUs
116c0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  er = 0;      /* 
116d0 52 75 6e 20 64 61 65 6d 6f 6e 20 77 69 74 68 20  Run daemon with 
116e0 74 68 69 73 20 75 73 65 72 27 73 20 70 65 72 6d  this user's perm
116f0 69 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e  issions */.  con
11700 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 20 3d  st char *zPort =
11710 20 30 3b 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d   0;    /* Implem
11720 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 76  ent an HTTP serv
11730 65 72 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  er process */.  
11740 69 6e 74 20 75 73 65 43 68 72 6f 6f 74 4a 61 69  int useChrootJai
11750 6c 20 3d 20 31 3b 20 20 20 20 2f 2a 20 54 72 75  l = 1;    /* Tru
11760 65 20 74 6f 20 75 73 65 20 61 20 63 68 61 6e 67  e to use a chang
11770 65 2d 72 6f 6f 74 20 6a 61 69 6c 20 2a 2f 0a 20  e-root jail */. 
11780 20 73 74 72 75 63 74 20 70 61 73 73 77 64 20 2a   struct passwd *
11790 70 77 64 20 3d 20 30 3b 20 20 20 2f 2a 20 49 6e  pwd = 0;   /* In
117a0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
117b0 74 68 65 20 75 73 65 72 20 2a 2f 0a 0a 20 20 2f  the user */..  /
117c0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 74 69 6d  * Record the tim
117d0 65 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  e when processin
117e0 67 20 62 65 67 69 6e 73 2e 0a 20 20 2a 2f 0a 20  g begins..  */. 
117f0 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 62   gettimeofday(&b
11800 65 67 69 6e 54 69 6d 65 2c 20 30 29 3b 0a 0a 20  eginTime, 0);.. 
11810 20 2f 2a 20 50 61 72 73 65 20 63 6f 6d 6d 61 6e   /* Parse comman
11820 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73  d-line arguments
11830 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 61  .  */.  while( a
11840 72 67 63 3e 31 20 26 26 20 61 72 67 76 5b 31 5d  rgc>1 && argv[1]
11850 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
11860 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 31  char *z = argv[1
11870 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 72  ];.    char *zAr
11880 67 20 3d 20 61 72 67 63 3e 3d 33 20 3f 20 61 72  g = argc>=3 ? ar
11890 67 76 5b 32 5d 20 3a 20 22 30 22 3b 0a 20 20 20  gv[2] : "0";.   
118a0 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
118b0 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
118c0 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  +;.    if( strcm
118d0 70 28 7a 2c 22 2d 75 73 65 72 22 29 3d 3d 30 20  p(z,"-user")==0 
118e0 29 7b 0a 20 20 20 20 20 20 7a 50 65 72 6d 55 73  ){.      zPermUs
118f0 65 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 7d  er = zArg;.    }
11900 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11910 7a 2c 22 2d 72 6f 6f 74 22 29 3d 3d 30 20 29 7b  z,"-root")==0 ){
11920 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 7a  .      zRoot = z
11930 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Arg;.    }else i
11940 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6c 6f  f( strcmp(z,"-lo
11950 67 66 69 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20  gfile")==0 ){.  
11960 20 20 20 20 7a 4c 6f 67 46 69 6c 65 20 3d 20 7a      zLogFile = z
11970 41 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Arg;.    }else i
11980 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 61  f( strcmp(z,"-ma
11990 78 2d 61 67 65 22 29 3d 3d 30 20 29 7b 0a 20 20  x-age")==0 ){.  
119a0 20 20 20 20 6d 78 41 67 65 20 3d 20 61 74 6f 69      mxAge = atoi
119b0 28 7a 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73  (zArg);.    }els
119c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
119d0 2d 68 74 74 70 73 22 29 3d 3d 30 20 29 7b 0a 20  -https")==0 ){. 
119e0 20 20 20 20 20 75 73 65 48 74 74 70 73 20 3d 20       useHttps = 
119f0 61 74 6f 69 28 7a 41 72 67 29 3b 0a 20 20 20 20  atoi(zArg);.    
11a00 20 20 7a 48 74 74 70 20 3d 20 75 73 65 48 74 74    zHttp = useHtt
11a10 70 73 20 3f 20 22 68 74 74 70 73 22 20 3a 20 22  ps ? "https" : "
11a20 68 74 74 70 22 3b 0a 20 20 20 20 20 20 69 66 28  http";.      if(
11a30 20 75 73 65 48 74 74 70 73 20 29 20 7a 52 65 6d   useHttps ) zRem
11a40 6f 74 65 41 64 64 72 20 3d 20 67 65 74 65 6e 76  oteAddr = getenv
11a50 28 22 52 45 4d 4f 54 45 5f 48 4f 53 54 22 29 3b  ("REMOTE_HOST");
11a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
11a70 74 72 63 6d 70 28 7a 2c 20 22 2d 70 6f 72 74 22  trcmp(z, "-port"
11a80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50  )==0 ){.      zP
11a90 6f 72 74 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  ort = zArg;.    
11aa0 20 20 73 74 61 6e 64 61 6c 6f 6e 65 20 3d 20 31    standalone = 1
11ab0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
11ac0 73 74 72 63 6d 70 28 7a 2c 20 22 2d 66 61 6d 69  strcmp(z, "-fami
11ad0 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ly")==0 ){.     
11ae0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
11af0 2c 20 22 69 70 76 34 22 29 3d 3d 30 20 29 7b 0a  , "ipv4")==0 ){.
11b00 20 20 20 20 20 20 20 20 69 70 76 34 4f 6e 6c 79          ipv4Only
11b10 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
11b20 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72  e if( strcmp(zAr
11b30 67 2c 20 22 69 70 76 36 22 29 3d 3d 30 20 29 7b  g, "ipv6")==0 ){
11b40 0a 20 20 20 20 20 20 20 20 69 70 76 36 4f 6e 6c  .        ipv6Onl
11b50 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  y = 1;.      }el
11b60 73 65 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66  se{.        Malf
11b70 75 6e 63 74 69 6f 6e 28 35 30 30 2c 20 20 2f 2a  unction(500,  /*
11b80 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 49 50   LOG: unknown IP
11b90 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20   protocol */.   
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 22 75 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f   "unknown IP pro
11bc0 74 6f 63 6f 6c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  tocol: [%s]\n", 
11bd0 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zArg);.      }. 
11be0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11bf0 63 6d 70 28 7a 2c 20 22 2d 6a 61 69 6c 22 29 3d  cmp(z, "-jail")=
11c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
11c10 61 74 6f 69 28 7a 41 72 67 29 3d 3d 30 20 29 7b  atoi(zArg)==0 ){
11c20 0a 20 20 20 20 20 20 20 20 75 73 65 43 68 72 6f  .        useChro
11c30 6f 74 4a 61 69 6c 20 3d 20 30 3b 0a 20 20 20 20  otJail = 0;.    
11c40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
11c50 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64 65  ( strcmp(z, "-de
11c60 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  bug")==0 ){.    
11c70 20 20 69 66 28 20 61 74 6f 69 28 7a 41 72 67 29    if( atoi(zArg)
11c80 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 54   ){.        useT
11c90 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  imeout = 0;.    
11ca0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
11cb0 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 2d 64 61  ( strcmp(z, "-da
11cc0 74 65 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20  tetest")==0 ){. 
11cd0 20 20 20 20 20 54 65 73 74 50 61 72 73 65 52 66       TestParseRf
11ce0 63 38 32 32 44 61 74 65 28 29 3b 0a 20 20 20 20  c822Date();.    
11cf0 20 20 70 72 69 6e 74 66 28 22 4f 6b 5c 6e 22 29    printf("Ok\n")
11d00 3b 0a 20 20 20 20 20 20 65 78 69 74 28 30 29 3b  ;.      exit(0);
11d10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11d20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 31    Malfunction(51
11d30 30 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f  0, /* LOG: unkno
11d40 77 6e 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  wn command-line 
11d50 61 72 67 75 6d 65 6e 74 20 6f 6e 20 6c 61 75 6e  argument on laun
11d60 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ch */.          
11d70 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
11d80 20 61 72 67 75 6d 65 6e 74 3a 20 5b 25 73 5d 5c   argument: [%s]\
11d90 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  n", z);.    }.  
11da0 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20 20    argv += 2;.   
11db0 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 7d 0a   argc -= 2;.  }.
11dc0 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29    if( zRoot==0 )
11dd0 7b 0a 20 20 20 20 69 66 28 20 73 74 61 6e 64 61  {.    if( standa
11de0 6c 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 7a 52  lone ){.      zR
11df0 6f 6f 74 20 3d 20 22 2e 22 3b 0a 20 20 20 20 7d  oot = ".";.    }
11e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66  else{.      Malf
11e10 75 6e 63 74 69 6f 6e 28 35 32 30 2c 20 2f 2a 20  unction(520, /* 
11e20 4c 4f 47 3a 20 2d 2d 72 6f 6f 74 20 61 72 67 75  LOG: --root argu
11e30 6d 65 6e 74 20 6d 69 73 73 69 6e 67 20 2a 2f 0a  ment missing */.
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 20 22 6e 6f 20 2d 2d 72 6f 6f 74 20 73 70 65    "no --root spe
11e60 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 7d 0a  cified");.    }.
11e70 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 68 61 6e    }.  .  /* Chan
11e80 67 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 74  ge directories t
11e90 6f 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  o the root of th
11ea0 65 20 48 54 54 50 20 66 69 6c 65 73 79 73 74 65  e HTTP filesyste
11eb0 6d 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 72  m.  Then.  ** cr
11ec0 65 61 74 65 20 61 20 63 68 72 6f 6f 74 20 6a 61  eate a chroot ja
11ed0 69 6c 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  il there..  */. 
11ee0 20 69 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74   if( chdir(zRoot
11ef0 29 21 3d 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66  )!=0 ){.    Malf
11f00 75 6e 63 74 69 6f 6e 28 35 33 30 2c 20 2f 2a 20  unction(530, /* 
11f10 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66 61 69  LOG: chdir() fai
11f20 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
11f30 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63         "cannot c
11f40 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f  hange to directo
11f50 72 79 20 5b 25 73 5d 22 2c 20 7a 52 6f 6f 74 29  ry [%s]", zRoot)
11f60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
11f70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
11f80 74 20 74 68 65 20 75 73 65 72 20 69 66 20 61 76  t the user if av
11f90 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ailable */.  if(
11fa0 20 7a 50 65 72 6d 55 73 65 72 20 29 20 70 77 64   zPermUser ) pwd
11fb0 20 3d 20 67 65 74 70 77 6e 61 6d 28 7a 50 65 72   = getpwnam(zPer
11fc0 6d 55 73 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 6e  mUser);..  /* En
11fd0 74 65 72 20 74 68 65 20 63 68 72 6f 6f 74 20 6a  ter the chroot j
11fe0 61 69 6c 20 69 66 20 72 65 71 75 65 73 74 65 64  ail if requested
11ff0 20 2a 2f 20 20 0a 20 20 69 66 28 20 7a 50 65 72   */  .  if( zPer
12000 6d 55 73 65 72 20 26 26 20 75 73 65 43 68 72 6f  mUser && useChro
12010 6f 74 4a 61 69 6c 20 26 26 20 67 65 74 75 69 64  otJail && getuid
12020 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ()==0 ){.    if(
12030 20 63 68 72 6f 6f 74 28 22 2e 22 29 3c 30 20 29   chroot(".")<0 )
12040 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  {.      Malfunct
12050 69 6f 6e 28 35 34 30 2c 20 2f 2a 20 4c 4f 47 3a  ion(540, /* LOG:
12060 20 63 68 72 6f 6f 74 28 29 20 66 61 69 6c 65 64   chroot() failed
12070 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
12080 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
12090 20 63 72 65 61 74 65 20 63 68 72 6f 6f 74 20 6a   create chroot j
120a0 61 69 6c 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ail");.    }else
120b0 7b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20  {.      zRoot = 
120c0 22 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  "";.    }.  }.. 
120d0 20 2f 2a 20 41 63 74 69 76 61 74 65 20 74 68 65   /* Activate the
120e0 20 73 65 72 76 65 72 2c 20 69 66 20 72 65 71 75   server, if requ
120f0 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a  ested */.  if( z
12100 50 6f 72 74 20 26 26 20 68 74 74 70 5f 73 65 72  Port && http_ser
12110 76 65 72 28 7a 50 6f 72 74 2c 20 30 29 20 29 7b  ver(zPort, 0) ){
12120 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
12130 28 35 35 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65  (550, /* LOG: se
12140 72 76 65 72 20 73 74 61 72 74 75 70 20 66 61 69  rver startup fai
12150 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
12160 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74         "failed t
12170 6f 20 73 74 61 72 74 20 73 65 72 76 65 72 22 29  o start server")
12180 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 72 6f 70  ;.  }..  /* Drop
12190 20 72 6f 6f 74 20 70 72 69 76 69 6c 65 67 65 73   root privileges
121a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65  ..  */.  if( zPe
121b0 72 6d 55 73 65 72 20 29 7b 0a 20 20 20 20 69 66  rmUser ){.    if
121c0 28 20 70 77 64 20 29 7b 0a 20 20 20 20 20 20 69  ( pwd ){.      i
121d0 66 28 20 73 65 74 67 69 64 28 70 77 64 2d 3e 70  f( setgid(pwd->p
121e0 77 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  w_gid) ){.      
121f0 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 36    Malfunction(56
12200 30 2c 20 2f 2a 20 4c 4f 47 3a 20 73 65 74 67 69  0, /* LOG: setgi
12210 64 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  d() failed */.  
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 22 63 61 6e 6e 6f 74 20 73 65 74 20 67 72    "cannot set gr
12240 6f 75 70 2d 69 64 20 74 6f 20 25 64 22 2c 20 70  oup-id to %d", p
12250 77 64 2d 3e 70 77 5f 67 69 64 29 3b 0a 20 20 20  wd->pw_gid);.   
12260 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
12270 65 74 75 69 64 28 70 77 64 2d 3e 70 77 5f 75 69  etuid(pwd->pw_ui
12280 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61  d) ){.        Ma
12290 6c 66 75 6e 63 74 69 6f 6e 28 35 37 30 2c 20 2f  lfunction(570, /
122a0 2a 20 4c 4f 47 3a 20 73 65 74 75 69 64 28 29 20  * LOG: setuid() 
122b0 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
122d0 61 6e 6e 6f 74 20 73 65 74 20 75 73 65 72 2d 69  annot set user-i
122e0 64 20 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70  d to %d", pwd->p
122f0 77 5f 75 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a  w_uid);.      }.
12300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12310 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 38 30   Malfunction(580
12320 2c 20 2f 2a 20 4c 4f 47 3a 20 75 6e 6b 6e 6f 77  , /* LOG: unknow
12330 6e 20 75 73 65 72 20 2a 2f 0a 20 20 20 20 20 20  n user */.      
12340 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20              "no 
12350 73 75 63 68 20 75 73 65 72 20 5b 25 73 5d 22 2c  such user [%s]",
12360 20 7a 50 65 72 6d 55 73 65 72 29 3b 0a 20 20 20   zPermUser);.   
12370 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74   }.  }.  if( get
12380 75 69 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uid()==0 ){.    
12390 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 39 30 2c  Malfunction(590,
123a0 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f 74 20   /* LOG: cannot 
123b0 72 75 6e 20 61 73 20 72 6f 6f 74 20 2a 2f 0a 20  run as root */. 
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
123d0 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20 72 6f  cannot run as ro
123e0 6f 74 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ot");.  }..  /* 
123f0 47 65 74 20 74 68 65 20 49 50 20 61 64 64 72 65  Get the IP addre
12400 73 73 20 66 72 6f 6d 20 77 68 65 6e 63 65 20 74  ss from whence t
12410 68 65 20 72 65 71 75 65 73 74 20 6f 72 69 67 69  he request origi
12420 6e 61 74 65 73 0a 20 20 2a 2f 0a 20 20 69 66 28  nates.  */.  if(
12430 20 7a 52 65 6d 6f 74 65 41 64 64 72 3d 3d 30 20   zRemoteAddr==0 
12440 29 7b 0a 20 20 20 20 61 64 64 72 65 73 73 20 72  ){.    address r
12450 65 6d 6f 74 65 41 64 64 72 3b 0a 20 20 20 20 75  emoteAddr;.    u
12460 6e 73 69 67 6e 65 64 20 69 6e 74 20 73 69 7a 65  nsigned int size
12470 20 3d 20 73 69 7a 65 6f 66 28 72 65 6d 6f 74 65   = sizeof(remote
12480 41 64 64 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Addr);.    char 
12490 7a 48 6f 73 74 5b 4e 49 5f 4d 41 58 48 4f 53 54  zHost[NI_MAXHOST
124a0 5d 3b 0a 20 20 20 20 69 66 28 20 67 65 74 70 65  ];.    if( getpe
124b0 65 72 6e 61 6d 65 28 30 2c 20 26 72 65 6d 6f 74  ername(0, &remot
124c0 65 41 64 64 72 2e 73 61 2c 20 26 73 69 7a 65 29  eAddr.sa, &size)
124d0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 65 74  >=0 ){.      get
124e0 6e 61 6d 65 69 6e 66 6f 28 26 72 65 6d 6f 74 65  nameinfo(&remote
124f0 41 64 64 72 2e 73 61 2c 20 73 69 7a 65 2c 20 7a  Addr.sa, size, z
12500 48 6f 73 74 2c 20 73 69 7a 65 6f 66 28 7a 48 6f  Host, sizeof(zHo
12510 73 74 29 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  st), 0, 0,.     
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 49 5f               NI_
12530 4e 55 4d 45 52 49 43 48 4f 53 54 29 3b 0a 20 20  NUMERICHOST);.  
12540 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64 72 20      zRemoteAddr 
12550 3d 20 53 74 72 44 75 70 28 7a 48 6f 73 74 29 3b  = StrDup(zHost);
12560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12570 20 7a 52 65 6d 6f 74 65 41 64 64 72 21 3d 30 0a   zRemoteAddr!=0.
12580 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 52     && strncmp(zR
12590 65 6d 6f 74 65 41 64 64 72 2c 20 22 3a 3a 66 66  emoteAddr, "::ff
125a0 66 66 3a 22 2c 20 37 29 3d 3d 30 0a 20 20 20 26  ff:", 7)==0.   &
125b0 26 20 73 74 72 63 68 72 28 7a 52 65 6d 6f 74 65  & strchr(zRemote
125c0 41 64 64 72 2b 37 2c 20 27 3a 27 29 3d 3d 30 0a  Addr+7, ':')==0.
125d0 20 20 20 26 26 20 73 74 72 63 68 72 28 7a 52 65     && strchr(zRe
125e0 6d 6f 74 65 41 64 64 72 2b 37 2c 20 27 2e 27 29  moteAddr+7, '.')
125f0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 7a 52 65  !=0.  ){.    zRe
12600 6d 6f 74 65 41 64 64 72 20 2b 3d 20 37 3b 0a 20  moteAddr += 7;. 
12610 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
12620 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 65 61   the input strea
12630 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m */.  for(i=0; 
12640 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<100; i++){.   
12650 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75 65   ProcessOneReque
12660 73 74 28 30 29 3b 0a 20 20 7d 0a 20 20 50 72 6f  st(0);.  }.  Pro
12670 63 65 73 73 4f 6e 65 52 65 71 75 65 73 74 28 31  cessOneRequest(1
12680 29 3b 0a 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a  );.  exit(0);.}.
12690 0a 23 69 66 20 30 0a 2f 2a 20 43 6f 70 79 2f 70  .#if 0./* Copy/p
126a0 61 73 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  aste the followi
126b0 6e 67 20 74 65 78 74 20 69 6e 74 6f 20 53 51 4c  ng text into SQL
126c0 69 74 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  ite to generate 
126d0 74 68 65 20 78 72 65 66 0a 2a 2a 20 74 61 62 6c  the xref.** tabl
126e0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
126f0 20 61 6c 6c 20 65 72 72 6f 72 20 63 6f 64 65 73   all error codes
12700 2e 0a 2a 2f 0a 42 45 47 49 4e 3b 0a 43 52 45 41  ..*/.BEGIN;.CREA
12710 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
12720 45 58 49 53 54 53 20 78 72 65 66 28 6c 69 6e 65  EXISTS xref(line
12730 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
12740 52 59 20 4b 45 59 2c 20 64 65 73 63 20 54 45 58  RY KEY, desc TEX
12750 54 29 3b 0a 44 45 4c 45 54 45 20 46 52 4f 4d 20  T);.DELETE FROM 
12760 58 72 65 66 3b 0a 49 4e 53 45 52 54 20 49 4e 54  Xref;.INSERT INT
12770 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 30  O xref VALUES(10
12780 30 2c 27 4d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  0,'Malloc() fail
12790 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
127a0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 31  O xref VALUES(11
127b0 30 2c 27 4e 6f 74 20 61 75 74 68 6f 72 69 7a 65  0,'Not authorize
127c0 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  d');.INSERT INTO
127d0 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 32 30   xref VALUES(120
127e0 2c 27 43 47 49 20 45 72 72 6f 72 27 29 3b 0a 49  ,'CGI Error');.I
127f0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
12800 56 41 4c 55 45 53 28 31 33 30 2c 27 54 69 6d 65  VALUES(130,'Time
12810 6f 75 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  out');.INSERT IN
12820 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
12830 34 30 2c 27 43 47 49 20 73 63 72 69 70 74 20 69  40,'CGI script i
12840 73 20 77 72 69 74 61 62 6c 65 27 29 3b 0a 49 4e  s writable');.IN
12850 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12860 41 4c 55 45 53 28 31 35 30 2c 27 43 61 6e 6e 6f  ALUES(150,'Canno
12870 74 20 6f 70 65 6e 20 2d 61 75 74 68 20 66 69 6c  t open -auth fil
12880 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  e');.INSERT INTO
12890 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 36 30   xref VALUES(160
128a0 2c 27 68 74 74 70 20 72 65 71 75 65 73 74 20 6f  ,'http request o
128b0 6e 20 68 74 74 70 73 2d 6f 6e 6c 79 20 70 61 67  n https-only pag
128c0 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  e');.INSERT INTO
128d0 20 78 72 65 66 20 56 41 4c 55 45 53 28 31 37 30   xref VALUES(170
128e0 2c 27 2d 61 75 74 68 20 72 65 64 69 72 65 63 74  ,'-auth redirect
128f0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12900 78 72 65 66 20 56 41 4c 55 45 53 28 31 38 30 2c  xref VALUES(180,
12910 27 6d 61 6c 66 6f 72 6d 65 64 20 65 6e 74 72 79  'malformed entry
12920 20 69 6e 20 2d 61 75 74 68 20 66 69 6c 65 27 29   in -auth file')
12930 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12940 65 66 20 56 41 4c 55 45 53 28 31 39 30 2c 27 63  ef VALUES(190,'c
12950 68 64 69 72 28 29 20 66 61 69 6c 65 64 27 29 3b  hdir() failed');
12960 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12970 66 20 56 41 4c 55 45 53 28 32 30 30 2c 27 62 61  f VALUES(200,'ba
12980 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48 54  d protocol in HT
12990 54 50 20 68 65 61 64 65 72 27 29 3b 0a 49 4e 53  TP header');.INS
129a0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
129b0 4c 55 45 53 28 32 31 30 2c 27 45 6d 70 74 79 20  LUES(210,'Empty 
129c0 72 65 71 75 65 73 74 20 55 52 49 27 29 3b 0a 49  request URI');.I
129d0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
129e0 56 41 4c 55 45 53 28 32 32 30 2c 27 55 6e 6b 6e  VALUES(220,'Unkn
129f0 6f 77 6e 20 72 65 71 75 65 73 74 20 6d 65 74 68  own request meth
12a00 6f 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  od');.INSERT INT
12a10 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 33  O xref VALUES(23
12a20 30 2c 27 52 65 66 65 72 72 65 72 20 69 73 20 64  0,'Referrer is d
12a30 65 76 69 64 73 2e 6e 65 74 27 29 3b 0a 49 4e 53  evids.net');.INS
12a40 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12a50 4c 55 45 53 28 32 34 30 2c 27 49 6c 6c 65 67 61  LUES(240,'Illega
12a60 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53  l content in HOS
12a70 54 3a 20 70 61 72 61 6d 65 74 65 72 27 29 3b 0a  T: parameter');.
12a80 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
12a90 20 56 41 4c 55 45 53 28 32 35 30 2c 27 44 69 73   VALUES(250,'Dis
12aa0 61 6c 6c 6f 77 65 64 20 75 73 65 72 20 61 67 65  allowed user age
12ab0 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  nt');.INSERT INT
12ac0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 36  O xref VALUES(26
12ad0 30 2c 27 44 69 73 61 6c 6c 6f 77 65 64 20 72 65  0,'Disallowed re
12ae0 66 65 72 72 65 72 27 29 3b 0a 49 4e 53 45 52 54  ferrer');.INSERT
12af0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
12b00 53 28 32 37 30 2c 27 52 65 71 75 65 73 74 20 74  S(270,'Request t
12b10 6f 6f 20 6c 61 72 67 65 27 29 3b 0a 49 4e 53 45  oo large');.INSE
12b20 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12b30 55 45 53 28 32 38 30 2c 27 6d 6b 73 74 65 6d 70  UES(280,'mkstemp
12b40 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53  () failed');.INS
12b50 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12b60 4c 55 45 53 28 32 39 30 2c 27 63 61 6e 6e 6f 74  LUES(290,'cannot
12b70 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c   create temp fil
12b80 65 20 66 6f 72 20 50 4f 53 54 20 63 6f 6e 74 65  e for POST conte
12b90 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  nt');.INSERT INT
12ba0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 30  O xref VALUES(30
12bb0 30 2c 27 50 61 74 68 20 65 6c 65 6d 65 6e 74 20  0,'Path element 
12bc0 62 65 67 69 6e 73 20 77 69 74 68 20 2e 20 6f 72  begins with . or
12bd0 20 2d 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54   -');.INSERT INT
12be0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 31  O xref VALUES(31
12bf0 30 2c 27 55 52 49 20 64 6f 65 73 20 6e 6f 74 20  0,'URI does not 
12c00 73 74 61 72 74 20 77 69 74 68 20 2f 27 29 3b 0a  start with /');.
12c10 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
12c20 20 56 41 4c 55 45 53 28 33 32 30 2c 27 55 52 49   VALUES(320,'URI
12c30 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e 53   too long');.INS
12c40 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12c50 4c 55 45 53 28 33 33 30 2c 27 4d 69 73 73 69 6e  LUES(330,'Missin
12c60 67 20 48 4f 53 54 3a 20 70 61 72 61 6d 65 74 65  g HOST: paramete
12c70 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  r');.INSERT INTO
12c80 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 34 30   xref VALUES(340
12c90 2c 27 48 4f 53 54 20 70 61 72 61 6d 65 74 65 72  ,'HOST parameter
12ca0 20 74 6f 6f 20 6c 6f 6e 67 27 29 3b 0a 49 4e 53   too long');.INS
12cb0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12cc0 4c 55 45 53 28 33 35 30 2c 27 2a 2e 77 65 62 73  LUES(350,'*.webs
12cd0 69 74 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 27  ite permissions'
12ce0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12cf0 72 65 66 20 56 41 4c 55 45 53 28 33 36 30 2c 27  ref VALUES(360,'
12d00 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 27 29  chdir() failed')
12d10 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12d20 65 66 20 56 41 4c 55 45 53 28 33 37 30 2c 27 72  ef VALUES(370,'r
12d30 65 64 69 72 65 63 74 20 74 6f 20 6e 6f 74 2d 66  edirect to not-f
12d40 6f 75 6e 64 20 70 61 67 65 27 29 3b 0a 49 4e 53  ound page');.INS
12d50 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12d60 4c 55 45 53 28 33 38 30 2c 27 55 52 49 20 6e 6f  LUES(380,'URI no
12d70 74 20 66 6f 75 6e 64 27 29 3b 0a 49 4e 53 45 52  t found');.INSER
12d80 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12d90 45 53 28 33 39 30 2c 27 46 69 6c 65 20 6e 6f 74  ES(390,'File not
12da0 20 72 65 61 64 61 62 6c 65 27 29 3b 0a 49 4e 53   readable');.INS
12db0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12dc0 4c 55 45 53 28 34 30 30 2c 27 55 52 49 20 69 73  LUES(400,'URI is
12dd0 20 61 20 64 69 72 65 63 74 6f 72 79 20 77 2f 6f   a directory w/o
12de0 20 69 6e 64 65 78 2e 68 74 6d 6c 27 29 3b 0a 49   index.html');.I
12df0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
12e00 56 41 4c 55 45 53 28 34 31 30 2c 27 72 65 64 69  VALUES(410,'redi
12e10 72 65 63 74 20 74 6f 20 61 64 64 20 74 72 61 69  rect to add trai
12e20 6c 69 6e 67 20 2f 27 29 3b 0a 49 4e 53 45 52 54  ling /');.INSERT
12e30 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
12e40 53 28 34 32 30 2c 27 63 68 64 69 72 28 29 20 66  S(420,'chdir() f
12e50 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20  ailed');.INSERT 
12e60 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12e70 28 34 33 30 2c 27 64 75 70 28 30 29 20 66 61 69  (430,'dup(0) fai
12e80 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  led');.INSERT IN
12e90 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34  TO xref VALUES(4
12ea0 34 30 2c 27 70 69 70 65 28 29 20 66 61 69 6c 65  40,'pipe() faile
12eb0 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  d');.INSERT INTO
12ec0 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 35 30   xref VALUES(450
12ed0 2c 27 64 75 70 28 31 29 20 66 61 69 6c 65 64 27  ,'dup(1) failed'
12ee0 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12ef0 72 65 66 20 56 41 4c 55 45 53 28 34 36 30 2c 27  ref VALUES(460,'
12f00 45 78 63 65 73 73 20 55 52 49 20 63 6f 6e 74 65  Excess URI conte
12f10 6e 74 20 70 61 73 74 20 73 74 61 74 69 63 20 66  nt past static f
12f20 69 6c 65 20 6e 61 6d 65 27 29 3b 0a 49 4e 53 45  ile name');.INSE
12f30 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12f40 55 45 53 28 34 37 30 2c 27 45 54 61 67 20 43 61  UES(470,'ETag Ca
12f50 63 68 65 20 48 69 74 27 29 3b 0a 49 4e 53 45 52  che Hit');.INSER
12f60 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12f70 45 53 28 34 38 30 2c 27 66 6f 70 65 6e 28 29 20  ES(480,'fopen() 
12f80 66 61 69 6c 65 64 20 66 6f 72 20 73 74 61 74 69  failed for stati
12f90 63 20 63 6f 6e 74 65 6e 74 27 29 3b 0a 49 4e 53  c content');.INS
12fa0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12fb0 4c 55 45 53 28 32 2c 27 4e 6f 72 6d 61 6c 20 48  LUES(2,'Normal H
12fc0 45 41 44 20 72 65 70 6c 79 27 29 3b 0a 49 4e 53  EAD reply');.INS
12fd0 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12fe0 4c 55 45 53 28 30 2c 27 4e 6f 72 6d 61 6c 20 72  LUES(0,'Normal r
12ff0 65 70 6c 79 27 29 3b 0a 49 4e 53 45 52 54 20 49  eply');.INSERT I
13000 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
13010 35 30 30 2c 27 75 6e 6b 6e 6f 77 6e 20 49 50 20  500,'unknown IP 
13020 70 72 6f 74 6f 63 6f 6c 27 29 3b 0a 49 4e 53 45  protocol');.INSE
13030 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
13040 55 45 53 28 35 31 30 2c 27 75 6e 6b 6e 6f 77 6e  UES(510,'unknown
13050 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
13060 67 75 6d 65 6e 74 20 6f 6e 20 6c 61 75 6e 63 68  gument on launch
13070 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
13080 78 72 65 66 20 56 41 4c 55 45 53 28 35 32 30 2c  xref VALUES(520,
13090 27 2d 2d 72 6f 6f 74 20 61 72 67 75 6d 65 6e 74  '--root argument
130a0 20 6d 69 73 73 69 6e 67 27 29 3b 0a 49 4e 53 45   missing');.INSE
130b0 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
130c0 55 45 53 28 35 33 30 2c 27 63 68 64 69 72 28 29  UES(530,'chdir()
130d0 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
130e0 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
130f0 45 53 28 35 34 30 2c 27 63 68 72 6f 6f 74 28 29  ES(540,'chroot()
13100 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
13110 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
13120 45 53 28 35 35 30 2c 27 73 65 72 76 65 72 20 73  ES(550,'server s
13130 74 61 72 74 75 70 20 66 61 69 6c 65 64 27 29 3b  tartup failed');
13140 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
13150 66 20 56 41 4c 55 45 53 28 35 36 30 2c 27 73 65  f VALUES(560,'se
13160 74 67 69 64 28 29 20 66 61 69 6c 65 64 27 29 3b  tgid() failed');
13170 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
13180 66 20 56 41 4c 55 45 53 28 35 37 30 2c 27 73 65  f VALUES(570,'se
13190 74 75 69 64 28 29 20 66 61 69 6c 65 64 27 29 3b  tuid() failed');
131a0 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
131b0 66 20 56 41 4c 55 45 53 28 35 38 30 2c 27 75 6e  f VALUES(580,'un
131c0 6b 6e 6f 77 6e 20 75 73 65 72 27 29 3b 0a 49 4e  known user');.IN
131d0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
131e0 41 4c 55 45 53 28 35 39 30 2c 27 63 61 6e 6e 6f  ALUES(590,'canno
131f0 74 20 72 75 6e 20 61 73 20 72 6f 6f 74 27 29 3b  t run as root');
13200 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
13210 66 20 56 41 4c 55 45 53 28 36 30 30 2c 27 6d 61  f VALUES(600,'ma
13220 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 27 29 3b  lloc() failed');
13230 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
13240 66 20 56 41 4c 55 45 53 28 36 31 30 2c 27 6d 61  f VALUES(610,'ma
13250 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 27 29 3b  lloc() failed');
13260 0a 43 4f 4d 4d 49 54 3b 0a 23 65 6e 64 69 66 20  .COMMIT;.#endif 
13270 2f 2a 20 53 51 4c 20 2a 2f 0a                    /* SQL */.