Documentation Source Text

Hex Artifact Content
Login

Artifact a6af6b4610f8e714b01591f6e992ccd60bc997ff1e8fb9ba747b36319043eb95:


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 22  n(zAuthFile, "r"
6ad0: 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
6ae0: 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 31  {.    NotFound(1
6af0: 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 43 61  50);  /* LOG: Ca
6b00: 6e 6e 6f 74 20 6f 70 65 6e 20 2d 61 75 74 68 20  nnot open -auth 
6b10: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  file */.    retu
6b20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6b30: 7a 41 75 74 68 41 72 67 20 29 20 44 65 63 6f 64  zAuthArg ) Decod
6b40: 65 36 34 28 7a 41 75 74 68 41 72 67 29 3b 0a 20  e64(zAuthArg);. 
6b50: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
6b60: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
6b70: 65 29 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 63  e), in) ){.    c
6b80: 68 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b  har *zFieldName;
6b90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b  .    char *zVal;
6ba0: 0a 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65  ..    zFieldName
6bb0: 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65   = GetFirstEleme
6bc0: 6e 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b  nt(zLine,&zVal);
6bd0: 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e  .    if( zFieldN
6be0: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c  ame==0 || *zFiel
6bf0: 64 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69  dName==0 ) conti
6c00: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  nue;.    if( zFi
6c10: 65 6c 64 4e 61 6d 65 5b 30 5d 3d 3d 27 23 27 20  eldName[0]=='#' 
6c20: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6c30: 52 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 56  RemoveNewline(zV
6c40: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  al);.    if( str
6c50: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 20  cmp(zFieldName, 
6c60: 22 72 65 61 6c 6d 22 29 3d 3d 30 20 29 7b 0a 20  "realm")==0 ){. 
6c70: 20 20 20 20 20 7a 52 65 61 6c 6d 20 3d 20 53 74       zRealm = St
6c80: 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20  rDup(zVal);.    
6c90: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6ca0: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 73 65  (zFieldName,"use
6cb0: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
6cc0: 69 66 28 20 7a 41 75 74 68 41 72 67 3d 3d 30 20  if( zAuthArg==0 
6cd0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6ce0: 20 20 7a 4e 61 6d 65 20 3d 20 47 65 74 46 69 72    zName = GetFir
6cf0: 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c 20  stElement(zVal, 
6d00: 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 4c  &zVal);.      zL
6d10: 6f 67 69 6e 50 73 77 64 20 3d 20 47 65 74 46 69  oginPswd = GetFi
6d20: 72 73 74 45 6c 65 6d 65 6e 74 28 7a 56 61 6c 2c  rstElement(zVal,
6d30: 20 26 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 69   &zVal);.      i
6d40: 66 28 20 7a 4c 6f 67 69 6e 50 73 77 64 3d 3d 30  f( zLoginPswd==0
6d50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6d60: 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 20     if( zAuthArg 
6d70: 26 26 20 73 74 72 63 6d 70 28 7a 41 75 74 68 41  && strcmp(zAuthA
6d80: 72 67 2c 7a 4c 6f 67 69 6e 50 73 77 64 29 3d 3d  rg,zLoginPswd)==
6d90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52 65  0 ){.        zRe
6da0: 6d 6f 74 65 55 73 65 72 20 3d 20 53 74 72 44 75  moteUser = StrDu
6db0: 70 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p(zName);.      
6dc0: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
6dd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
6de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6df0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69  e if( strcmp(zFi
6e00: 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 73 2d 6f  eldName,"https-o
6e10: 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
6e20: 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73 20    if( !useHttps 
6e30: 29 7b 0a 20 20 20 20 20 20 20 20 4e 6f 74 46 6f  ){.        NotFo
6e40: 75 6e 64 28 31 36 30 29 3b 20 20 2f 2a 20 4c 4f  und(160);  /* LO
6e50: 47 3a 20 20 68 74 74 70 20 72 65 71 75 65 73 74  G:  http request
6e60: 20 6f 6e 20 68 74 74 70 73 2d 6f 6e 6c 79 20 70   on https-only p
6e70: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  age */.        f
6e80: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20  close(in);.     
6e90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6ea0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
6eb0: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64  f( strcmp(zField
6ec0: 4e 61 6d 65 2c 22 68 74 74 70 2d 72 65 64 69 72  Name,"http-redir
6ed0: 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ect")==0 ){.    
6ee0: 20 20 69 66 28 20 21 75 73 65 48 74 74 70 73 20    if( !useHttps 
6ef0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 48 74 74 70  ){.        zHttp
6f00: 20 3d 20 22 68 74 74 70 73 22 3b 0a 20 20 20 20   = "https";.    
6f10: 20 20 20 20 52 65 64 69 72 65 63 74 28 7a 53 63      Redirect(zSc
6f20: 72 69 70 74 2c 20 31 2c 20 31 37 30 29 3b 20 2f  ript, 1, 170); /
6f30: 2a 20 4c 4f 47 3a 20 2d 61 75 74 68 20 72 65 64  * LOG: -auth red
6f40: 69 72 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20  irect */.       
6f50: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
6f60: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
6f70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
6f80: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65   if( strcmp(zFie
6f90: 6c 64 4e 61 6d 65 2c 22 61 6e 79 6f 6e 65 22 29  ldName,"anyone")
6fa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 63 6c  ==0 ){.      fcl
6fb0: 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 20 20 72  ose(in);.      r
6fc0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 65 6c  eturn 1;.    }el
6fd0: 73 65 7b 0a 20 20 20 20 20 20 4e 6f 74 46 6f 75  se{.      NotFou
6fe0: 6e 64 28 31 38 30 29 3b 20 20 2f 2a 20 4c 4f 47  nd(180);  /* LOG
6ff0: 3a 20 20 6d 61 6c 66 6f 72 6d 65 64 20 65 6e 74  :  malformed ent
7000: 72 79 20 69 6e 20 2d 61 75 74 68 20 66 69 6c 65  ry in -auth file
7010: 20 2a 2f 0a 20 20 20 20 20 20 66 63 6c 6f 73 65   */.      fclose
7020: 28 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (in);.      retu
7030: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
7040: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
7050: 4e 6f 74 41 75 74 68 6f 72 69 7a 65 64 28 7a 52  NotAuthorized(zR
7060: 65 61 6c 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  ealm);.  return 
7070: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 75 65 73  0;.}../*.** Gues
7080: 73 20 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 20  s the mime-type 
7090: 6f 66 20 61 20 64 6f 63 75 6d 65 6e 74 20 62 61  of a document ba
70a0: 73 65 64 20 6f 6e 20 69 74 73 20 6e 61 6d 65 2e  sed on its name.
70b0: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
70c0: 47 65 74 4d 69 6d 65 54 79 70 65 28 63 6f 6e 73  GetMimeType(cons
70d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
70e0: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 63 6f 6e  nt nName){.  con
70f0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  st char *z;.  in
7100: 74 20 69 3b 0a 20 20 69 6e 74 20 66 69 72 73 74  t i;.  int first
7110: 2c 20 6c 61 73 74 3b 0a 20 20 69 6e 74 20 6c 65  , last;.  int le
7120: 6e 3b 0a 20 20 63 68 61 72 20 7a 53 75 66 66 69  n;.  char zSuffi
7130: 78 5b 32 30 5d 3b 0a 0a 20 20 2f 2a 20 41 20 74  x[20];..  /* A t
7140: 61 62 6c 65 20 6f 66 20 6d 69 6d 65 74 79 70 65  able of mimetype
7150: 73 20 62 61 73 65 64 20 6f 6e 20 66 69 6c 65 20  s based on file 
7160: 73 75 66 66 69 78 65 73 2e 20 0a 20 20 2a 2a 20  suffixes. .  ** 
7170: 53 75 66 66 69 78 65 73 20 6d 75 73 74 20 62 65  Suffixes must be
7180: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
7190: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
71a0: 64 6f 20 61 20 62 69 6e 61 72 79 0a 20 20 2a 2a  do a binary.  **
71b0: 20 73 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20   search to find 
71c0: 74 68 65 20 6d 69 6d 65 2d 74 79 70 65 0a 20 20  the mime-type.  
71d0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
71e0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
71f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66  onst char *zSuff
7200: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ix;       /* The
7210: 20 66 69 6c 65 20 73 75 66 66 69 78 20 2a 2f 0a   file suffix */.
7220: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7240: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
7250: 73 75 66 66 69 78 20 2a 2f 0a 20 20 20 20 63 6f  suffix */.    co
7260: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 69 6d 65 74  nst char *zMimet
7270: 79 70 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ype;     /* The 
7280: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 6d 69  corresponding mi
7290: 6d 65 74 79 70 65 20 2a 2f 0a 20 20 7d 20 61 4d  metype */.  } aM
72a0: 69 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ime[] = {.    { 
72b0: 22 61 69 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "ai",         2,
72c0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 6f   "application/po
72d0: 73 74 73 63 72 69 70 74 22 20 20 20 20 20 20 20  stscript"       
72e0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
72f0: 69 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  if",        3, "
7300: 61 75 64 69 6f 2f 78 2d 61 69 66 66 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66     },.    { "aif
7330: 63 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75  c",       4, "au
7340: 64 69 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20  dio/x-aiff"     
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 7d 2c 0a 20 20 20 20 7b 20 22 61 69 66 66 22   },.    { "aiff"
7370: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 75 64 69  ,       4, "audi
7380: 6f 2f 78 2d 61 69 66 66 22 20 20 20 20 20 20 20  o/x-aiff"       
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
73a0: 2c 0a 20 20 20 20 7b 20 22 61 72 6a 22 2c 20 20  ,.    { "arj",  
73b0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
73c0: 61 74 69 6f 6e 2f 78 2d 61 72 6a 2d 63 6f 6d 70  ation/x-arj-comp
73d0: 72 65 73 73 65 64 22 20 20 20 20 20 20 7d 2c 0a  ressed"      },.
73e0: 20 20 20 20 7b 20 22 61 73 63 22 2c 20 20 20 20      { "asc",    
73f0: 20 20 20 20 33 2c 20 22 74 65 78 74 2f 70 6c 61      3, "text/pla
7400: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
7410: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7420: 20 20 7b 20 22 61 73 66 22 2c 20 20 20 20 20 20    { "asf",      
7430: 20 20 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73    3, "video/x-ms
7440: 2d 61 73 66 22 20 20 20 20 20 20 20 20 20 20 20  -asf"           
7450: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7460: 7b 20 22 61 73 78 22 2c 20 20 20 20 20 20 20 20  { "asx",        
7470: 33 2c 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 61  3, "video/x-ms-a
7480: 73 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20  sx"             
7490: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
74a0: 22 61 75 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "au",         2,
74b0: 20 22 61 75 64 69 6f 2f 75 6c 61 77 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 61       },.    { "a
74e0: 76 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  vi",        3, "
74f0: 76 69 64 65 6f 2f 78 2d 6d 73 76 69 64 65 6f 22  video/x-msvideo"
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 62 61 74     },.    { "bat
7520: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7530: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f  plication/x-msdo
7540: 73 2d 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20  s-program"      
7550: 20 7d 2c 0a 20 20 20 20 7b 20 22 62 63 70 69 6f   },.    { "bcpio
7560: 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70 70 6c  ",      5, "appl
7570: 69 63 61 74 69 6f 6e 2f 78 2d 62 63 70 69 6f 22  ication/x-bcpio"
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7590: 2c 0a 20 20 20 20 7b 20 22 62 69 6e 22 2c 20 20  ,.    { "bin",  
75a0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
75b0: 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65  ation/octet-stre
75c0: 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  am"          },.
75d0: 20 20 20 20 7b 20 22 63 22 2c 20 20 20 20 20 20      { "c",      
75e0: 20 20 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61      1, "text/pla
75f0: 69 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  in"             
7600: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7610: 20 20 7b 20 22 63 63 22 2c 20 20 20 20 20 20 20    { "cc",       
7620: 20 20 32 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    2, "text/plain
7630: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
7640: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7650: 7b 20 22 63 63 61 64 22 2c 20 20 20 20 20 20 20  { "ccad",       
7660: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
7670: 63 6c 61 72 69 73 63 61 64 22 20 20 20 20 20 20  clariscad"      
7680: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7690: 22 63 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "cdf",        3,
76a0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
76b0: 6e 65 74 63 64 66 22 20 20 20 20 20 20 20 20 20  netcdf"         
76c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
76d0: 6c 61 73 73 22 2c 20 20 20 20 20 20 35 2c 20 22  lass",      5, "
76e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6f 63 74 65  application/octe
76f0: 74 2d 73 74 72 65 61 6d 22 20 20 20 20 20 20 20  t-stream"       
7700: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 64     },.    { "cod
7710: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7720: 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e 72 69  plication/vnd.ri
7730: 6d 2e 63 6f 64 22 20 20 20 20 20 20 20 20 20 20  m.cod"          
7740: 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6d 22 2c   },.    { "com",
7750: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
7760: 69 63 61 74 69 6f 6e 2f 78 2d 6d 73 64 6f 73 2d  ication/x-msdos-
7770: 70 72 6f 67 72 61 6d 22 20 20 20 20 20 20 20 7d  program"       }
7780: 2c 0a 20 20 20 20 7b 20 22 63 70 69 6f 22 2c 20  ,.    { "cpio", 
7790: 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63        4, "applic
77a0: 61 74 69 6f 6e 2f 78 2d 63 70 69 6f 22 20 20 20  ation/x-cpio"   
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
77c0: 20 20 20 20 7b 20 22 63 70 74 22 2c 20 20 20 20      { "cpt",    
77d0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
77e0: 69 6f 6e 2f 6d 61 63 2d 63 6f 6d 70 61 63 74 70  ion/mac-compactp
77f0: 72 6f 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ro"        },.  
7800: 20 20 7b 20 22 63 73 68 22 2c 20 20 20 20 20 20    { "csh",      
7810: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
7820: 6e 2f 78 2d 63 73 68 22 20 20 20 20 20 20 20 20  n/x-csh"        
7830: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7840: 7b 20 22 63 73 73 22 2c 20 20 20 20 20 20 20 20  { "css",        
7850: 33 2c 20 22 74 65 78 74 2f 63 73 73 22 20 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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7880: 22 64 63 72 22 2c 20 20 20 20 20 20 20 20 33 2c  "dcr",        3,
7890: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
78a0: 64 69 72 65 63 74 6f 72 22 20 20 20 20 20 20 20  director"       
78b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
78c0: 65 62 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  eb",        3, "
78d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 65  application/x-de
78e0: 62 69 61 6e 2d 70 61 63 6b 61 67 65 22 20 20 20  bian-package"   
78f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72     },.    { "dir
7900: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7910: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65  plication/x-dire
7920: 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20  ctor"           
7930: 20 7d 2c 0a 20 20 20 20 7b 20 22 64 6c 22 2c 20   },.    { "dl", 
7940: 20 20 20 20 20 20 20 20 32 2c 20 22 76 69 64 65          2, "vide
7950: 6f 2f 64 6c 22 20 20 20 20 20 20 20 20 20 20 20  o/dl"           
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7970: 2c 0a 20 20 20 20 7b 20 22 64 6d 73 22 2c 20 20  ,.    { "dms",  
7980: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
7990: 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65  ation/octet-stre
79a0: 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  am"          },.
79b0: 20 20 20 20 7b 20 22 64 6f 63 22 2c 20 20 20 20      { "doc",    
79c0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
79d0: 69 6f 6e 2f 6d 73 77 6f 72 64 22 20 20 20 20 20  ion/msword"     
79e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
79f0: 20 20 7b 20 22 64 72 77 22 2c 20 20 20 20 20 20    { "drw",      
7a00: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
7a10: 6e 2f 64 72 61 66 74 69 6e 67 22 20 20 20 20 20  n/drafting"     
7a20: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7a30: 7b 20 22 64 76 69 22 2c 20 20 20 20 20 20 20 20  { "dvi",        
7a40: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7a50: 78 2d 64 76 69 22 20 20 20 20 20 20 20 20 20 20  x-dvi"          
7a60: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7a70: 22 64 77 67 22 2c 20 20 20 20 20 20 20 20 33 2c  "dwg",        3,
7a80: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 61 63   "application/ac
7a90: 61 64 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ad"             
7aa0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64       },.    { "d
7ab0: 78 66 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  xf",        3, "
7ac0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 78 66 22  application/dxf"
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ae0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 78 72     },.    { "dxr
7af0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
7b00: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 64 69 72 65  plication/x-dire
7b10: 63 74 6f 72 22 20 20 20 20 20 20 20 20 20 20 20  ctor"           
7b20: 20 7d 2c 0a 20 20 20 20 7b 20 22 65 70 73 22 2c   },.    { "eps",
7b30: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
7b40: 69 63 61 74 69 6f 6e 2f 70 6f 73 74 73 63 72 69  ication/postscri
7b50: 70 74 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  pt"            }
7b60: 2c 0a 20 20 20 20 7b 20 22 65 74 78 22 2c 20 20  ,.    { "etx",  
7b70: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 78        3, "text/x
7b80: 2d 73 65 74 65 78 74 22 20 20 20 20 20 20 20 20  -setext"        
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
7ba0: 20 20 20 20 7b 20 22 65 78 65 22 2c 20 20 20 20      { "exe",    
7bb0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
7bc0: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
7bd0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
7be0: 20 20 7b 20 22 65 7a 22 2c 20 20 20 20 20 20 20    { "ez",       
7bf0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
7c00: 6e 2f 61 6e 64 72 65 77 2d 69 6e 73 65 74 22 20  n/andrew-inset" 
7c10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7c20: 7b 20 22 66 22 2c 20 20 20 20 20 20 20 20 20 20  { "f",          
7c30: 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7c60: 22 66 39 30 22 2c 20 20 20 20 20 20 20 20 33 2c  "f90",        3,
7c70: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 66       },.    { "f
7ca0: 6c 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  li",        3, "
7cb0: 76 69 64 65 6f 2f 66 6c 69 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 66 6c 76     },.    { "flv
7ce0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
7cf0: 64 65 6f 2f 66 6c 76 22 20 20 20 20 20 20 20 20  deo/flv"        
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 7d 2c 0a 20 20 20 20 7b 20 22 67 69 66 22 2c   },.    { "gif",
7d20: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
7d30: 65 2f 67 69 66 22 20 20 20 20 20 20 20 20 20 20  e/gif"          
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7d50: 2c 0a 20 20 20 20 7b 20 22 67 6c 22 2c 20 20 20  ,.    { "gl",   
7d60: 20 20 20 20 20 20 32 2c 20 22 76 69 64 65 6f 2f        2, "video/
7d70: 67 6c 22 20 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 7d 2c 0a               },.
7d90: 20 20 20 20 7b 20 22 67 74 61 72 22 2c 20 20 20      { "gtar",   
7da0: 20 20 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74      4, "applicat
7db0: 69 6f 6e 2f 78 2d 67 74 61 72 22 20 20 20 20 20  ion/x-gtar"     
7dc0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7dd0: 20 20 7b 20 22 67 7a 22 2c 20 20 20 20 20 20 20    { "gz",       
7de0: 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    2, "applicatio
7df0: 6e 2f 78 2d 67 7a 69 70 22 20 20 20 20 20 20 20  n/x-gzip"       
7e00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
7e10: 7b 20 22 68 64 66 22 2c 20 20 20 20 20 20 20 20  { "hdf",        
7e20: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
7e30: 78 2d 68 64 66 22 20 20 20 20 20 20 20 20 20 20  x-hdf"          
7e40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
7e50: 22 68 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "hh",         2,
7e60: 20 22 74 65 78 74 2f 70 6c 61 69 6e 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 68       },.    { "h
7e90: 71 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  qx",        3, "
7ea0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 61 63 2d  application/mac-
7eb0: 62 69 6e 68 65 78 34 30 22 20 20 20 20 20 20 20  binhex40"       
7ec0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 68 22 2c     },.    { "h",
7ed0: 20 20 20 20 20 20 20 20 20 20 31 2c 20 22 74 65            1, "te
7ee0: 78 74 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20  xt/plain"       
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 7d 2c 0a 20 20 20 20 7b 20 22 68 74 6d 22 2c   },.    { "htm",
7f10: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
7f20: 2f 68 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75  /html; charset=u
7f30: 74 66 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d  tf-8"          }
7f40: 2c 0a 20 20 20 20 7b 20 22 68 74 6d 6c 22 2c 20  ,.    { "html", 
7f50: 20 20 20 20 20 20 34 2c 20 22 74 65 78 74 2f 68        4, "text/h
7f60: 74 6d 6c 3b 20 63 68 61 72 73 65 74 3d 75 74 66  tml; charset=utf
7f70: 2d 38 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  -8"          },.
7f80: 20 20 20 20 7b 20 22 69 63 65 22 2c 20 20 20 20      { "ice",    
7f90: 20 20 20 20 33 2c 20 22 78 2d 63 6f 6e 66 65 72      3, "x-confer
7fa0: 65 6e 63 65 2f 78 2d 63 6f 6f 6c 74 61 6c 6b 22  ence/x-cooltalk"
7fb0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
7fc0: 20 20 7b 20 22 69 65 66 22 2c 20 20 20 20 20 20    { "ief",      
7fd0: 20 20 33 2c 20 22 69 6d 61 67 65 2f 69 65 66 22    3, "image/ief"
7fe0: 20 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 7d 2c 0a 20 20 20 20           },.    
8000: 7b 20 22 69 67 65 73 22 2c 20 20 20 20 20 20 20  { "iges",       
8010: 34 2c 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8040: 22 69 67 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "igs",        3,
8050: 20 22 6d 6f 64 65 6c 2f 69 67 65 73 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 69       },.    { "i
8080: 70 73 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ps",        3, "
8090: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70  application/x-ip
80a0: 73 63 72 69 70 74 22 20 20 20 20 20 20 20 20 20  script"         
80b0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 70 78     },.    { "ipx
80c0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
80d0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 69 70 69 78  plication/x-ipix
80e0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
80f0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 61 64 22 2c   },.    { "jad",
8100: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
8110: 2f 76 6e 64 2e 73 75 6e 2e 6a 32 6d 65 2e 61 70  /vnd.sun.j2me.ap
8120: 70 2d 64 65 73 63 72 69 70 74 6f 72 22 20 20 7d  p-descriptor"  }
8130: 2c 0a 20 20 20 20 7b 20 22 6a 61 72 22 2c 20 20  ,.    { "jar",  
8140: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8150: 61 74 69 6f 6e 2f 6a 61 76 61 2d 61 72 63 68 69  ation/java-archi
8160: 76 65 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ve"          },.
8170: 20 20 20 20 7b 20 22 6a 70 65 67 22 2c 20 20 20      { "jpeg",   
8180: 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 6a 70      4, "image/jp
8190: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
81a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
81b0: 20 20 7b 20 22 6a 70 65 22 2c 20 20 20 20 20 20    { "jpe",      
81c0: 20 20 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67    3, "image/jpeg
81d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
81e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
81f0: 7b 20 22 6a 70 67 22 2c 20 20 20 20 20 20 20 20  { "jpg",        
8200: 33 2c 20 22 69 6d 61 67 65 2f 6a 70 65 67 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8230: 22 6a 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "js",         2,
8240: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8250: 6a 61 76 61 73 63 72 69 70 74 22 20 20 20 20 20  javascript"     
8260: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6b       },.    { "k
8270: 61 72 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ar",        3, "
8280: 61 75 64 69 6f 2f 6d 69 64 69 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 6c 61 74     },.    { "lat
82b0: 65 78 22 2c 20 20 20 20 20 20 35 2c 20 22 61 70  ex",      5, "ap
82c0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6c 61 74 65  plication/x-late
82d0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
82e0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 68 61 22 2c   },.    { "lha",
82f0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8300: 69 63 61 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74  ication/octet-st
8310: 72 65 61 6d 22 20 20 20 20 20 20 20 20 20 20 7d  ream"          }
8320: 2c 0a 20 20 20 20 7b 20 22 6c 73 70 22 2c 20 20  ,.    { "lsp",  
8330: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8340: 61 74 69 6f 6e 2f 78 2d 6c 69 73 70 22 20 20 20  ation/x-lisp"   
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8360: 20 20 20 20 7b 20 22 6c 7a 68 22 2c 20 20 20 20      { "lzh",    
8370: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8380: 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61 6d  ion/octet-stream
8390: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
83a0: 20 20 7b 20 22 6d 22 2c 20 20 20 20 20 20 20 20    { "m",        
83b0: 20 20 31 2c 20 22 74 65 78 74 2f 70 6c 61 69 6e    1, "text/plain
83c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
83d0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
83e0: 7b 20 22 6d 33 75 22 2c 20 20 20 20 20 20 20 20  { "m3u",        
83f0: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 70 65 67  3, "audio/x-mpeg
8400: 75 72 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  url"            
8410: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8420: 22 6d 61 6e 22 2c 20 20 20 20 20 20 20 20 33 2c  "man",        3,
8430: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8440: 74 72 6f 66 66 2d 6d 61 6e 22 20 20 20 20 20 20  troff-man"      
8450: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
8460: 65 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  e",         2, "
8470: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 72  application/x-tr
8480: 6f 66 66 2d 6d 65 22 20 20 20 20 20 20 20 20 20  off-me"         
8490: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 65 73     },.    { "mes
84a0: 68 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f  h",       4, "mo
84b0: 64 65 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20  del/mesh"       
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 69 64 22 2c   },.    { "mid",
84e0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
84f0: 6f 2f 6d 69 64 69 22 20 20 20 20 20 20 20 20 20  o/midi"         
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8510: 2c 0a 20 20 20 20 7b 20 22 6d 69 64 69 22 2c 20  ,.    { "midi", 
8520: 20 20 20 20 20 20 34 2c 20 22 61 75 64 69 6f 2f        4, "audio/
8530: 6d 69 64 69 22 20 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 7d 2c 0a               },.
8550: 20 20 20 20 7b 20 22 6d 69 66 22 2c 20 20 20 20      { "mif",    
8560: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8570: 69 6f 6e 2f 78 2d 6d 69 66 22 20 20 20 20 20 20  ion/x-mif"      
8580: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8590: 20 20 7b 20 22 6d 69 6d 65 22 2c 20 20 20 20 20    { "mime",     
85a0: 20 20 34 2c 20 22 77 77 77 2f 6d 69 6d 65 22 20    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 7d 2c 0a 20 20 20 20           },.    
85d0: 7b 20 22 6d 6f 76 69 65 22 2c 20 20 20 20 20 20  { "movie",      
85e0: 35 2c 20 22 76 69 64 65 6f 2f 78 2d 73 67 69 2d  5, "video/x-sgi-
85f0: 6d 6f 76 69 65 22 20 20 20 20 20 20 20 20 20 20  movie"          
8600: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8610: 22 6d 6f 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "mov",        3,
8620: 20 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d   "video/quicktim
8630: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e"              
8640: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
8650: 70 32 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  p2",        3, "
8660: 61 75 64 69 6f 2f 6d 70 65 67 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 32     },.    { "mp2
8690: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 76 69  ",        3, "vi
86a0: 64 65 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20  deo/mpeg"       
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6d 70 33 22 2c   },.    { "mp3",
86d0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
86e0: 6f 2f 6d 70 65 67 22 20 20 20 20 20 20 20 20 20  o/mpeg"         
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8700: 2c 0a 20 20 20 20 7b 20 22 6d 70 65 67 22 2c 20  ,.    { "mpeg", 
8710: 20 20 20 20 20 20 34 2c 20 22 76 69 64 65 6f 2f        4, "video/
8720: 6d 70 65 67 22 20 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 7d 2c 0a               },.
8740: 20 20 20 20 7b 20 22 6d 70 65 22 2c 20 20 20 20      { "mpe",    
8750: 20 20 20 20 33 2c 20 22 76 69 64 65 6f 2f 6d 70      3, "video/mp
8760: 65 67 22 20 20 20 20 20 20 20 20 20 20 20 20 20  eg"             
8770: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8780: 20 20 7b 20 22 6d 70 67 61 22 2c 20 20 20 20 20    { "mpga",     
8790: 20 20 34 2c 20 22 61 75 64 69 6f 2f 6d 70 65 67    4, "audio/mpeg
87a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
87b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
87c0: 7b 20 22 6d 70 67 22 2c 20 20 20 20 20 20 20 20  { "mpg",        
87d0: 33 2c 20 22 76 69 64 65 6f 2f 6d 70 65 67 22 20  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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8800: 22 6d 73 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "ms",         2,
8810: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8820: 74 72 6f 66 66 2d 6d 73 22 20 20 20 20 20 20 20  troff-ms"       
8830: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6d       },.    { "m
8840: 73 68 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  sh",        3, "
8850: 6d 6f 64 65 6c 2f 6d 65 73 68 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 6e 63 22     },.    { "nc"
8880: 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22 61 70  ,         2, "ap
8890: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 6e 65 74 63  plication/x-netc
88a0: 64 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  df"             
88b0: 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 64 61 22 2c   },.    { "oda",
88c0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
88d0: 69 63 61 74 69 6f 6e 2f 6f 64 61 22 20 20 20 20  ication/oda"    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
88f0: 2c 0a 20 20 20 20 7b 20 22 6f 67 67 22 2c 20 20  ,.    { "ogg",  
8900: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8910: 61 74 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20  ation/ogg"      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8930: 20 20 20 20 7b 20 22 6f 67 6d 22 2c 20 20 20 20      { "ogm",    
8940: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8950: 69 6f 6e 2f 6f 67 67 22 20 20 20 20 20 20 20 20  ion/ogg"        
8960: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8970: 20 20 7b 20 22 70 62 6d 22 2c 20 20 20 20 20 20    { "pbm",      
8980: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f    3, "image/x-po
8990: 72 74 61 62 6c 65 2d 62 69 74 6d 61 70 22 20 20  rtable-bitmap"  
89a0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
89b0: 7b 20 22 70 64 62 22 2c 20 20 20 20 20 20 20 20  { "pdb",        
89c0: 33 2c 20 22 63 68 65 6d 69 63 61 6c 2f 78 2d 70  3, "chemical/x-p
89d0: 64 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20  db"             
89e0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
89f0: 22 70 64 66 22 2c 20 20 20 20 20 20 20 20 33 2c  "pdf",        3,
8a00: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 70 64   "application/pd
8a10: 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f"              
8a20: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
8a30: 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  gm",        3, "
8a40: 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65  image/x-portable
8a50: 2d 67 72 61 79 6d 61 70 22 20 20 20 20 20 20 20  -graymap"       
8a60: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 6e     },.    { "pgn
8a70: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8a80: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 63 68 65 73  plication/x-ches
8a90: 73 2d 70 67 6e 22 20 20 20 20 20 20 20 20 20 20  s-pgn"          
8aa0: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 67 70 22 2c   },.    { "pgp",
8ab0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8ac0: 69 63 61 74 69 6f 6e 2f 70 67 70 22 20 20 20 20  ication/pgp"    
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8ae0: 2c 0a 20 20 20 20 7b 20 22 70 6c 22 2c 20 20 20  ,.    { "pl",   
8af0: 20 20 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63        2, "applic
8b00: 61 74 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20  ation/x-perl"   
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8b20: 20 20 20 20 7b 20 22 70 6d 22 2c 20 20 20 20 20      { "pm",     
8b30: 20 20 20 20 32 2c 20 22 61 70 70 6c 69 63 61 74      2, "applicat
8b40: 69 6f 6e 2f 78 2d 70 65 72 6c 22 20 20 20 20 20  ion/x-perl"     
8b50: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8b60: 20 20 7b 20 22 70 6e 67 22 2c 20 20 20 20 20 20    { "png",      
8b70: 20 20 33 2c 20 22 69 6d 61 67 65 2f 70 6e 67 22    3, "image/png"
8b80: 20 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 7d 2c 0a 20 20 20 20           },.    
8ba0: 7b 20 22 70 6e 6d 22 2c 20 20 20 20 20 20 20 20  { "pnm",        
8bb0: 33 2c 20 22 69 6d 61 67 65 2f 78 2d 70 6f 72 74  3, "image/x-port
8bc0: 61 62 6c 65 2d 61 6e 79 6d 61 70 22 20 20 20 20  able-anymap"    
8bd0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8be0: 22 70 6f 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "pot",        3,
8bf0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6d 73   "application/ms
8c00: 70 6f 77 65 72 70 6f 69 6e 74 22 20 20 20 20 20  powerpoint"     
8c10: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
8c20: 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pm",        3, "
8c30: 69 6d 61 67 65 2f 78 2d 70 6f 72 74 61 62 6c 65  image/x-portable
8c40: 2d 70 69 78 6d 61 70 22 20 20 20 20 20 20 20 20  -pixmap"        
8c50: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 73     },.    { "pps
8c60: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
8c70: 70 6c 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65  plication/mspowe
8c80: 72 70 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20  rpoint"         
8c90: 20 7d 2c 0a 20 20 20 20 7b 20 22 70 70 74 22 2c   },.    { "ppt",
8ca0: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8cb0: 69 63 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70  ication/mspowerp
8cc0: 6f 69 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d  oint"          }
8cd0: 2c 0a 20 20 20 20 7b 20 22 70 70 7a 22 2c 20 20  ,.    { "ppz",  
8ce0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
8cf0: 61 74 69 6f 6e 2f 6d 73 70 6f 77 65 72 70 6f 69  ation/mspowerpoi
8d00: 6e 74 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  nt"          },.
8d10: 20 20 20 20 7b 20 22 70 72 65 22 2c 20 20 20 20      { "pre",    
8d20: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
8d30: 69 6f 6e 2f 78 2d 66 72 65 65 6c 61 6e 63 65 22  ion/x-freelance"
8d40: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8d50: 20 20 7b 20 22 70 72 74 22 2c 20 20 20 20 20 20    { "prt",      
8d60: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
8d70: 6e 2f 70 72 6f 5f 65 6e 67 22 20 20 20 20 20 20  n/pro_eng"      
8d80: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8d90: 7b 20 22 70 73 22 2c 20 20 20 20 20 20 20 20 20  { "ps",         
8da0: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
8db0: 70 6f 73 74 73 63 72 69 70 74 22 20 20 20 20 20  postscript"     
8dc0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8dd0: 22 71 74 22 2c 20 20 20 20 20 20 20 20 20 32 2c  "qt",         2,
8de0: 20 22 76 69 64 65 6f 2f 71 75 69 63 6b 74 69 6d   "video/quicktim
8df0: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e"              
8e00: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
8e10: 61 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  a",         2, "
8e20: 61 75 64 69 6f 2f 78 2d 72 65 61 6c 61 75 64 69  audio/x-realaudi
8e30: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
8e40: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 6d     },.    { "ram
8e50: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 75  ",        3, "au
8e60: 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61 75 64  dio/x-pn-realaud
8e70: 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20  io"             
8e80: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 61 72 22 2c   },.    { "rar",
8e90: 20 20 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c          3, "appl
8ea0: 69 63 61 74 69 6f 6e 2f 78 2d 72 61 72 2d 63 6f  ication/x-rar-co
8eb0: 6d 70 72 65 73 73 65 64 22 20 20 20 20 20 20 7d  mpressed"      }
8ec0: 2c 0a 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20  ,.    { "ras",  
8ed0: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
8ee0: 63 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20  cmu-raster"     
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
8f00: 20 20 20 20 7b 20 22 72 61 73 22 2c 20 20 20 20      { "ras",    
8f10: 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d      3, "image/x-
8f20: 63 6d 75 2d 72 61 73 74 65 72 22 20 20 20 20 20  cmu-raster"     
8f30: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
8f40: 20 20 7b 20 22 72 67 62 22 2c 20 20 20 20 20 20    { "rgb",      
8f50: 20 20 33 2c 20 22 69 6d 61 67 65 2f 78 2d 72 67    3, "image/x-rg
8f60: 62 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b"              
8f70: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
8f80: 7b 20 22 72 6d 22 2c 20 20 20 20 20 20 20 20 20  { "rm",         
8f90: 32 2c 20 22 61 75 64 69 6f 2f 78 2d 70 6e 2d 72  2, "audio/x-pn-r
8fa0: 65 61 6c 61 75 64 69 6f 22 20 20 20 20 20 20 20  ealaudio"       
8fb0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
8fc0: 22 72 6f 66 66 22 2c 20 20 20 20 20 20 20 34 2c  "roff",       4,
8fd0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
8fe0: 74 72 6f 66 66 22 20 20 20 20 20 20 20 20 20 20  troff"          
8ff0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72       },.    { "r
9000: 70 6d 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  pm",        3, "
9010: 61 75 64 69 6f 2f 78 2d 70 6e 2d 72 65 61 6c 61  audio/x-pn-reala
9020: 75 64 69 6f 2d 70 6c 75 67 69 6e 22 20 20 20 20  udio-plugin"    
9030: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66     },.    { "rtf
9040: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 61 70  ",        3, "ap
9050: 70 6c 69 63 61 74 69 6f 6e 2f 72 74 66 22 20 20  plication/rtf"  
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 7d 2c 0a 20 20 20 20 7b 20 22 72 74 66 22 2c   },.    { "rtf",
9080: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
9090: 2f 72 74 66 22 20 20 20 20 20 20 20 20 20 20 20  /rtf"           
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
90b0: 2c 0a 20 20 20 20 7b 20 22 72 74 78 22 2c 20 20  ,.    { "rtx",  
90c0: 20 20 20 20 20 20 33 2c 20 22 74 65 78 74 2f 72        3, "text/r
90d0: 69 63 68 74 65 78 74 22 20 20 20 20 20 20 20 20  ichtext"        
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
90f0: 20 20 20 20 7b 20 22 73 63 6d 22 2c 20 20 20 20      { "scm",    
9100: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9110: 69 6f 6e 2f 78 2d 6c 6f 74 75 73 73 63 72 65 65  ion/x-lotusscree
9120: 6e 63 61 6d 22 20 20 20 20 20 20 7d 2c 0a 20 20  ncam"      },.  
9130: 20 20 7b 20 22 73 65 74 22 2c 20 20 20 20 20 20    { "set",      
9140: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9150: 6e 2f 73 65 74 22 20 20 20 20 20 20 20 20 20 20  n/set"          
9160: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9170: 7b 20 22 73 67 6d 6c 22 2c 20 20 20 20 20 20 20  { "sgml",       
9180: 34 2c 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 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 7d 2c 0a 20 20 20 20 7b 20         },.    { 
91b0: 22 73 67 6d 22 2c 20 20 20 20 20 20 20 20 33 2c  "sgm",        3,
91c0: 20 22 74 65 78 74 2f 73 67 6d 6c 22 20 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 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
91f0: 68 22 2c 20 20 20 20 20 20 20 20 20 32 2c 20 22  h",         2, "
9200: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68  application/x-sh
9210: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9220: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 68 61     },.    { "sha
9230: 72 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  r",       4, "ap
9240: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 68 61 72  plication/x-shar
9250: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9260: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 69 6c 6f 22   },.    { "silo"
9270: 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f 64 65  ,       4, "mode
9280: 6c 2f 6d 65 73 68 22 20 20 20 20 20 20 20 20 20  l/mesh"         
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
92a0: 2c 0a 20 20 20 20 7b 20 22 73 69 74 22 2c 20 20  ,.    { "sit",  
92b0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
92c0: 61 74 69 6f 6e 2f 78 2d 73 74 75 66 66 69 74 22  ation/x-stuffit"
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
92e0: 20 20 20 20 7b 20 22 73 6b 64 22 2c 20 20 20 20      { "skd",    
92f0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9300: 69 6f 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20  ion/x-koan"     
9310: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9320: 20 20 7b 20 22 73 6b 6d 22 2c 20 20 20 20 20 20    { "skm",      
9330: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9340: 6e 2f 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20  n/x-koan"       
9350: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9360: 7b 20 22 73 6b 70 22 2c 20 20 20 20 20 20 20 20  { "skp",        
9370: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9380: 78 2d 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20  x-koan"         
9390: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
93a0: 22 73 6b 74 22 2c 20 20 20 20 20 20 20 20 33 2c  "skt",        3,
93b0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
93c0: 6b 6f 61 6e 22 20 20 20 20 20 20 20 20 20 20 20  koan"           
93d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
93e0: 6d 69 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  mi",        3, "
93f0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c  application/smil
9400: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9410: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 69     },.    { "smi
9420: 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  l",       4, "ap
9430: 70 6c 69 63 61 74 69 6f 6e 2f 73 6d 69 6c 22 20  plication/smil" 
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6e 64 22 2c   },.    { "snd",
9460: 20 20 20 20 20 20 20 20 33 2c 20 22 61 75 64 69          3, "audi
9470: 6f 2f 62 61 73 69 63 22 20 20 20 20 20 20 20 20  o/basic"        
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9490: 2c 0a 20 20 20 20 7b 20 22 73 6f 6c 22 2c 20 20  ,.    { "sol",  
94a0: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
94b0: 61 74 69 6f 6e 2f 73 6f 6c 69 64 73 22 20 20 20  ation/solids"   
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
94d0: 20 20 20 20 7b 20 22 73 70 6c 22 2c 20 20 20 20      { "spl",    
94e0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
94f0: 69 6f 6e 2f 78 2d 66 75 74 75 72 65 73 70 6c 61  ion/x-futurespla
9500: 73 68 22 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  sh"        },.  
9510: 20 20 7b 20 22 73 72 63 22 2c 20 20 20 20 20 20    { "src",      
9520: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9530: 6e 2f 78 2d 77 61 69 73 2d 73 6f 75 72 63 65 22  n/x-wais-source"
9540: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9550: 7b 20 22 73 74 65 70 22 2c 20 20 20 20 20 20 20  { "step",       
9560: 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  4, "application/
9570: 53 54 45 50 22 20 20 20 20 20 20 20 20 20 20 20  STEP"           
9580: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9590: 22 73 74 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "stl",        3,
95a0: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 4c   "application/SL
95b0: 41 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A"              
95c0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
95d0: 74 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  tp",        3, "
95e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 53 54 45 50  application/STEP
95f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9600: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34     },.    { "sv4
9610: 63 70 69 6f 22 2c 20 20 20 20 37 2c 20 22 61 70  cpio",    7, "ap
9620: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63  plication/x-sv4c
9630: 70 69 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  pio"            
9640: 20 7d 2c 0a 20 20 20 20 7b 20 22 73 76 34 63 72   },.    { "sv4cr
9650: 63 22 2c 20 20 20 20 20 36 2c 20 22 61 70 70 6c  c",     6, "appl
9660: 69 63 61 74 69 6f 6e 2f 78 2d 73 76 34 63 72 63  ication/x-sv4crc
9670: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  "              }
9680: 2c 0a 20 20 20 20 7b 20 22 73 76 67 22 2c 20 20  ,.    { "svg",  
9690: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
96a0: 73 76 67 2b 78 6d 6c 22 20 20 20 20 20 20 20 20  svg+xml"        
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
96c0: 20 20 20 20 7b 20 22 73 77 66 22 2c 20 20 20 20      { "swf",    
96d0: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
96e0: 69 6f 6e 2f 78 2d 73 68 6f 63 6b 77 61 76 65 2d  ion/x-shockwave-
96f0: 66 6c 61 73 68 22 20 20 20 20 20 7d 2c 0a 20 20  flash"     },.  
9700: 20 20 7b 20 22 74 22 2c 20 20 20 20 20 20 20 20    { "t",        
9710: 20 20 31 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    1, "applicatio
9720: 6e 2f 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20  n/x-troff"      
9730: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9740: 7b 20 22 74 61 72 22 2c 20 20 20 20 20 20 20 20  { "tar",        
9750: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9760: 78 2d 74 61 72 22 20 20 20 20 20 20 20 20 20 20  x-tar"          
9770: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9780: 22 74 63 6c 22 2c 20 20 20 20 20 20 20 20 33 2c  "tcl",        3,
9790: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d   "application/x-
97a0: 74 63 6c 22 20 20 20 20 20 20 20 20 20 20 20 20  tcl"            
97b0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
97c0: 65 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  ex",        3, "
97d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65  application/x-te
97e0: 78 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x"              
97f0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78     },.    { "tex
9800: 69 22 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70  i",       4, "ap
9810: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69  plication/x-texi
9820: 6e 66 6f 22 20 20 20 20 20 20 20 20 20 20 20 20  nfo"            
9830: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 65 78 69 6e   },.    { "texin
9840: 66 6f 22 2c 20 20 20 20 37 2c 20 22 61 70 70 6c  fo",    7, "appl
9850: 69 63 61 74 69 6f 6e 2f 78 2d 74 65 78 69 6e 66  ication/x-texinf
9860: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  o"             }
9870: 2c 0a 20 20 20 20 7b 20 22 74 67 7a 22 2c 20 20  ,.    { "tgz",  
9880: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9890: 61 74 69 6f 6e 2f 78 2d 74 61 72 2d 67 7a 22 20  ation/x-tar-gz" 
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
98b0: 20 20 20 20 7b 20 22 74 69 66 66 22 2c 20 20 20      { "tiff",   
98c0: 20 20 20 20 34 2c 20 22 69 6d 61 67 65 2f 74 69      4, "image/ti
98d0: 66 66 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ff"             
98e0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
98f0: 20 20 7b 20 22 74 69 66 22 2c 20 20 20 20 20 20    { "tif",      
9900: 20 20 33 2c 20 22 69 6d 61 67 65 2f 74 69 66 66    3, "image/tiff
9910: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9920: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9930: 7b 20 22 74 72 22 2c 20 20 20 20 20 20 20 20 20  { "tr",         
9940: 32 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  2, "application/
9950: 78 2d 74 72 6f 66 66 22 20 20 20 20 20 20 20 20  x-troff"        
9960: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9970: 22 74 73 69 22 2c 20 20 20 20 20 20 20 20 33 2c  "tsi",        3,
9980: 20 22 61 75 64 69 6f 2f 54 53 50 2d 61 75 64 69   "audio/TSP-audi
9990: 6f 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o"              
99a0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74       },.    { "t
99b0: 73 70 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  sp",        3, "
99c0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 64 73 70 74  application/dspt
99d0: 79 70 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ype"            
99e0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 73 76     },.    { "tsv
99f0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
9a00: 78 74 2f 74 61 62 2d 73 65 70 61 72 61 74 65 64  xt/tab-separated
9a10: 2d 76 61 6c 75 65 73 22 20 20 20 20 20 20 20 20  -values"        
9a20: 20 7d 2c 0a 20 20 20 20 7b 20 22 74 78 74 22 2c   },.    { "txt",
9a30: 20 20 20 20 20 20 20 20 33 2c 20 22 74 65 78 74          3, "text
9a40: 2f 70 6c 61 69 6e 22 20 20 20 20 20 20 20 20 20  /plain"         
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9a60: 2c 0a 20 20 20 20 7b 20 22 75 6e 76 22 2c 20 20  ,.    { "unv",  
9a70: 20 20 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63        3, "applic
9a80: 61 74 69 6f 6e 2f 69 2d 64 65 61 73 22 20 20 20  ation/i-deas"   
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9aa0: 20 20 20 20 7b 20 22 75 73 74 61 72 22 2c 20 20      { "ustar",  
9ab0: 20 20 20 20 35 2c 20 22 61 70 70 6c 69 63 61 74      5, "applicat
9ac0: 69 6f 6e 2f 78 2d 75 73 74 61 72 22 20 20 20 20  ion/x-ustar"    
9ad0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9ae0: 20 20 7b 20 22 76 63 64 22 2c 20 20 20 20 20 20    { "vcd",      
9af0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9b00: 6e 2f 78 2d 63 64 6c 69 6e 6b 22 20 20 20 20 20  n/x-cdlink"     
9b10: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9b20: 7b 20 22 76 64 61 22 2c 20 20 20 20 20 20 20 20  { "vda",        
9b30: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9b40: 76 64 61 22 20 20 20 20 20 20 20 20 20 20 20 20  vda"            
9b50: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9b60: 22 76 69 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "viv",        3,
9b70: 20 22 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f   "video/vnd.vivo
9b80: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9b90: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76       },.    { "v
9ba0: 69 76 6f 22 2c 20 20 20 20 20 20 20 34 2c 20 22  ivo",       4, "
9bb0: 76 69 64 65 6f 2f 76 6e 64 2e 76 69 76 6f 22 20  video/vnd.vivo" 
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bd0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 76 72 6d     },.    { "vrm
9be0: 6c 22 2c 20 20 20 20 20 20 20 34 2c 20 22 6d 6f  l",       4, "mo
9bf0: 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20 20  del/vrml"       
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 7d 2c 0a 20 20 20 20 7b 20 22 76 73 69 78 22   },.    { "vsix"
9c20: 2c 20 20 20 20 20 20 20 34 2c 20 22 61 70 70 6c  ,       4, "appl
9c30: 69 63 61 74 69 6f 6e 2f 76 73 69 78 22 20 20 20  ication/vsix"   
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9c50: 2c 0a 20 20 20 20 7b 20 22 77 61 76 22 2c 20 20  ,.    { "wav",  
9c60: 20 20 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f        3, "audio/
9c70: 78 2d 77 61 76 22 20 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 7d 2c 0a               },.
9c90: 20 20 20 20 7b 20 22 77 61 78 22 2c 20 20 20 20      { "wax",    
9ca0: 20 20 20 20 33 2c 20 22 61 75 64 69 6f 2f 78 2d      3, "audio/x-
9cb0: 6d 73 2d 77 61 78 22 20 20 20 20 20 20 20 20 20  ms-wax"         
9cc0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
9cd0: 20 20 7b 20 22 77 69 6b 69 22 2c 20 20 20 20 20    { "wiki",     
9ce0: 20 20 34 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    4, "applicatio
9cf0: 6e 2f 78 2d 66 6f 73 73 69 6c 2d 77 69 6b 69 22  n/x-fossil-wiki"
9d00: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9d10: 7b 20 22 77 6d 61 22 2c 20 20 20 20 20 20 20 20  { "wma",        
9d20: 33 2c 20 22 61 75 64 69 6f 2f 78 2d 6d 73 2d 77  3, "audio/x-ms-w
9d30: 6d 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20  ma"             
9d40: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9d50: 22 77 6d 76 22 2c 20 20 20 20 20 20 20 20 33 2c  "wmv",        3,
9d60: 20 22 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 76   "video/x-ms-wmv
9d70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9d80: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
9d90: 6d 78 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  mx",        3, "
9da0: 76 69 64 65 6f 2f 78 2d 6d 73 2d 77 6d 78 22 20  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 7d 2c 0a 20 20 20 20 7b 20 22 77 72 6c     },.    { "wrl
9dd0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 6d 6f  ",        3, "mo
9de0: 64 65 6c 2f 76 72 6d 6c 22 20 20 20 20 20 20 20  del/vrml"       
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 7d 2c 0a 20 20 20 20 7b 20 22 77 76 78 22 2c   },.    { "wvx",
9e10: 20 20 20 20 20 20 20 20 33 2c 20 22 76 69 64 65          3, "vide
9e20: 6f 2f 78 2d 6d 73 2d 77 76 78 22 20 20 20 20 20  o/x-ms-wvx"     
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9e40: 2c 0a 20 20 20 20 7b 20 22 78 62 6d 22 2c 20 20  ,.    { "xbm",  
9e50: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
9e60: 78 2d 78 62 69 74 6d 61 70 22 20 20 20 20 20 20  x-xbitmap"      
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
9e80: 20 20 20 20 7b 20 22 78 6c 63 22 2c 20 20 20 20      { "xlc",    
9e90: 20 20 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74      3, "applicat
9ea0: 69 6f 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c  ion/vnd.ms-excel
9eb0: 22 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  "          },.  
9ec0: 20 20 7b 20 22 78 6c 6c 22 2c 20 20 20 20 20 20    { "xll",      
9ed0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
9ee0: 6e 2f 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20  n/vnd.ms-excel" 
9ef0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
9f00: 7b 20 22 78 6c 6d 22 2c 20 20 20 20 20 20 20 20  { "xlm",        
9f10: 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f  3, "application/
9f20: 76 6e 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20  vnd.ms-excel"   
9f30: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
9f40: 22 78 6c 73 22 2c 20 20 20 20 20 20 20 20 33 2c  "xls",        3,
9f50: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e   "application/vn
9f60: 64 2e 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20  d.ms-excel"     
9f70: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78       },.    { "x
9f80: 6c 77 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22  lw",        3, "
9f90: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 76 6e 64 2e  application/vnd.
9fa0: 6d 73 2d 65 78 63 65 6c 22 20 20 20 20 20 20 20  ms-excel"       
9fb0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 78 6d 6c     },.    { "xml
9fc0: 22 2c 20 20 20 20 20 20 20 20 33 2c 20 22 74 65  ",        3, "te
9fd0: 78 74 2f 78 6d 6c 22 20 20 20 20 20 20 20 20 20  xt/xml"         
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 7d 2c 0a 20 20 20 20 7b 20 22 78 70 6d 22 2c   },.    { "xpm",
a000: 20 20 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67          3, "imag
a010: 65 2f 78 2d 78 70 69 78 6d 61 70 22 20 20 20 20  e/x-xpixmap"    
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
a030: 2c 0a 20 20 20 20 7b 20 22 78 77 64 22 2c 20 20  ,.    { "xwd",  
a040: 20 20 20 20 20 20 33 2c 20 22 69 6d 61 67 65 2f        3, "image/
a050: 78 2d 78 77 69 6e 64 6f 77 64 75 6d 70 22 20 20  x-xwindowdump"  
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
a070: 20 20 20 20 7b 20 22 78 79 7a 22 2c 20 20 20 20      { "xyz",    
a080: 20 20 20 20 33 2c 20 22 63 68 65 6d 69 63 61 6c      3, "chemical
a090: 2f 78 2d 70 64 62 22 20 20 20 20 20 20 20 20 20  /x-pdb"         
a0a0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
a0b0: 20 20 7b 20 22 7a 69 70 22 2c 20 20 20 20 20 20    { "zip",      
a0c0: 20 20 33 2c 20 22 61 70 70 6c 69 63 61 74 69 6f    3, "applicatio
a0d0: 6e 2f 7a 69 70 22 20 20 20 20 20 20 20 20 20 20  n/zip"          
a0e0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
a0f0: 0a 0a 20 20 66 6f 72 28 69 3d 6e 4e 61 6d 65 2d  ..  for(i=nName-
a100: 31 3b 20 69 3e 30 20 26 26 20 7a 4e 61 6d 65 5b  1; i>0 && zName[
a110: 69 5d 21 3d 27 2e 27 3b 20 69 2d 2d 29 7b 7d 0a  i]!='.'; i--){}.
a120: 20 20 7a 20 3d 20 26 7a 4e 61 6d 65 5b 69 2b 31    z = &zName[i+1
a130: 5d 3b 0a 20 20 6c 65 6e 20 3d 20 6e 4e 61 6d 65  ];.  len = nName
a140: 20 2d 20 69 3b 0a 20 20 69 66 28 20 6c 65 6e 3c   - i;.  if( len<
a150: 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 53 75 66  (int)sizeof(zSuf
a160: 66 69 78 29 2d 31 20 29 7b 0a 20 20 20 20 73 74  fix)-1 ){.    st
a170: 72 63 70 79 28 7a 53 75 66 66 69 78 2c 20 7a 29  rcpy(zSuffix, z)
a180: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
a190: 53 75 66 66 69 78 5b 69 5d 3b 20 69 2b 2b 29 20  Suffix[i]; i++) 
a1a0: 7a 53 75 66 66 69 78 5b 69 5d 20 3d 20 74 6f 6c  zSuffix[i] = tol
a1b0: 6f 77 65 72 28 7a 53 75 66 66 69 78 5b 69 5d 29  ower(zSuffix[i])
a1c0: 3b 0a 20 20 20 20 66 69 72 73 74 20 3d 20 30 3b  ;.    first = 0;
a1d0: 0a 20 20 20 20 6c 61 73 74 20 3d 20 73 69 7a 65  .    last = size
a1e0: 6f 66 28 61 4d 69 6d 65 29 2f 73 69 7a 65 6f 66  of(aMime)/sizeof
a1f0: 28 61 4d 69 6d 65 5b 30 5d 29 3b 0a 20 20 20 20  (aMime[0]);.    
a200: 77 68 69 6c 65 28 20 66 69 72 73 74 3c 3d 6c 61  while( first<=la
a210: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
a220: 63 3b 0a 20 20 20 20 20 20 69 20 3d 20 28 66 69  c;.      i = (fi
a230: 72 73 74 2b 6c 61 73 74 29 2f 32 3b 0a 20 20 20  rst+last)/2;.   
a240: 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28 7a 53     c = strcmp(zS
a250: 75 66 66 69 78 2c 20 61 4d 69 6d 65 5b 69 5d 2e  uffix, aMime[i].
a260: 7a 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20  zSuffix);.      
a270: 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72  if( c==0 ) retur
a280: 6e 20 61 4d 69 6d 65 5b 69 5d 2e 7a 4d 69 6d 65  n aMime[i].zMime
a290: 74 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20  type;.      if( 
a2a0: 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
a2b0: 61 73 74 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20  ast = i-1;.     
a2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a2d0: 66 69 72 73 74 20 3d 20 69 2b 31 3b 0a 20 20 20  first = i+1;.   
a2e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a2f0: 20 72 65 74 75 72 6e 20 22 61 70 70 6c 69 63 61   return "applica
a300: 74 69 6f 6e 2f 6f 63 74 65 74 2d 73 74 72 65 61  tion/octet-strea
a310: 6d 22 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  m";.}../*.** The
a320: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
a330: 20 63 6f 6e 74 61 69 6e 73 20 31 20 66 6f 72 20   contains 1 for 
a340: 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 74  all characters t
a350: 68 61 74 20 61 72 65 20 70 65 72 6d 69 74 74 65  hat are permitte
a360: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61 72 74  d in.** the part
a370: 20 6f 66 20 74 68 65 20 55 52 4c 20 62 65 66 6f   of the URL befo
a380: 72 65 20 74 68 65 20 71 75 65 72 79 20 70 61 72  re the query par
a390: 61 6d 65 74 65 72 73 20 61 6e 64 20 66 72 61 67  ameters and frag
a3a0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 6f  ment..**.** Allo
a3b0: 77 65 64 20 63 68 61 72 61 63 74 65 72 73 3a 20  wed characters: 
a3c0: 20 30 2d 39 61 2d 7a 41 2d 5a 2c 2d 2e 2f 3a 5f   0-9a-zA-Z,-./:_
a3d0: 7e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 6c 6c 6f 77  ~.**.** Disallow
a3e0: 65 64 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ed characters in
a3f0: 63 6c 75 64 65 3a 20 20 21 22 23 24 25 26 27 28  clude:  !"#$%&'(
a400: 29 2a 2b 3b 3c 3d 3e 3f 5b 5c 5d 5e 7b 7c 7d 0a  )*+;<=>?[\]^{|}.
a410: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
a420: 63 68 61 72 20 61 6c 6c 6f 77 65 64 49 6e 4e 61  char allowedInNa
a430: 6d 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 2f  me[] = {.      /
a440: 2a 20 20 78 30 20 20 78 31 20 20 78 32 20 20 78  *  x0  x1  x2  x
a450: 33 20 20 78 34 20 20 78 35 20 20 78 36 20 20 78  3  x4  x5  x6  x
a460: 37 20 20 78 38 20 20 78 39 20 20 78 61 20 20 78  7  x8  x9  xa  x
a470: 62 20 20 78 63 20 20 78 64 20 20 78 65 20 20 78  b  xc  xd  xe  x
a480: 66 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20 20 20  f */./* 0x */   
a490: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a4a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a4b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a4c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
a4d0: 2a 20 31 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * 1x */   0,  0,
a4e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a4f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a500: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a510: 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 32 78 20 2a    0,  0,./* 2x *
a520: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
a530: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a540: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a550: 30 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  0,  1,  1,  1,  
a560: 31 2c 0a 2f 2a 20 33 78 20 2a 2f 20 20 20 31 2c  1,./* 3x */   1,
a570: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
a580: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
a590: 20 20 31 2c 20 20 31 2c 20 20 30 2c 20 20 30 2c    1,  1,  0,  0,
a5a0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
a5b0: 34 78 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20  4x */   0,  1,  
a5c0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
a5d0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
a5e0: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
a5f0: 31 2c 20 20 31 2c 0a 2f 2a 20 35 78 20 2a 2f 20  1,  1,./* 5x */ 
a600: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
a610: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
a620: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 30 2c    1,  1,  1,  0,
a630: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
a640: 0a 2f 2a 20 36 78 20 2a 2f 20 20 20 30 2c 20 20  ./* 6x */   0,  
a650: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
a660: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
a670: 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20  1,  1,  1,  1,  
a680: 31 2c 20 20 31 2c 20 20 31 2c 0a 2f 2a 20 37 78  1,  1,  1,./* 7x
a690: 20 2a 2f 20 20 20 31 2c 20 20 31 2c 20 20 31 2c   */   1,  1,  1,
a6a0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
a6b0: 20 20 31 2c 20 20 31 2c 20 20 31 2c 20 20 31 2c    1,  1,  1,  1,
a6c0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
a6d0: 20 20 30 2c 0a 2f 2a 20 38 78 20 2a 2f 20 20 20    0,./* 8x */   
a6e0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a6f0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a700: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a710: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f  0,  0,  0,  0,./
a720: 2a 20 39 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c  * 9x */   0,  0,
a730: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a740: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a750: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a760: 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 41 78 20 2a    0,  0,./* Ax *
a770: 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  /   0,  0,  0,  
a780: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a790: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a7a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a7b0: 30 2c 0a 2f 2a 20 42 78 20 2a 2f 20 20 20 30 2c  0,./* Bx */   0,
a7c0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a7d0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a7e0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a7f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20    0,  0,  0,./* 
a800: 43 78 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  Cx */   0,  0,  
a810: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a820: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a830: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a840: 30 2c 20 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f 20  0,  0,./* Dx */ 
a850: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a860: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a870: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a880: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a890: 0a 2f 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20 20  ./* Ex */   0,  
a8a0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a8b0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a8c0: 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
a8d0: 30 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 46 78  0,  0,  0,./* Fx
a8e0: 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
a8f0: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a900: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a910: 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
a920: 20 20 30 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52    0,.};../*.** R
a930: 65 6d 6f 76 65 20 61 6c 6c 20 64 69 73 61 6c 6c  emove all disall
a940: 6f 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20  owed characters 
a950: 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  in the input str
a960: 69 6e 67 20 7a 5b 5d 2e 20 20 43 6f 6e 76 65 72  ing z[].  Conver
a970: 74 20 61 6e 79 0a 2a 2a 20 64 69 73 61 6c 6c 6f  t any.** disallo
a980: 77 65 64 20 63 68 61 72 61 63 74 65 72 73 20 69  wed characters i
a990: 6e 74 6f 20 22 5f 22 2e 0a 2a 2a 0a 2a 2a 20 4e  nto "_"..**.** N
a9a0: 6f 74 20 74 68 61 74 20 74 68 65 20 74 68 72 65  ot that the thre
a9b0: 65 20 63 68 61 72 61 63 74 65 72 20 73 65 71 75  e character sequ
a9c0: 65 6e 63 65 20 22 25 58 58 22 20 77 68 65 72 65  ence "%XX" where
a9d0: 20 58 20 69 73 20 61 6e 79 20 62 79 74 65 20 69   X is any byte i
a9e0: 73 0a 2a 2a 20 63 6f 6e 76 65 72 74 65 64 20 69  s.** converted i
a9f0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 22 5f 22  nto a single "_"
aa00: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a   character..**.*
aa10: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
aa20: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
aa30: 73 20 63 6f 6e 76 65 72 74 65 64 2e 20 20 41 6e  s converted.  An
aa40: 20 22 25 58 58 22 20 2d 3e 20 22 5f 22 20 63 6f   "%XX" -> "_" co
aa50: 6e 76 65 72 73 69 6f 6e 0a 2a 2a 20 63 6f 75 6e  nversion.** coun
aa60: 74 73 20 61 73 20 61 20 73 69 6e 67 6c 65 20 63  ts as a single c
aa70: 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
aa80: 74 69 63 20 69 6e 74 20 73 61 6e 69 74 69 7a 65  tic int sanitize
aa90: 53 74 72 69 6e 67 28 63 68 61 72 20 2a 7a 29 7b  String(char *z){
aaa0: 0a 20 20 69 6e 74 20 6e 43 68 61 6e 67 65 20 3d  .  int nChange =
aab0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
aac0: 29 7b 0a 20 20 20 20 69 66 28 20 21 61 6c 6c 6f  ){.    if( !allo
aad0: 77 65 64 49 6e 4e 61 6d 65 5b 2a 28 75 6e 73 69  wedInName[*(unsi
aae0: 67 6e 65 64 20 63 68 61 72 2a 29 7a 5d 20 29 7b  gned char*)z] ){
aaf0: 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  .      if( *z=='
ab00: 25 27 20 26 26 20 7a 5b 31 5d 21 3d 30 20 26 26  %' && z[1]!=0 &&
ab10: 20 7a 5b 32 5d 21 3d 30 20 29 7b 0a 20 20 20 20   z[2]!=0 ){.    
ab20: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ab30: 20 20 20 66 6f 72 28 69 3d 33 3b 20 28 7a 5b 69     for(i=3; (z[i
ab40: 2d 32 5d 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20  -2] = z[i])!=0; 
ab50: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7d 0a 20  i++){}.      }. 
ab60: 20 20 20 20 20 2a 7a 20 3d 20 27 5f 27 3b 0a 20       *z = '_';. 
ab70: 20 20 20 20 20 6e 43 68 61 6e 67 65 2b 2b 3b 0a       nChange++;.
ab80: 20 20 20 20 7d 0a 20 20 20 20 7a 2b 2b 3b 0a 20      }.    z++;. 
ab90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61   }.  return nCha
aba0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  nge;.}../*.** Co
abb0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
abc0: 66 20 22 2f 22 20 63 68 61 72 61 63 74 65 72 73  f "/" characters
abd0: 20 69 6e 20 61 20 73 74 72 69 6e 67 2e 0a 2a 2f   in a string..*/
abe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
abf0: 74 53 6c 61 73 68 65 73 28 63 6f 6e 73 74 20 63  tSlashes(const c
ac00: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
ac10: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = 0;.  while( *
ac20: 7a 20 29 20 69 66 28 20 2a 28 7a 2b 2b 29 3d 3d  z ) if( *(z++)==
ac30: 27 2f 27 20 29 20 6e 2b 2b 3b 0a 20 20 72 65 74  '/' ) n++;.  ret
ac40: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
ac50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
ac60: 63 65 73 73 65 73 20 61 20 73 69 6e 67 6c 65 20  cesses a single 
ac70: 48 54 54 50 20 72 65 71 75 65 73 74 20 6f 6e 20  HTTP request on 
ac80: 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20 61  standard input a
ac90: 6e 64 0a 2a 2a 20 73 65 6e 64 73 20 74 68 65 20  nd.** sends the 
aca0: 72 65 70 6c 79 20 74 6f 20 73 74 61 6e 64 61 72  reply to standar
acb0: 64 20 6f 75 74 70 75 74 2e 20 20 49 66 20 74 68  d output.  If th
acc0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 31 20  e argument is 1 
acd0: 69 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  it means.** that
ace0: 20 77 65 20 61 72 65 20 73 68 6f 75 6c 64 20 63   we are should c
acf0: 6c 6f 73 65 20 74 68 65 20 73 6f 63 6b 65 74 20  lose the socket 
ad00: 77 69 74 68 6f 75 74 20 70 72 6f 63 65 73 73 69  without processi
ad10: 6e 67 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  ng additional.**
ad20: 20 48 54 54 50 20 72 65 71 75 65 73 74 73 20 61   HTTP requests a
ad30: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
ad40: 20 72 65 71 75 65 73 74 20 66 69 6e 69 73 68 65   request finishe
ad50: 73 2e 20 20 30 20 6d 65 61 6e 73 20 77 65 20 61  s.  0 means we a
ad60: 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 74 6f  re.** allowed to
ad70: 20 6b 65 65 70 20 74 68 65 20 63 6f 6e 6e 65 63   keep the connec
ad80: 74 69 6f 6e 20 6f 70 65 6e 20 61 6e 64 20 74 6f  tion open and to
ad90: 20 70 72 6f 63 65 73 73 20 61 64 64 69 74 69 6f   process additio
ada0: 6e 61 6c 20 72 65 71 75 65 73 74 73 2e 0a 2a 2a  nal requests..**
adb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
adc0: 79 20 63 68 6f 6f 73 65 20 74 6f 20 63 6c 6f 73  y choose to clos
add0: 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
ade0: 20 65 76 65 6e 20 69 66 20 74 68 65 20 61 72 67   even if the arg
adf0: 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 30 2e 0a 2a  ument.** is 0..*
ae00: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  * .** If the con
ae10: 6e 65 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  nection should b
ae20: 65 20 63 6c 6f 73 65 64 2c 20 74 68 69 73 20 72  e closed, this r
ae30: 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 65 78 69  outine calls exi
ae40: 74 28 29 20 61 6e 64 0a 2a 2a 20 74 68 75 73 20  t() and.** thus 
ae50: 6e 65 76 65 72 20 72 65 74 75 72 6e 73 2e 20 20  never returns.  
ae60: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
ae70: 64 6f 65 73 20 72 65 74 75 72 6e 20 69 74 20 6d  does return it m
ae80: 65 61 6e 73 20 74 68 61 74 20 61 6e 6f 74 68 65  eans that anothe
ae90: 72 0a 2a 2a 20 48 54 54 50 20 72 65 71 75 65 73  r.** HTTP reques
aea0: 74 20 6d 61 79 20 61 70 70 65 61 72 20 6f 6e 20  t may appear on 
aeb0: 74 68 65 20 77 69 72 65 2e 0a 2a 2f 0a 76 6f 69  the wire..*/.voi
aec0: 64 20 50 72 6f 63 65 73 73 4f 6e 65 52 65 71 75  d ProcessOneRequ
aed0: 65 73 74 28 69 6e 74 20 66 6f 72 63 65 43 6c 6f  est(int forceClo
aee0: 73 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  se){.  int i, j,
aef0: 20 6a 30 2c 20 63 3b 0a 20 20 63 68 61 72 20 2a   j0, c;.  char *
af00: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
af10: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 70      /* Used to p
af20: 61 72 73 65 20 75 70 20 61 20 73 74 72 69 6e 67  arse up a string
af30: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
af40: 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20  t statbuf;      
af50: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
af60: 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74 6f  bout the file to
af70: 20 62 65 20 72 65 74 72 69 65 76 65 64 20 2a 2f   be retrieved */
af80: 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20 20  .  FILE *in;    
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afa0: 46 6f 72 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  For reading from
afb0: 20 43 47 49 20 73 63 72 69 70 74 73 20 2a 2f 0a   CGI scripts */.
afc0: 23 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45  #ifdef LOG_HEADE
afd0: 52 0a 20 20 46 49 4c 45 20 2a 68 64 72 4c 6f 67  R.  FILE *hdrLog
afe0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
aff0: 20 4c 6f 67 20 66 69 6c 65 20 66 6f 72 20 63 6f   Log file for co
b000: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 63 6f  mplete header co
b010: 6e 74 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntent */.#endif.
b020: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 31 30 30    char zLine[100
b030: 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  0];         /* A
b040: 20 62 75 66 66 65 72 20 66 6f 72 20 69 6e 70 75   buffer for inpu
b050: 74 20 6c 69 6e 65 73 20 6f 72 20 66 6f 72 6d 69  t lines or formi
b060: 6e 67 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 2f  ng names */..  /
b070: 2a 20 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f  * Change directo
b080: 72 69 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74  ries to the root
b090: 20 6f 66 20 74 68 65 20 48 54 54 50 20 66 69 6c   of the HTTP fil
b0a0: 65 73 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69  esystem.  */.  i
b0b0: 66 28 20 63 68 64 69 72 28 7a 52 6f 6f 74 5b 30  f( chdir(zRoot[0
b0c0: 5d 20 3f 20 7a 52 6f 6f 74 20 3a 20 22 2f 22 29  ] ? zRoot : "/")
b0d0: 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  !=0 ){.    char 
b0e0: 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20  zBuf[1000];.    
b0f0: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 31 39 30 2c  Malfunction(190,
b100: 20 20 20 2f 2a 20 4c 4f 47 3a 20 63 68 64 69 72     /* LOG: chdir
b110: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
b120: 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 68        "cannot ch
b130: 64 69 72 20 74 6f 20 5b 25 73 5d 20 66 72 6f 6d  dir to [%s] from
b140: 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20 20   [%s]",.        
b150: 20 7a 52 6f 6f 74 2c 20 67 65 74 63 77 64 28 7a   zRoot, getcwd(z
b160: 42 75 66 2c 39 39 39 29 29 3b 0a 20 20 7d 0a 20  Buf,999));.  }. 
b170: 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a 0a 20 20   nRequest++;..  
b180: 2f 2a 0a 20 20 2a 2a 20 57 65 20 6d 75 73 74 20  /*.  ** We must 
b190: 72 65 63 65 69 76 65 20 61 20 63 6f 6d 70 6c 65  receive a comple
b1a0: 74 65 20 68 65 61 64 65 72 20 77 69 74 68 69 6e  te header within
b1b0: 20 31 35 20 73 65 63 6f 6e 64 73 0a 20 20 2a 2f   15 seconds.  */
b1c0: 0a 20 20 73 69 67 6e 61 6c 28 53 49 47 41 4c 52  .  signal(SIGALR
b1d0: 4d 2c 20 54 69 6d 65 6f 75 74 29 3b 0a 20 20 73  M, Timeout);.  s
b1e0: 69 67 6e 61 6c 28 53 49 47 53 45 47 56 2c 20 54  ignal(SIGSEGV, T
b1f0: 69 6d 65 6f 75 74 29 3b 0a 20 20 73 69 67 6e 61  imeout);.  signa
b200: 6c 28 53 49 47 50 49 50 45 2c 20 54 69 6d 65 6f  l(SIGPIPE, Timeo
b210: 75 74 29 3b 0a 20 20 69 66 28 20 75 73 65 54 69  ut);.  if( useTi
b220: 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31 35  meout ) alarm(15
b230: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  );..  /* Get the
b240: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74   first line of t
b250: 68 65 20 72 65 71 75 65 73 74 20 61 6e 64 20 70  he request and p
b260: 61 72 73 65 20 6f 75 74 20 74 68 65 0a 20 20 2a  arse out the.  *
b270: 2a 20 6d 65 74 68 6f 64 2c 20 74 68 65 20 73 63  * method, the sc
b280: 72 69 70 74 20 61 6e 64 20 74 68 65 20 70 72 6f  ript and the pro
b290: 74 6f 63 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  tocol..  */.  if
b2a0: 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69  ( fgets(zLine,si
b2b0: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74 64 69  zeof(zLine),stdi
b2c0: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 69  n)==0 ){.    exi
b2d0: 74 28 30 29 3b 0a 20 20 7d 0a 20 20 6f 6d 69 74  t(0);.  }.  omit
b2e0: 4c 6f 67 20 3d 20 30 3b 0a 20 20 6e 49 6e 20 2b  Log = 0;.  nIn +
b2f0: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  = strlen(zLine);
b300: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
b310: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74   first line of t
b320: 68 65 20 48 54 54 50 20 72 65 71 75 65 73 74 20  he HTTP request 
b330: 2a 2f 0a 20 20 7a 4d 65 74 68 6f 64 20 3d 20 53  */.  zMethod = S
b340: 74 72 44 75 70 28 47 65 74 46 69 72 73 74 45 6c  trDup(GetFirstEl
b350: 65 6d 65 6e 74 28 7a 4c 69 6e 65 2c 26 7a 29 29  ement(zLine,&z))
b360: 3b 0a 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20  ;.  zRealScript 
b370: 3d 20 7a 53 63 72 69 70 74 20 3d 20 53 74 72 44  = zScript = StrD
b380: 75 70 28 47 65 74 46 69 72 73 74 45 6c 65 6d 65  up(GetFirstEleme
b390: 6e 74 28 7a 2c 26 7a 29 29 3b 0a 20 20 7a 50 72  nt(z,&z));.  zPr
b3a0: 6f 74 6f 63 6f 6c 20 3d 20 53 74 72 44 75 70 28  otocol = StrDup(
b3b0: 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e 74 28  GetFirstElement(
b3c0: 7a 2c 26 7a 29 29 3b 0a 20 20 69 66 28 20 7a 50  z,&z));.  if( zP
b3d0: 72 6f 74 6f 63 6f 6c 3d 3d 30 20 7c 7c 20 73 74  rotocol==0 || st
b3e0: 72 6e 63 6d 70 28 7a 50 72 6f 74 6f 63 6f 6c 2c  rncmp(zProtocol,
b3f0: 22 48 54 54 50 2f 22 2c 35 29 21 3d 30 20 7c 7c  "HTTP/",5)!=0 ||
b400: 20 73 74 72 6c 65 6e 28 7a 50 72 6f 74 6f 63 6f   strlen(zProtoco
b410: 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 53 74 61  l)!=8 ){.    Sta
b420: 72 74 52 65 73 70 6f 6e 73 65 28 22 34 30 30 20  rtResponse("400 
b430: 42 61 64 20 52 65 71 75 65 73 74 22 29 3b 0a 20  Bad Request");. 
b440: 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74     nOut += print
b450: 66 28 0a 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  f(.      "Conten
b460: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
b470: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 22 5c  in\r\n".      "\
b480: 72 5c 6e 22 0a 20 20 20 20 20 20 22 54 68 69 73  r\n".      "This
b490: 20 73 65 72 76 65 72 20 64 6f 65 73 20 6e 6f 74   server does not
b4a0: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
b4b0: 72 65 71 75 65 73 74 65 64 20 70 72 6f 74 6f 63  requested protoc
b4c0: 6f 6c 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20  ol\n".    );.   
b4d0: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
b4e0: 20 32 30 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 62   200); /* LOG: b
b4f0: 61 64 20 70 72 6f 74 6f 63 6f 6c 20 69 6e 20 48  ad protocol in H
b500: 54 54 50 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  TTP header */.  
b510: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 7d 0a 20    exit(0);.  }. 
b520: 20 69 66 28 20 7a 53 63 72 69 70 74 5b 30 5d 3d   if( zScript[0]=
b530: 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 32 31  =0 ) NotFound(21
b540: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 45 6d 70 74  0); /* LOG: Empt
b550: 79 20 72 65 71 75 65 73 74 20 55 52 49 20 2a 2f  y request URI */
b560: 0a 20 20 69 66 28 20 66 6f 72 63 65 43 6c 6f 73  .  if( forceClos
b570: 65 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f  e ){.    closeCo
b580: 6e 6e 65 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20  nnection = 1;.  
b590: 7d 65 6c 73 65 20 69 66 28 20 7a 50 72 6f 74 6f  }else if( zProto
b5a0: 63 6f 6c 5b 35 5d 3c 27 31 27 20 7c 7c 20 7a 50  col[5]<'1' || zP
b5b0: 72 6f 74 6f 63 6f 6c 5b 37 5d 3c 27 31 27 20 29  rotocol[7]<'1' )
b5c0: 7b 0a 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65  {.    closeConne
b5d0: 63 74 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  ction = 1;.  }..
b5e0: 20 20 2f 2a 20 54 68 69 73 20 76 65 72 79 20 73    /* This very s
b5f0: 69 6d 70 6c 65 20 73 65 72 76 65 72 20 6f 6e 6c  imple server onl
b600: 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68  y understands th
b610: 65 20 47 45 54 2c 20 50 4f 53 54 0a 20 20 2a 2a  e GET, POST.  **
b620: 20 61 6e 64 20 48 45 41 44 20 6d 65 74 68 6f 64   and HEAD method
b630: 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 72  s.  */.  if( str
b640: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 47 45 54  cmp(zMethod,"GET
b650: 22 29 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  ")!=0 && strcmp(
b660: 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 54 22 29 21  zMethod,"POST")!
b670: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 73 74 72  =0.       && str
b680: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41  cmp(zMethod,"HEA
b690: 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 74  D")!=0 ){.    St
b6a0: 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 31  artResponse("501
b6b0: 20 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65 64   Not Implemented
b6c0: 22 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ");.    nOut += 
b6d0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 43  printf(.      "C
b6e0: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 20 74 65 78  ontent-type: tex
b6f0: 74 2f 70 6c 61 69 6e 5c 72 5c 6e 22 0a 20 20 20  t/plain\r\n".   
b700: 20 20 20 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20     "\r\n".      
b710: 22 54 68 65 20 25 73 20 6d 65 74 68 6f 64 20 69  "The %s method i
b720: 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65  s not implemente
b730: 64 20 6f 6e 20 74 68 69 73 20 73 65 72 76 65 72  d on this server
b740: 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 7a 4d 65 74  .\n",.      zMet
b750: 68 6f 64 29 3b 0a 20 20 20 20 4d 61 6b 65 4c 6f  hod);.    MakeLo
b760: 67 45 6e 74 72 79 28 30 2c 20 32 32 30 29 3b 20  gEntry(0, 220); 
b770: 2f 2a 20 4c 4f 47 3a 20 55 6e 6b 6e 6f 77 6e 20  /* LOG: Unknown 
b780: 72 65 71 75 65 73 74 20 6d 65 74 68 6f 64 20 2a  request method *
b790: 2f 0a 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20  /.    exit(0);. 
b7a0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
b7b0: 65 20 69 73 20 61 20 6c 6f 67 20 66 69 6c 65 20  e is a log file 
b7c0: 28 69 66 20 7a 4c 6f 67 46 69 6c 65 21 3d 30 29  (if zLogFile!=0)
b7d0: 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 74 68   and if the path
b7e0: 6e 61 6d 65 20 69 6e 0a 20 20 2a 2a 20 74 68 65  name in.  ** the
b7f0: 20 66 69 72 73 74 20 6c 69 6e 65 20 6f 66 20 74   first line of t
b800: 68 65 20 68 74 74 70 20 72 65 71 75 65 73 74 20  he http request 
b810: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 67  contains the mag
b820: 69 63 20 73 74 72 69 6e 67 0a 20 20 2a 2a 20 22  ic string.  ** "
b830: 46 75 6c 6c 48 65 61 64 65 72 4c 6f 67 22 20 74  FullHeaderLog" t
b840: 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 6f  hen write the co
b850: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 20 74 65  mplete header te
b860: 78 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  xt into the.  **
b870: 20 66 69 6c 65 20 25 73 28 7a 4c 6f 67 46 69 6c   file %s(zLogFil
b880: 65 29 2d 68 64 72 2e 20 20 4f 76 65 72 77 72 69  e)-hdr.  Overwri
b890: 74 65 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  te the file.  Th
b8a0: 69 73 20 69 73 20 66 6f 72 20 70 72 6f 74 6f 63  is is for protoc
b8b0: 6f 6c 0a 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  ol.  ** debuggin
b8c0: 67 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 6f 6e  g only and is on
b8d0: 6c 79 20 65 6e 61 62 6c 65 64 20 69 66 20 61 6c  ly enabled if al
b8e0: 74 68 74 74 70 64 20 69 73 20 63 6f 6d 70 69 6c  thttpd is compil
b8f0: 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65  ed with.  ** the
b900: 20 2d 44 4c 4f 47 5f 48 45 41 44 45 52 3d 31 20   -DLOG_HEADER=1 
b910: 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  option..  */.#if
b920: 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a 20  def LOG_HEADER. 
b930: 20 69 66 28 20 7a 4c 6f 67 46 69 6c 65 0a 20 20   if( zLogFile.  
b940: 20 26 26 20 73 74 72 73 74 72 28 7a 53 63 72 69   && strstr(zScri
b950: 70 74 2c 22 46 75 6c 6c 48 65 61 64 65 72 4c 6f  pt,"FullHeaderLo
b960: 67 22 29 21 3d 30 0a 20 20 20 26 26 20 73 74 72  g")!=0.   && str
b970: 6c 65 6e 28 7a 4c 6f 67 46 69 6c 65 29 3c 73 69  len(zLogFile)<si
b980: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2d 35 30 0a 20  zeof(zLine)-50. 
b990: 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
b9a0: 7a 4c 69 6e 65 2c 20 22 25 73 2d 68 64 72 22 2c  zLine, "%s-hdr",
b9b0: 20 7a 4c 6f 67 46 69 6c 65 29 3b 0a 20 20 20 20   zLogFile);.    
b9c0: 68 64 72 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 7a  hdrLog = fopen(z
b9d0: 4c 69 6e 65 2c 20 22 77 62 22 29 3b 0a 20 20 7d  Line, "wb");.  }
b9e0: 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 2f 2a 20 47  .#endif...  /* G
b9f0: 65 74 20 61 6c 6c 20 74 68 65 20 6f 70 74 69 6f  et all the optio
ba00: 6e 61 6c 20 66 69 65 6c 64 73 20 74 68 61 74 20  nal fields that 
ba10: 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69 72 73 74  follow the first
ba20: 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 7a 43   line..  */.  zC
ba30: 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 7a 41 75  ookie = 0;.  zAu
ba40: 74 68 54 79 70 65 20 3d 20 30 3b 0a 20 20 7a 52  thType = 0;.  zR
ba50: 65 6d 6f 74 65 55 73 65 72 20 3d 20 30 3b 0a 20  emoteUser = 0;. 
ba60: 20 7a 52 65 66 65 72 65 72 20 3d 20 30 3b 0a 20   zReferer = 0;. 
ba70: 20 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20   zIfNoneMatch = 
ba80: 30 3b 0a 20 20 7a 49 66 4d 6f 64 69 66 69 65 64  0;.  zIfModified
ba90: 53 69 6e 63 65 20 3d 20 30 3b 0a 20 20 77 68 69  Since = 0;.  whi
baa0: 6c 65 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c  le( fgets(zLine,
bab0: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 73 74  sizeof(zLine),st
bac0: 64 69 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72  din) ){.    char
bad0: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20   *zFieldName;.  
bae0: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 23    char *zVal;..#
baf0: 69 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52  ifdef LOG_HEADER
bb00: 0a 20 20 20 20 69 66 28 20 68 64 72 4c 6f 67 20  .    if( hdrLog 
bb10: 29 20 66 70 72 69 6e 74 66 28 68 64 72 4c 6f 67  ) fprintf(hdrLog
bb20: 2c 20 22 25 73 22 2c 20 7a 4c 69 6e 65 29 3b 0a  , "%s", zLine);.
bb30: 23 65 6e 64 69 66 0a 20 20 20 20 6e 49 6e 20 2b  #endif.    nIn +
bb40: 3d 20 73 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  = strlen(zLine);
bb50: 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 20  .    zFieldName 
bb60: 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d 65 6e  = GetFirstElemen
bb70: 74 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a  t(zLine,&zVal);.
bb80: 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61      if( zFieldNa
bb90: 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64  me==0 || *zField
bba0: 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Name==0 ) break;
bbb0: 0a 20 20 20 20 52 65 6d 6f 76 65 4e 65 77 6c 69  .    RemoveNewli
bbc0: 6e 65 28 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66  ne(zVal);.    if
bbd0: 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69  ( strcasecmp(zFi
bbe0: 65 6c 64 4e 61 6d 65 2c 22 55 73 65 72 2d 41 67  eldName,"User-Ag
bbf0: 65 6e 74 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ent:")==0 ){.   
bc00: 20 20 20 7a 41 67 65 6e 74 20 3d 20 53 74 72 44     zAgent = StrD
bc10: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65  up(zVal);.    }e
bc20: 6c 73 65 20 69 66 28 20 73 74 72 63 61 73 65 63  lse if( strcasec
bc30: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 41  mp(zFieldName,"A
bc40: 63 63 65 70 74 3a 22 29 3d 3d 30 20 29 7b 0a 20  ccept:")==0 ){. 
bc50: 20 20 20 20 20 7a 41 63 63 65 70 74 20 3d 20 53       zAccept = S
bc60: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
bc70: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
bc80: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
bc90: 2c 22 41 63 63 65 70 74 2d 45 6e 63 6f 64 69 6e  ,"Accept-Encodin
bca0: 67 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  g:")==0 ){.     
bcb0: 20 7a 41 63 63 65 70 74 45 6e 63 6f 64 69 6e 67   zAcceptEncoding
bcc0: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
bcd0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
bce0: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
bcf0: 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d 6c 65  Name,"Content-le
bd00: 6e 67 74 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  ngth:")==0 ){.  
bd10: 20 20 20 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67      zContentLeng
bd20: 74 68 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c  th = StrDup(zVal
bd30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
bd40: 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65   strcasecmp(zFie
bd50: 6c 64 4e 61 6d 65 2c 22 43 6f 6e 74 65 6e 74 2d  ldName,"Content-
bd60: 74 79 70 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  type:")==0 ){.  
bd70: 20 20 20 20 7a 43 6f 6e 74 65 6e 74 54 79 70 65      zContentType
bd80: 20 3d 20 53 74 72 44 75 70 28 7a 56 61 6c 29 3b   = StrDup(zVal);
bd90: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
bda0: 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c 64  trcasecmp(zField
bdb0: 4e 61 6d 65 2c 22 52 65 66 65 72 65 72 3a 22 29  Name,"Referer:")
bdc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 52 65  ==0 ){.      zRe
bdd0: 66 65 72 65 72 20 3d 20 53 74 72 44 75 70 28 7a  ferer = StrDup(z
bde0: 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
bdf0: 73 74 72 73 74 72 28 7a 56 61 6c 2c 20 22 64 65  strstr(zVal, "de
be00: 76 69 64 73 2e 6e 65 74 2f 22 29 21 3d 30 20 29  vids.net/")!=0 )
be10: 7b 20 7a 52 65 66 65 72 65 72 20 3d 20 22 64 65  { zReferer = "de
be20: 76 69 64 73 2e 6e 65 74 2e 73 6d 75 74 22 3b 0a  vids.net.smut";.
be30: 20 20 20 20 20 20 20 20 46 6f 72 62 69 64 64 65          Forbidde
be40: 6e 28 32 33 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20  n(230); /* LOG: 
be50: 52 65 66 65 72 72 65 72 20 69 73 20 64 65 76 69  Referrer is devi
be60: 64 73 2e 6e 65 74 20 2a 2f 0a 20 20 20 20 20 20  ds.net */.      
be70: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
be80: 73 74 72 63 61 73 65 63 6d 70 28 7a 46 69 65 6c  strcasecmp(zFiel
be90: 64 4e 61 6d 65 2c 22 43 6f 6f 6b 69 65 3a 22 29  dName,"Cookie:")
bea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 43 6f  ==0 ){.      zCo
beb0: 6f 6b 69 65 20 3d 20 53 74 72 41 70 70 65 6e 64  okie = StrAppend
bec0: 28 7a 43 6f 6f 6b 69 65 2c 22 3b 20 22 2c 7a 56  (zCookie,"; ",zV
bed0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  al);.    }else i
bee0: 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a 46  f( strcasecmp(zF
bef0: 69 65 6c 64 4e 61 6d 65 2c 22 43 6f 6e 6e 65 63  ieldName,"Connec
bf00: 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  tion:")==0 ){.  
bf10: 20 20 20 20 69 66 28 20 73 74 72 63 61 73 65 63      if( strcasec
bf20: 6d 70 28 7a 56 61 6c 2c 22 63 6c 6f 73 65 22 29  mp(zVal,"close")
bf30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
bf40: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  loseConnection =
bf50: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
bf60: 69 66 28 20 21 66 6f 72 63 65 43 6c 6f 73 65 20  if( !forceClose 
bf70: 26 26 20 73 74 72 63 61 73 65 63 6d 70 28 7a 56  && strcasecmp(zV
bf80: 61 6c 2c 20 22 6b 65 65 70 2d 61 6c 69 76 65 22  al, "keep-alive"
bf90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
bfa0: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
bfb0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
bfc0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
bfd0: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
bfe0: 2c 22 48 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a  ,"Host:")==0 ){.
bff0: 20 20 20 20 20 20 69 6e 74 20 69 6e 53 71 75 61        int inSqua
c000: 72 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  re = 0;.      ch
c010: 61 72 20 63 3b 0a 20 20 20 20 20 20 69 66 28 20  ar c;.      if( 
c020: 73 61 6e 69 74 69 7a 65 53 74 72 69 6e 67 28 7a  sanitizeString(z
c030: 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
c040: 46 6f 72 62 69 64 64 65 6e 28 32 34 30 29 3b 20  Forbidden(240); 
c050: 20 2f 2a 20 4c 4f 47 3a 20 49 6c 6c 65 67 61 6c   /* LOG: Illegal
c060: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 48 4f 53 54   content in HOST
c070: 3a 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  : parameter */. 
c080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 48 74       }.      zHt
c090: 74 70 48 6f 73 74 20 3d 20 53 74 72 44 75 70 28  tpHost = StrDup(
c0a0: 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7a 53 65  zVal);.      zSe
c0b0: 72 76 65 72 50 6f 72 74 20 3d 20 7a 53 65 72 76  rverPort = zServ
c0c0: 65 72 4e 61 6d 65 20 3d 20 53 74 72 44 75 70 28  erName = StrDup(
c0d0: 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20  zHttpHost);.    
c0e0: 20 20 77 68 69 6c 65 28 20 7a 53 65 72 76 65 72    while( zServer
c0f0: 50 6f 72 74 20 26 26 20 28 63 20 3d 20 2a 7a 53  Port && (c = *zS
c100: 65 72 76 65 72 50 6f 72 74 29 21 3d 30 0a 20 20  erverPort)!=0.  
c110: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
c120: 63 21 3d 27 3a 27 20 7c 7c 20 69 6e 53 71 75 61  c!=':' || inSqua
c130: 72 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  re) ){.        i
c140: 66 28 20 63 3d 3d 27 5b 27 20 29 20 69 6e 53 71  f( c=='[' ) inSq
c150: 75 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  uare = 1;.      
c160: 20 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 69    if( c==']' ) i
c170: 6e 53 71 75 61 72 65 20 3d 20 30 3b 0a 20 20 20  nSquare = 0;.   
c180: 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f 72 74       zServerPort
c190: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
c1a0: 20 20 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72    if( zServerPor
c1b0: 74 20 26 26 20 2a 7a 53 65 72 76 65 72 50 6f 72  t && *zServerPor
c1c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a 53  t ){.        *zS
c1d0: 65 72 76 65 72 50 6f 72 74 20 3d 20 30 3b 0a 20  erverPort = 0;. 
c1e0: 20 20 20 20 20 20 20 7a 53 65 72 76 65 72 50 6f         zServerPo
c1f0: 72 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rt++;.      }.  
c200: 20 20 20 20 69 66 28 20 7a 52 65 61 6c 50 6f 72      if( zRealPor
c210: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53 65  t ){.        zSe
c220: 72 76 65 72 50 6f 72 74 20 3d 20 53 74 72 44 75  rverPort = StrDu
c230: 70 28 7a 52 65 61 6c 50 6f 72 74 29 3b 0a 20 20  p(zRealPort);.  
c240: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
c250: 69 66 28 20 73 74 72 63 61 73 65 63 6d 70 28 7a  if( strcasecmp(z
c260: 46 69 65 6c 64 4e 61 6d 65 2c 22 41 75 74 68 6f  FieldName,"Autho
c270: 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29  rization:")==0 )
c280: 7b 0a 20 20 20 20 20 20 7a 41 75 74 68 54 79 70  {.      zAuthTyp
c290: 65 20 3d 20 47 65 74 46 69 72 73 74 45 6c 65 6d  e = GetFirstElem
c2a0: 65 6e 74 28 53 74 72 44 75 70 28 7a 56 61 6c 29  ent(StrDup(zVal)
c2b0: 2c 20 26 7a 41 75 74 68 41 72 67 29 3b 0a 20 20  , &zAuthArg);.  
c2c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
c2d0: 61 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d  asecmp(zFieldNam
c2e0: 65 2c 22 49 66 2d 4e 6f 6e 65 2d 4d 61 74 63 68  e,"If-None-Match
c2f0: 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
c300: 7a 49 66 4e 6f 6e 65 4d 61 74 63 68 20 3d 20 53  zIfNoneMatch = S
c310: 74 72 44 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20  trDup(zVal);.   
c320: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 61   }else if( strca
c330: 73 65 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65  secmp(zFieldName
c340: 2c 22 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53 69  ,"If-Modified-Si
c350: 6e 63 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nce:")==0 ){.   
c360: 20 20 20 7a 49 66 4d 6f 64 69 66 69 65 64 53 69     zIfModifiedSi
c370: 6e 63 65 20 3d 20 53 74 72 44 75 70 28 7a 56 61  nce = StrDup(zVa
c380: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  l);.    }.  }.#i
c390: 66 64 65 66 20 4c 4f 47 5f 48 45 41 44 45 52 0a  fdef LOG_HEADER.
c3a0: 20 20 69 66 28 20 68 64 72 4c 6f 67 20 29 20 66    if( hdrLog ) f
c3b0: 63 6c 6f 73 65 28 68 64 72 4c 6f 67 29 3b 0a 23  close(hdrLog);.#
c3c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 69 73 61  endif..  /* Disa
c3d0: 6c 6c 6f 77 20 72 65 71 75 65 73 74 73 20 66 72  llow requests fr
c3e0: 6f 6d 20 63 65 72 74 61 69 6e 20 63 6c 69 65 6e  om certain clien
c3f0: 74 73 20 2a 2f 0a 20 20 69 66 28 20 7a 41 67 65  ts */.  if( zAge
c400: 6e 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  nt ){.    if( st
c410: 72 73 74 72 28 7a 41 67 65 6e 74 2c 20 22 57 69  rstr(zAgent, "Wi
c420: 6e 64 6f 77 73 5f 39 22 29 21 3d 30 0a 20 20 20  ndows_9")!=0.   
c430: 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41 67 65    || strstr(zAge
c440: 6e 74 2c 20 22 44 6f 77 6e 6c 6f 61 64 5f 4d 61  nt, "Download_Ma
c450: 73 74 65 72 22 29 21 3d 30 0a 20 20 20 20 20 7c  ster")!=0.     |
c460: 7c 20 73 74 72 73 74 72 28 7a 41 67 65 6e 74 2c  | strstr(zAgent,
c470: 20 22 45 7a 6f 6f 6d 73 2f 22 29 21 3d 30 0a 20   "Ezooms/")!=0. 
c480: 20 20 20 20 7c 7c 20 73 74 72 73 74 72 28 7a 41      || strstr(zA
c490: 67 65 6e 74 2c 20 22 48 54 54 72 61 63 6b 22 29  gent, "HTTrack")
c4a0: 21 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72 73  !=0.     || strs
c4b0: 74 72 28 7a 41 67 65 6e 74 2c 20 22 41 68 72 65  tr(zAgent, "Ahre
c4c0: 66 73 42 6f 74 22 29 21 3d 30 0a 20 20 20 20 29  fsBot")!=0.    )
c4d0: 7b 0a 20 20 20 20 20 20 46 6f 72 62 69 64 64 65  {.      Forbidde
c4e0: 6e 28 32 35 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  n(250);  /* LOG:
c4f0: 20 44 69 73 61 6c 6c 6f 77 65 64 20 75 73 65 72   Disallowed user
c500: 20 61 67 65 6e 74 20 2a 2f 0a 20 20 20 20 7d 0a   agent */.    }.
c510: 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20    }.#if 0.  if( 
c520: 7a 52 65 66 65 72 65 72 20 29 7b 0a 20 20 20 20  zReferer ){.    
c530: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c540: 72 20 2a 61 7a 44 69 73 61 6c 6c 6f 77 5b 5d 20  r *azDisallow[] 
c550: 3d 20 7b 0a 20 20 20 20 20 20 22 73 6b 69 64 72  = {.      "skidr
c560: 6f 77 63 72 61 63 6b 2e 63 6f 6d 22 2c 0a 20 20  owcrack.com",.  
c570: 20 20 20 20 22 68 6f 73 68 69 79 75 75 67 69 2e      "hoshiyuugi.
c580: 74 69 73 74 6f 72 79 2e 63 6f 6d 22 2c 0a 20 20  tistory.com",.  
c590: 20 20 20 20 22 73 6b 69 64 72 6f 77 67 61 6d 65      "skidrowgame
c5a0: 73 2e 6e 65 74 22 2c 0a 20 20 20 20 7d 3b 0a 20  s.net",.    };. 
c5b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
c5c0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
c5d0: 61 7a 44 69 73 61 6c 6c 6f 77 29 2f 73 69 7a 65  azDisallow)/size
c5e0: 6f 66 28 61 7a 44 69 73 61 6c 6c 6f 77 5b 30 5d  of(azDisallow[0]
c5f0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
c600: 66 28 20 73 74 72 73 74 72 28 7a 52 65 66 65 72  f( strstr(zRefer
c610: 65 72 2c 20 61 7a 44 69 73 61 6c 6c 6f 77 5b 69  er, azDisallow[i
c620: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
c630: 20 4e 6f 74 46 6f 75 6e 64 28 32 36 30 29 3b 20   NotFound(260); 
c640: 20 2f 2a 20 4c 4f 47 3a 20 44 69 73 61 6c 6c 6f   /* LOG: Disallo
c650: 77 65 64 20 72 65 66 65 72 72 65 72 20 2a 2f 0a  wed referrer */.
c660: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c670: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  }.#endif..  /* M
c680: 61 6b 65 20 61 6e 20 65 78 74 72 61 20 65 66 66  ake an extra eff
c690: 6f 72 74 20 74 6f 20 67 65 74 20 61 20 76 61 6c  ort to get a val
c6a0: 69 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61  id server name a
c6b0: 6e 64 20 70 6f 72 74 20 6e 75 6d 62 65 72 2e 0a  nd port number..
c6c0: 20 20 2a 2a 20 4f 6e 6c 79 20 4e 65 74 73 63 61    ** Only Netsca
c6d0: 70 65 20 70 72 6f 76 69 64 65 73 20 74 68 69 73  pe provides this
c6e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
c6f0: 66 20 74 68 65 20 62 72 6f 77 73 65 72 20 69 73  f the browser is
c700: 0a 20 20 2a 2a 20 49 6e 74 65 72 6e 65 74 20 45  .  ** Internet E
c710: 78 70 6c 6f 72 65 72 2c 20 74 68 65 6e 20 77 65  xplorer, then we
c720: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 6f 75   have to find ou
c730: 74 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  t the informatio
c740: 6e 20 66 6f 72 0a 20 20 2a 2a 20 6f 75 72 73 65  n for.  ** ourse
c750: 6c 76 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lves..  */.  if(
c760: 20 7a 53 65 72 76 65 72 4e 61 6d 65 3d 3d 30 20   zServerName==0 
c770: 29 7b 0a 20 20 20 20 7a 53 65 72 76 65 72 4e 61  ){.    zServerNa
c780: 6d 65 20 3d 20 53 61 66 65 4d 61 6c 6c 6f 63 28  me = SafeMalloc(
c790: 20 31 30 30 20 29 3b 0a 20 20 20 20 67 65 74 68   100 );.    geth
c7a0: 6f 73 74 6e 61 6d 65 28 7a 53 65 72 76 65 72 4e  ostname(zServerN
c7b0: 61 6d 65 2c 31 30 30 29 3b 0a 20 20 7d 0a 20 20  ame,100);.  }.  
c7c0: 69 66 28 20 7a 53 65 72 76 65 72 50 6f 72 74 3d  if( zServerPort=
c7d0: 3d 30 20 7c 7c 20 2a 7a 53 65 72 76 65 72 50 6f  =0 || *zServerPo
c7e0: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 65  rt==0 ){.    zSe
c7f0: 72 76 65 72 50 6f 72 74 20 3d 20 44 45 46 41 55  rverPort = DEFAU
c800: 4c 54 5f 50 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20  LT_PORT;.  }..  
c810: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 71 75  /* Remove the qu
c820: 65 72 79 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  ery string from 
c830: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
c840: 65 71 75 65 73 74 65 64 20 66 69 6c 65 2e 0a 20  equested file.. 
c850: 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a 53 63 72   */.  for(z=zScr
c860: 69 70 74 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  ipt; *z && *z!='
c870: 3f 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 69 66 28  ?'; z++){}.  if(
c880: 20 2a 7a 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20   *z=='?' ){.    
c890: 7a 51 75 65 72 79 53 75 66 66 69 78 20 3d 20 53  zQuerySuffix = S
c8a0: 74 72 44 75 70 28 7a 29 3b 0a 20 20 20 20 2a 7a  trDup(z);.    *z
c8b0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
c8c0: 20 20 20 7a 51 75 65 72 79 53 75 66 66 69 78 20     zQuerySuffix 
c8d0: 3d 20 22 22 3b 0a 20 20 7d 0a 20 20 7a 51 75 65  = "";.  }.  zQue
c8e0: 72 79 53 74 72 69 6e 67 20 3d 20 2a 7a 51 75 65  ryString = *zQue
c8f0: 72 79 53 75 66 66 69 78 20 3f 20 26 7a 51 75 65  rySuffix ? &zQue
c900: 72 79 53 75 66 66 69 78 5b 31 5d 20 3a 20 7a 51  rySuffix[1] : zQ
c910: 75 65 72 79 53 75 66 66 69 78 3b 0a 0a 20 20 2f  uerySuffix;..  /
c920: 2a 20 43 72 65 61 74 65 20 61 20 66 69 6c 65 20  * Create a file 
c930: 74 6f 20 68 6f 6c 64 20 74 68 65 20 50 4f 53 54  to hold the POST
c940: 20 71 75 65 72 79 20 64 61 74 61 2c 20 69 66 20   query data, if 
c950: 61 6e 79 2e 20 20 57 65 20 68 61 76 65 20 74 6f  any.  We have to
c960: 0a 20 20 2a 2a 20 64 6f 20 69 74 20 74 68 69 73  .  ** do it this
c970: 20 77 61 79 2e 20 20 57 65 20 63 61 6e 27 74 20   way.  We can't 
c980: 6a 75 73 74 20 70 61 73 73 20 74 68 65 20 66 69  just pass the fi
c990: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 64 6f  le descriptor do
c9a0: 77 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 63  wn to.  ** the c
c9b0: 68 69 6c 64 20 70 72 6f 63 65 73 73 20 62 65 63  hild process bec
c9c0: 61 75 73 65 20 74 68 65 20 66 67 65 74 73 28 29  ause the fgets()
c9d0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 68 61   function may ha
c9e0: 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
c9f0: 72 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  read part of the
ca00: 20 50 4f 53 54 20 64 61 74 61 20 69 6e 74 6f 20   POST data into 
ca10: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 62 75 66  its internal buf
ca20: 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
ca30: 7a 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20  zMethod[0]=='P' 
ca40: 26 26 20 7a 43 6f 6e 74 65 6e 74 4c 65 6e 67 74  && zContentLengt
ca50: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
ca60: 6c 65 6e 20 3d 20 61 74 6f 69 28 7a 43 6f 6e 74  len = atoi(zCont
ca70: 65 6e 74 4c 65 6e 67 74 68 29 3b 0a 20 20 20 20  entLength);.    
ca80: 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20 20 20 63  FILE *out;.    c
ca90: 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 20 20 69  har *zBuf;.    i
caa0: 6e 74 20 6e 3b 0a 0a 20 20 20 20 69 66 28 20 6c  nt n;..    if( l
cab0: 65 6e 3e 4d 41 58 5f 43 4f 4e 54 45 4e 54 5f 4c  en>MAX_CONTENT_L
cac0: 45 4e 47 54 48 20 29 7b 0a 20 20 20 20 20 20 53  ENGTH ){.      S
cad0: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30  tartResponse("50
cae0: 30 20 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61  0 Request too la
caf0: 72 67 65 22 29 3b 0a 20 20 20 20 20 20 6e 4f 75  rge");.      nOu
cb00: 74 20 2b 3d 20 70 72 69 6e 74 66 28 0a 20 20 20  t += printf(.   
cb10: 20 20 20 20 20 22 43 6f 6e 74 65 6e 74 2d 74 79       "Content-ty
cb20: 70 65 3a 20 74 65 78 74 2f 70 6c 61 69 6e 5c 72  pe: text/plain\r
cb30: 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 5c 72 5c  \n".        "\r\
cb40: 6e 22 0a 20 20 20 20 20 20 20 20 22 54 6f 6f 20  n".        "Too 
cb50: 6d 75 63 68 20 50 4f 53 54 20 64 61 74 61 5c 6e  much POST data\n
cb60: 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ".      );.     
cb70: 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c   MakeLogEntry(0,
cb80: 20 32 37 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 52   270); /* LOG: R
cb90: 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67 65  equest too large
cba0: 20 2a 2f 0a 20 20 20 20 20 20 65 78 69 74 28 30   */.      exit(0
cbb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 72  );.    }.    spr
cbc0: 69 6e 74 66 28 7a 54 6d 70 4e 61 6d 42 75 66 2c  intf(zTmpNamBuf,
cbd0: 20 22 2f 74 6d 70 2f 2d 70 6f 73 74 2d 64 61 74   "/tmp/-post-dat
cbe0: 61 2d 58 58 58 58 58 58 22 29 3b 0a 20 20 20 20  a-XXXXXX");.    
cbf0: 7a 54 6d 70 4e 61 6d 20 3d 20 7a 54 6d 70 4e 61  zTmpNam = zTmpNa
cc00: 6d 42 75 66 3b 0a 20 20 20 20 69 66 28 20 6d 6b  mBuf;.    if( mk
cc10: 73 74 65 6d 70 28 7a 54 6d 70 4e 61 6d 29 3c 30  stemp(zTmpNam)<0
cc20: 20 29 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e   ){.      Malfun
cc30: 63 74 69 6f 6e 28 32 38 30 2c 20 20 2f 2a 20 4c  ction(280,  /* L
cc40: 4f 47 3a 20 6d 6b 73 74 65 6d 70 28 29 20 66 61  OG: mkstemp() fa
cc50: 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  iled */.        
cc60: 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 63         "Cannot c
cc70: 72 65 61 74 65 20 61 20 74 65 6d 70 20 66 69 6c  reate a temp fil
cc80: 65 20 69 6e 20 77 68 69 63 68 20 74 6f 20 73 74  e in which to st
cc90: 6f 72 65 20 50 4f 53 54 20 64 61 74 61 22 29 3b  ore POST data");
cca0: 0a 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 20 3d  .    }.    out =
ccb0: 20 66 6f 70 65 6e 28 7a 54 6d 70 4e 61 6d 2c 22   fopen(zTmpNam,"
ccc0: 77 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  w");.    if( out
ccd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 74 61  ==0 ){.      Sta
cce0: 72 74 52 65 73 70 6f 6e 73 65 28 22 35 30 30 20  rtResponse("500 
ccf0: 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 2f 74  Cannot create /t
cd00: 6d 70 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  mp file");.     
cd10: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
cd20: 0a 20 20 20 20 20 20 20 20 22 43 6f 6e 74 65 6e  .        "Conten
cd30: 74 2d 74 79 70 65 3a 20 74 65 78 74 2f 70 6c 61  t-type: text/pla
cd40: 69 6e 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20  in\r\n".        
cd50: 22 5c 72 5c 6e 22 0a 20 20 20 20 20 20 20 20 22  "\r\n".        "
cd60: 43 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 5c  Could not open \
cd70: 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74 69 6e  "%s\" for writin
cd80: 67 5c 6e 22 2c 20 7a 54 6d 70 4e 61 6d 0a 20 20  g\n", zTmpNam.  
cd90: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4d 61 6b      );.      Mak
cda0: 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20 32 39 30  eLogEntry(0, 290
cdb0: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 63 61 6e 6e 6f  ); /* LOG: canno
cdc0: 74 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69  t create temp fi
cdd0: 6c 65 20 66 6f 72 20 50 4f 53 54 20 2a 2f 0a 20  le for POST */. 
cde0: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
cdf0: 20 20 7d 0a 20 20 20 20 7a 42 75 66 20 3d 20 53    }.    zBuf = S
ce00: 61 66 65 4d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31  afeMalloc( len+1
ce10: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 54   );.    if( useT
ce20: 69 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 31  imeout ) alarm(1
ce30: 35 20 2b 20 6c 65 6e 2f 32 30 30 30 29 3b 0a 20  5 + len/2000);. 
ce40: 20 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75     n = fread(zBu
ce50: 66 2c 31 2c 6c 65 6e 2c 73 74 64 69 6e 29 3b 0a  f,1,len,stdin);.
ce60: 20 20 20 20 6e 49 6e 20 2b 3d 20 6e 3b 0a 20 20      nIn += n;.  
ce70: 20 20 66 77 72 69 74 65 28 7a 42 75 66 2c 31 2c    fwrite(zBuf,1,
ce80: 6e 2c 6f 75 74 29 3b 0a 20 20 20 20 66 72 65 65  n,out);.    free
ce90: 28 7a 42 75 66 29 3b 0a 20 20 20 20 66 63 6c 6f  (zBuf);.    fclo
cea0: 73 65 28 6f 75 74 29 3b 0a 20 20 7d 0a 0a 20 20  se(out);.  }..  
ceb0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
cec0: 20 72 75 6e 6e 69 6e 67 20 74 69 6d 65 20 69 73   running time is
ced0: 20 6e 6f 74 20 74 6f 6f 20 67 72 65 61 74 20 2a   not too great *
cee0: 2f 0a 20 20 69 66 28 20 75 73 65 54 69 6d 65 6f  /.  if( useTimeo
cef0: 75 74 20 29 20 61 6c 61 72 6d 28 31 30 29 3b 0a  ut ) alarm(10);.
cf00: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c  .  /* Convert al
cf10: 6c 20 75 6e 75 73 75 61 6c 20 63 68 61 72 61 63  l unusual charac
cf20: 74 65 72 73 20 69 6e 20 74 68 65 20 73 63 72 69  ters in the scri
cf30: 70 74 20 6e 61 6d 65 20 69 6e 74 6f 20 22 5f 22  pt name into "_"
cf40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
cf50: 20 69 73 20 61 20 64 65 66 65 6e 73 65 20 61 67   is a defense ag
cf60: 61 69 6e 73 74 20 76 61 72 69 6f 75 73 20 61 74  ainst various at
cf70: 74 61 63 6b 73 2c 20 58 53 53 20 61 74 74 61 63  tacks, XSS attac
cf80: 6b 73 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  ks in particular
cf90: 2e 0a 20 20 2a 2f 0a 20 20 73 61 6e 69 74 69 7a  ..  */.  sanitiz
cfa0: 65 53 74 72 69 6e 67 28 7a 53 63 72 69 70 74 29  eString(zScript)
cfb0: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  ;..  /* Do not a
cfc0: 6c 6c 6f 77 20 22 2f 2e 22 20 6f 72 20 22 2f 2d  llow "/." or "/-
cfd0: 22 20 74 6f 20 74 6f 20 6f 63 63 75 72 20 61 6e  " to to occur an
cfe0: 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 65 6e  ywhere in the en
cff0: 74 69 74 79 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  tity name..  ** 
d000: 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 61 74  This prevents at
d010: 74 61 63 6b 73 20 69 6e 76 6f 6c 76 69 6e 67 20  tacks involving 
d020: 22 2e 2e 22 20 61 6e 64 20 61 6c 73 6f 20 61 6c  ".." and also al
d030: 6c 6f 77 73 20 75 73 20 74 6f 20 63 72 65 61 74  lows us to creat
d040: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 61 6e 64  e.  ** files and
d050: 20 64 69 72 65 63 74 6f 72 69 65 73 20 77 68 6f   directories who
d060: 73 65 20 6e 61 6d 65 73 20 62 65 67 69 6e 20 77  se names begin w
d070: 69 74 68 20 22 2d 22 20 6f 72 20 22 2e 22 20 77  ith "-" or "." w
d080: 68 69 63 68 20 61 72 65 0a 20 20 2a 2a 20 69 6e  hich are.  ** in
d090: 76 69 73 69 62 6c 65 20 74 6f 20 74 68 65 20 77  visible to the w
d0a0: 65 62 73 65 72 76 65 72 2e 0a 20 20 2a 2a 0a 20  ebserver..  **. 
d0b0: 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
d0c0: 41 6c 6c 6f 77 20 74 68 65 20 22 2f 2e 77 65 6c  Allow the "/.wel
d0d0: 6c 2d 6b 6e 6f 77 6e 2f 22 20 70 72 65 66 69 78  l-known/" prefix
d0e0: 20 69 6e 20 61 63 63 6f 72 64 61 6e 63 65 20 77   in accordance w
d0f0: 69 74 68 0a 20 20 2a 2a 20 52 46 43 2d 35 37 38  ith.  ** RFC-578
d100: 35 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 7a 3d 7a  5.  */.  for(z=z
d110: 53 63 72 69 70 74 3b 20 2a 7a 3b 20 7a 2b 2b 29  Script; *z; z++)
d120: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f  {.    if( *z=='/
d130: 27 20 26 26 20 28 7a 5b 31 5d 3d 3d 27 2e 27 20  ' && (z[1]=='.' 
d140: 7c 7c 20 7a 5b 31 5d 3d 3d 27 2d 27 29 0a 20 20  || z[1]=='-').  
d150: 20 20 20 26 26 20 28 7a 3e 7a 53 63 72 69 70 74     && (z>zScript
d160: 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 2c 22 2f   || strncmp(z,"/
d170: 2e 77 65 6c 6c 2d 6b 6e 6f 77 6e 2f 22 2c 31 33  .well-known/",13
d180: 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
d190: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 30 30      NotFound(300
d1a0: 29 3b 20 2f 2a 20 4c 4f 47 3a 20 50 61 74 68 20  ); /* LOG: Path 
d1b0: 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20 77  element begins w
d1c0: 69 74 68 20 22 2e 22 20 6f 72 20 22 2d 22 20 2a  ith "." or "-" *
d1d0: 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  /.    }.  }..  /
d1e0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61  * Figure out wha
d1f0: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
d200: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 73 68 6f  e filesystem sho
d210: 75 6c 64 20 62 65 2e 20 20 49 66 20 74 68 65 0a  uld be.  If the.
d220: 20 20 2a 2a 20 48 54 54 50 5f 48 4f 53 54 20 70    ** HTTP_HOST p
d230: 61 72 61 6d 65 74 65 72 20 65 78 69 73 74 73 20  arameter exists 
d240: 28 73 74 6f 72 65 64 20 69 6e 20 7a 48 74 74 70  (stored in zHttp
d250: 48 6f 73 74 29 20 74 68 65 6e 20 72 65 6d 6f 76  Host) then remov
d260: 65 20 74 68 65 0a 20 20 2a 2a 20 70 6f 72 74 20  e the.  ** port 
d270: 6e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  number from the 
d280: 65 6e 64 20 28 69 66 20 61 6e 79 29 2c 20 63 6f  end (if any), co
d290: 6e 76 65 72 74 20 61 6c 6c 20 63 68 61 72 61 63  nvert all charac
d2a0: 74 65 72 73 20 74 6f 20 6c 6f 77 65 72 0a 20 20  ters to lower.  
d2b0: 2a 2a 20 63 61 73 65 2c 20 61 6e 64 20 63 6f 6e  ** case, and con
d2c0: 76 65 72 74 20 61 6c 6c 20 22 2e 22 20 74 6f 20  vert all "." to 
d2d0: 22 5f 22 2e 20 20 54 68 65 6e 20 74 72 79 20 74  "_".  Then try t
d2e0: 6f 20 66 69 6e 64 20 61 20 64 69 72 65 63 74 6f  o find a directo
d2f0: 72 79 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 61  ry.  ** with tha
d300: 74 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 65  t name and the e
d310: 78 74 65 6e 73 69 6f 6e 20 2e 77 65 62 73 69 74  xtension .websit
d320: 65 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  e.  If not found
d330: 2c 20 6c 6f 6f 6b 0a 20 20 2a 2a 20 66 6f 72 20  , look.  ** for 
d340: 22 64 65 66 61 75 6c 74 2e 77 65 62 73 69 74 65  "default.website
d350: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53  "..  */.  if( zS
d360: 63 72 69 70 74 5b 30 5d 21 3d 27 2f 27 20 29 7b  cript[0]!='/' ){
d370: 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 31  .    NotFound(31
d380: 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 55 52 49 20  0); /* LOG: URI 
d390: 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 20 77  does not start w
d3a0: 69 74 68 20 22 2f 22 20 2a 2f 0a 20 20 7d 0a 20  ith "/" */.  }. 
d3b0: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 52 6f 6f   if( strlen(zRoo
d3c0: 74 29 2b 34 30 20 3e 3d 20 73 69 7a 65 6f 66 28  t)+40 >= sizeof(
d3d0: 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20 20 20 4e  zLine) ){.     N
d3e0: 6f 74 46 6f 75 6e 64 28 33 32 30 29 3b 20 2f 2a  otFound(320); /*
d3f0: 20 4c 4f 47 3a 20 55 52 49 20 74 6f 6f 20 6c 6f   LOG: URI too lo
d400: 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
d410: 7a 48 74 74 70 48 6f 73 74 3d 3d 30 20 7c 7c 20  zHttpHost==0 || 
d420: 7a 48 74 74 70 48 6f 73 74 5b 30 5d 3d 3d 30 20  zHttpHost[0]==0 
d430: 29 7b 0a 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28  ){.    NotFound(
d440: 33 33 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 4d  330);  /* LOG: M
d450: 69 73 73 69 6e 67 20 48 4f 53 54 3a 20 70 61 72  issing HOST: par
d460: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 7d 65 6c 73  ameter */.  }els
d470: 65 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 48 74  e if( strlen(zHt
d480: 74 70 48 6f 73 74 29 2b 73 74 72 6c 65 6e 28 7a  tpHost)+strlen(z
d490: 52 6f 6f 74 29 2b 31 30 20 3e 3d 20 73 69 7a 65  Root)+10 >= size
d4a0: 6f 66 28 7a 4c 69 6e 65 29 20 29 7b 0a 20 20 20  of(zLine) ){.   
d4b0: 20 4e 6f 74 46 6f 75 6e 64 28 33 34 30 29 3b 20   NotFound(340); 
d4c0: 20 2f 2a 20 4c 4f 47 3a 20 48 4f 53 54 20 70 61   /* LOG: HOST pa
d4d0: 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f 6e 67  rameter too long
d4e0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
d4f0: 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
d500: 22 25 73 2f 25 73 22 2c 20 7a 52 6f 6f 74 2c 20  "%s/%s", zRoot, 
d510: 7a 48 74 74 70 48 6f 73 74 29 3b 0a 20 20 20 20  zHttpHost);.    
d520: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 52 6f  for(i=strlen(zRo
d530: 6f 74 29 2b 31 3b 20 7a 4c 69 6e 65 5b 69 5d 20  ot)+1; zLine[i] 
d540: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 3a 27  && zLine[i]!=':'
d550: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d560: 74 20 63 20 3d 20 7a 4c 69 6e 65 5b 69 5d 3b 0a  t c = zLine[i];.
d570: 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e        if( !isaln
d580: 75 6d 28 63 29 20 29 7b 0a 20 20 20 20 20 20 20  um(c) ){.       
d590: 20 7a 4c 69 6e 65 5b 69 5d 20 3d 20 27 5f 27 3b   zLine[i] = '_';
d5a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d5b0: 20 69 73 75 70 70 65 72 28 63 29 20 29 7b 0a 20   isupper(c) ){. 
d5c0: 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20         zLine[i] 
d5d0: 3d 20 74 6f 6c 6f 77 65 72 28 63 29 3b 0a 20 20  = tolower(c);.  
d5e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d5f0: 73 74 72 63 70 79 28 26 7a 4c 69 6e 65 5b 69 5d  strcpy(&zLine[i]
d600: 2c 20 22 2e 77 65 62 73 69 74 65 22 29 3b 0a 20  , ".website");. 
d610: 20 7d 0a 20 20 69 66 28 20 73 74 61 74 28 7a 4c   }.  if( stat(zL
d620: 69 6e 65 2c 26 73 74 61 74 62 75 66 29 20 7c 7c  ine,&statbuf) ||
d630: 20 21 53 5f 49 53 44 49 52 28 73 74 61 74 62 75   !S_ISDIR(statbu
d640: 66 2e 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20  f.st_mode) ){.  
d650: 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c    sprintf(zLine,
d660: 20 22 25 73 2f 64 65 66 61 75 6c 74 2e 77 65 62   "%s/default.web
d670: 73 69 74 65 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20  site", zRoot);. 
d680: 20 20 20 69 66 28 20 73 74 61 74 28 7a 4c 69 6e     if( stat(zLin
d690: 65 2c 26 73 74 61 74 62 75 66 29 20 7c 7c 20 21  e,&statbuf) || !
d6a0: 53 5f 49 53 44 49 52 28 73 74 61 74 62 75 66 2e  S_ISDIR(statbuf.
d6b0: 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20  st_mode) ){.    
d6c0: 20 20 69 66 28 20 73 74 61 6e 64 61 6c 6f 6e 65    if( standalone
d6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69   ){.        spri
d6e0: 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73 22 2c  ntf(zLine, "%s",
d6f0: 20 7a 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 7d   zRoot);.      }
d700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 6f  else{.        No
d710: 74 46 6f 75 6e 64 28 33 35 30 29 3b 20 20 2f 2a  tFound(350);  /*
d720: 20 4c 4f 47 3a 20 2a 2e 77 65 62 73 69 74 65 20   LOG: *.website 
d730: 70 65 72 6d 69 73 73 69 6f 6e 73 20 2a 2f 0a 20  permissions */. 
d740: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d750: 0a 20 20 7a 48 6f 6d 65 20 3d 20 53 74 72 44 75  .  zHome = StrDu
d760: 70 28 7a 4c 69 6e 65 29 3b 0a 0a 20 20 2f 2a 20  p(zLine);..  /* 
d770: 43 68 61 6e 67 65 20 64 69 72 65 63 74 6f 72 69  Change directori
d780: 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6f  es to the root o
d790: 66 20 74 68 65 20 48 54 54 50 20 66 69 6c 65 73  f the HTTP files
d7a0: 79 73 74 65 6d 0a 20 20 2a 2f 0a 20 20 69 66 28  ystem.  */.  if(
d7b0: 20 63 68 64 69 72 28 7a 48 6f 6d 65 29 21 3d 30   chdir(zHome)!=0
d7c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
d7d0: 66 5b 31 30 30 30 5d 3b 0a 20 20 20 20 4d 61 6c  f[1000];.    Mal
d7e0: 66 75 6e 63 74 69 6f 6e 28 33 36 30 2c 20 20 2f  function(360,  /
d7f0: 2a 20 4c 4f 47 3a 20 63 68 64 69 72 28 29 20 66  * LOG: chdir() f
d800: 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  ailed */.       
d810: 20 20 22 63 61 6e 6e 6f 74 20 63 68 64 69 72 20    "cannot chdir 
d820: 74 6f 20 5b 25 73 5d 20 66 72 6f 6d 20 5b 25 73  to [%s] from [%s
d830: 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 48 6f  ]",.         zHo
d840: 6d 65 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c  me, getcwd(zBuf,
d850: 39 39 39 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  999));.  }..  /*
d860: 20 4c 6f 63 61 74 65 20 74 68 65 20 66 69 6c 65   Locate the file
d870: 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
d880: 65 6d 2e 20 20 57 65 20 6d 69 67 68 74 20 68 61  em.  We might ha
d890: 76 65 20 74 6f 20 61 70 70 65 6e 64 0a 20 20 2a  ve to append.  *
d8a0: 2a 20 74 68 65 20 6e 61 6d 65 20 22 69 6e 64 65  * the name "inde
d8b0: 78 2e 68 74 6d 6c 22 20 69 6e 20 6f 72 64 65 72  x.html" in order
d8c0: 20 74 6f 20 66 69 6e 64 20 69 74 2e 20 20 41 6e   to find it.  An
d8d0: 79 20 65 78 63 65 73 73 20 70 61 74 68 0a 20 20  y excess path.  
d8e0: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ** information i
d8f0: 73 20 70 75 74 20 69 6e 74 6f 20 74 68 65 20 7a  s put into the z
d900: 50 61 74 68 49 6e 66 6f 20 76 61 72 69 61 62 6c  PathInfo variabl
d910: 65 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 6a 30  e..  */.  j = j0
d920: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
d930: 4c 69 6e 65 29 3b 0a 20 20 69 20 3d 20 30 3b 0a  Line);.  i = 0;.
d940: 20 20 77 68 69 6c 65 28 20 7a 53 63 72 69 70 74    while( zScript
d950: 5b 69 5d 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  [i] ){.    while
d960: 28 20 7a 53 63 72 69 70 74 5b 69 5d 20 26 26 20  ( zScript[i] && 
d970: 28 69 3d 3d 30 20 7c 7c 20 7a 53 63 72 69 70 74  (i==0 || zScript
d980: 5b 69 5d 21 3d 27 2f 27 29 20 29 7b 0a 20 20 20  [i]!='/') ){.   
d990: 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53     zLine[j] = zS
d9a0: 63 72 69 70 74 5b 69 5d 3b 0a 20 20 20 20 20 20  cript[i];.      
d9b0: 69 2b 2b 3b 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a  i++; j++;.    }.
d9c0: 20 20 20 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 30      zLine[j] = 0
d9d0: 3b 0a 20 20 20 20 69 66 28 20 73 74 61 74 28 7a  ;.    if( stat(z
d9e0: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d  Line,&statbuf)!=
d9f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  0 ){.      int s
da00: 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 3d 20  tillSearching = 
da10: 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  1;.      while( 
da20: 73 74 69 6c 6c 53 65 61 72 63 68 69 6e 67 20 26  stillSearching &
da30: 26 20 69 3e 30 20 26 26 20 6a 3e 6a 30 20 29 7b  & i>0 && j>j0 ){
da40: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
da50: 6a 3e 6a 30 20 26 26 20 7a 4c 69 6e 65 5b 6a 2d  j>j0 && zLine[j-
da60: 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20  1]!='/' ){ j--; 
da70: 7d 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79  }.        strcpy
da80: 28 26 7a 4c 69 6e 65 5b 6a 2d 31 5d 2c 20 22 2f  (&zLine[j-1], "/
da90: 6e 6f 74 2d 66 6f 75 6e 64 2e 68 74 6d 6c 22 29  not-found.html")
daa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
dab0: 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61 74 62 75  at(zLine,&statbu
dac0: 66 29 3d 3d 30 20 26 26 20 53 5f 49 53 52 45 47  f)==0 && S_ISREG
dad0: 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65  (statbuf.st_mode
dae0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
daf0: 20 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f   access(zLine,R_
db00: 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OK)==0 ){.      
db10: 20 20 20 20 7a 52 65 61 6c 53 63 72 69 70 74 20      zRealScript 
db20: 3d 20 53 74 72 44 75 70 28 26 7a 4c 69 6e 65 5b  = StrDup(&zLine[
db30: 6a 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  j0]);.          
db40: 52 65 64 69 72 65 63 74 28 7a 52 65 61 6c 53 63  Redirect(zRealSc
db50: 72 69 70 74 2c 20 31 2c 20 33 37 30 29 3b 20 2f  ript, 1, 370); /
db60: 2a 20 4c 4f 47 3a 20 72 65 64 69 72 65 63 74 20  * LOG: redirect 
db70: 74 6f 20 6e 6f 74 2d 66 6f 75 6e 64 20 2a 2f 0a  to not-found */.
db80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
db90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
dba0: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
dbb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbc0: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 69 6c  }.      if( stil
dbd0: 6c 53 65 61 72 63 68 69 6e 67 20 29 20 4e 6f 74  lSearching ) Not
dbe0: 46 6f 75 6e 64 28 33 38 30 29 3b 20 2f 2a 20 4c  Found(380); /* L
dbf0: 4f 47 3a 20 55 52 49 20 6e 6f 74 20 66 6f 75 6e  OG: URI not foun
dc00: 64 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  d */.      break
dc10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
dc20: 53 5f 49 53 52 45 47 28 73 74 61 74 62 75 66 2e  S_ISREG(statbuf.
dc30: 73 74 5f 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20  st_mode) ){.    
dc40: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69    if( access(zLi
dc50: 6e 65 2c 52 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  ne,R_OK) ){.    
dc60: 20 20 20 20 4e 6f 74 46 6f 75 6e 64 28 33 39 30      NotFound(390
dc70: 29 3b 20 20 2f 2a 20 4c 4f 47 3a 20 46 69 6c 65  );  /* LOG: File
dc80: 20 6e 6f 74 20 72 65 61 64 61 62 6c 65 20 2a 2f   not readable */
dc90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
dca0: 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72  RealScript = Str
dcb0: 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b  Dup(&zLine[j0]);
dcc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dcd0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 53 63 72    }.    if( zScr
dce0: 69 70 74 5b 69 5d 3d 3d 30 20 7c 7c 20 7a 53 63  ipt[i]==0 || zSc
dcf0: 72 69 70 74 5b 69 2b 31 5d 3d 3d 30 20 29 7b 0a  ript[i+1]==0 ){.
dd00: 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 6a 3e        int k = j>
dd10: 30 20 26 26 20 7a 4c 69 6e 65 5b 6a 2d 31 5d 3d  0 && zLine[j-1]=
dd20: 3d 27 2f 27 20 3f 20 6a 2d 31 20 3a 20 6a 3b 0a  ='/' ? j-1 : j;.
dd30: 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 4c        strcpy(&zL
dd40: 69 6e 65 5b 6b 5d 2c 22 2f 69 6e 64 65 78 2e 68  ine[k],"/index.h
dd50: 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 69 66 28  tml");.      if(
dd60: 20 73 74 61 74 28 7a 4c 69 6e 65 2c 26 73 74 61   stat(zLine,&sta
dd70: 74 62 75 66 29 21 3d 30 20 7c 7c 20 21 53 5f 49  tbuf)!=0 || !S_I
dd80: 53 52 45 47 28 73 74 61 74 62 75 66 2e 73 74 5f  SREG(statbuf.st_
dd90: 6d 6f 64 65 29 20 0a 20 20 20 20 20 20 7c 7c 20  mode) .      || 
dda0: 61 63 63 65 73 73 28 7a 4c 69 6e 65 2c 52 5f 4f  access(zLine,R_O
ddb0: 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  K) ){.        st
ddc0: 72 63 70 79 28 26 7a 4c 69 6e 65 5b 6b 5d 2c 22  rcpy(&zLine[k],"
ddd0: 2f 69 6e 64 65 78 2e 63 67 69 22 29 3b 0a 20 20  /index.cgi");.  
dde0: 20 20 20 20 20 20 69 66 28 20 73 74 61 74 28 7a        if( stat(z
ddf0: 4c 69 6e 65 2c 26 73 74 61 74 62 75 66 29 21 3d  Line,&statbuf)!=
de00: 30 20 7c 7c 20 21 53 5f 49 53 52 45 47 28 73 74  0 || !S_ISREG(st
de10: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 0a  atbuf.st_mode) .
de20: 20 20 20 20 20 20 20 20 7c 7c 20 61 63 63 65 73          || acces
de30: 73 28 7a 4c 69 6e 65 2c 52 5f 4f 4b 29 20 29 7b  s(zLine,R_OK) ){
de40: 0a 20 20 20 20 20 20 20 20 20 20 4e 6f 74 46 6f  .          NotFo
de50: 75 6e 64 28 34 30 30 29 3b 20 2f 2a 20 4c 4f 47  und(400); /* LOG
de60: 3a 20 55 52 49 20 69 73 20 61 20 64 69 72 65 63  : URI is a direc
de70: 74 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e 68  tory w/o index.h
de80: 74 6d 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  tml */.        }
de90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
dea0: 52 65 61 6c 53 63 72 69 70 74 20 3d 20 53 74 72  RealScript = Str
deb0: 44 75 70 28 26 7a 4c 69 6e 65 5b 6a 30 5d 29 3b  Dup(&zLine[j0]);
dec0: 0a 20 20 20 20 20 20 69 66 28 20 7a 53 63 72 69  .      if( zScri
ded0: 70 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  pt[i]==0 ){.    
dee0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
def0: 71 75 65 73 74 65 64 20 55 52 4c 20 64 6f 65 73  quested URL does
df00: 20 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 2f   not end with "/
df10: 22 20 62 75 74 20 77 65 20 68 61 64 20 74 6f 0a  " but we had to.
df20: 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 65 6e          ** appen
df30: 64 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 2c 20  d "index.html", 
df40: 74 68 65 6e 20 61 20 72 65 64 69 72 65 63 74 20  then a redirect 
df50: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 4f  is necessary.  O
df60: 74 68 65 72 77 69 73 65 0a 20 20 20 20 20 20 20  therwise.       
df70: 20 2a 2a 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   ** none of the 
df80: 72 65 6c 61 74 69 76 65 20 55 52 4c 73 20 69 6e  relative URLs in
df90: 20 74 68 65 20 64 65 6c 69 76 65 72 65 64 20 64   the delivered d
dfa0: 6f 63 75 6d 65 6e 74 20 77 69 6c 6c 20 62 65 0a  ocument will be.
dfb0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65          ** corre
dfc0: 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 52  ct. */.        R
dfd0: 65 64 69 72 65 63 74 28 7a 52 65 61 6c 53 63 72  edirect(zRealScr
dfe0: 69 70 74 2c 31 2c 34 31 30 29 3b 20 2f 2a 20 4c  ipt,1,410); /* L
dff0: 4f 47 3a 20 72 65 64 69 72 65 63 74 20 74 6f 20  OG: redirect to 
e000: 61 64 64 20 74 72 61 69 6c 69 6e 67 20 2f 20 2a  add trailing / *
e010: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
e020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e030: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e040: 20 7a 4c 69 6e 65 5b 6a 5d 20 3d 20 7a 53 63 72   zLine[j] = zScr
e050: 69 70 74 5b 69 5d 3b 0a 20 20 20 20 69 2b 2b 3b  ipt[i];.    i++;
e060: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c   j++;.  }.  zFil
e070: 65 20 3d 20 53 74 72 44 75 70 28 7a 4c 69 6e 65  e = StrDup(zLine
e080: 29 3b 0a 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d  );.  zPathInfo =
e090: 20 53 74 72 44 75 70 28 26 7a 53 63 72 69 70 74   StrDup(&zScript
e0a0: 5b 69 5d 29 3b 0a 20 20 6c 65 6e 46 69 6c 65 20  [i]);.  lenFile 
e0b0: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 3b  = strlen(zFile);
e0c0: 0a 20 20 7a 44 69 72 20 3d 20 53 74 72 44 75 70  .  zDir = StrDup
e0d0: 28 7a 46 69 6c 65 29 3b 0a 20 20 66 6f 72 28 69  (zFile);.  for(i
e0e0: 3d 73 74 72 6c 65 6e 28 7a 44 69 72 29 2d 31 3b  =strlen(zDir)-1;
e0f0: 20 69 3e 30 20 26 26 20 7a 44 69 72 5b 69 5d 21   i>0 && zDir[i]!
e100: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 3b 0a 20 20  ='/'; i--){};.  
e110: 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20  if( i==0 ){.    
e120: 20 73 74 72 63 70 79 28 7a 44 69 72 2c 22 2f 22   strcpy(zDir,"/"
e130: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e140: 20 7a 44 69 72 5b 69 5d 20 3d 20 30 3b 0a 20 20   zDir[i] = 0;.  
e150: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
e160: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
e170: 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
e180: 6e 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  n file.  If ther
e190: 65 20 69 73 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  e is,.  ** proce
e1a0: 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73 70  ss it..  */.  sp
e1b0: 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 25 73  rintf(zLine, "%s
e1c0: 2f 2d 61 75 74 68 22 2c 20 7a 44 69 72 29 3b 0a  /-auth", zDir);.
e1d0: 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4c 69    if( access(zLi
e1e0: 6e 65 2c 52 5f 4f 4b 29 3d 3d 30 20 26 26 20 21  ne,R_OK)==0 && !
e1f0: 43 68 65 63 6b 42 61 73 69 63 41 75 74 68 6f 72  CheckBasicAuthor
e200: 69 7a 61 74 69 6f 6e 28 7a 4c 69 6e 65 29 20 29  ization(zLine) )
e210: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
e220: 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  ake appropriate 
e230: 61 63 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  action.  */.  if
e240: 28 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  ( (statbuf.st_mo
e250: 64 65 20 26 20 30 31 30 30 29 3d 3d 30 31 30 30  de & 0100)==0100
e260: 20 26 26 20 61 63 63 65 73 73 28 7a 46 69 6c 65   && access(zFile
e270: 2c 58 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ,X_OK)==0 ){.   
e280: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
e290: 6f 6c 6c 6f 77 69 6e 67 73 20 73 74 61 74 69 63  ollowings static
e2a0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75   variables are u
e2b0: 73 65 64 20 74 6f 20 73 65 74 75 70 20 74 68 65  sed to setup the
e2c0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 0a 20 20 20   environment.   
e2d0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 43 47 49 20   ** for the CGI 
e2e0: 73 63 72 69 70 74 0a 20 20 20 20 2a 2f 0a 20 20  script.    */.  
e2f0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 64    static char *d
e300: 65 66 61 75 6c 74 5f 70 61 74 68 20 3d 20 22 2f  efault_path = "/
e310: 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
e320: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
e330: 67 61 74 65 77 61 79 5f 69 6e 74 65 72 66 61 63  gateway_interfac
e340: 65 20 3d 20 22 43 47 49 2f 31 2e 30 22 3b 0a 20  e = "CGI/1.0";. 
e350: 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
e360: 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
e370: 45 6e 76 4e 61 6d 65 3b 0a 20 20 20 20 20 20 63  EnvName;.      c
e380: 68 61 72 20 2a 2a 70 7a 45 6e 76 56 61 6c 75 65  har **pzEnvValue
e390: 3b 0a 20 20 20 20 7d 20 63 67 69 65 6e 76 5b 5d  ;.    } cgienv[]
e3a0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 41 55   = {.      { "AU
e3b0: 54 48 5f 54 59 50 45 22 2c 20 20 20 20 20 20 20  TH_TYPE",       
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 41 75              &zAu
e3d0: 74 68 54 79 70 65 20 7d 2c 0a 20 20 20 20 20 20  thType },.      
e3e0: 7b 20 22 41 55 54 48 5f 43 4f 4e 54 45 4e 54 22  { "AUTH_CONTENT"
e3f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e400: 20 26 7a 41 75 74 68 41 72 67 20 7d 2c 0a 20 20   &zAuthArg },.  
e410: 20 20 20 20 7b 20 22 43 4f 4e 54 45 4e 54 5f 4c      { "CONTENT_L
e420: 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
e430: 20 20 20 20 20 26 7a 43 6f 6e 74 65 6e 74 4c 65       &zContentLe
e440: 6e 67 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ngth },.      { 
e450: 22 43 4f 4e 54 45 4e 54 5f 54 59 50 45 22 2c 20  "CONTENT_TYPE", 
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e470: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 7d 2c 0a  zContentType },.
e480: 20 20 20 20 20 20 7b 20 22 44 4f 43 55 4d 45 4e        { "DOCUMEN
e490: 54 5f 52 4f 4f 54 22 2c 20 20 20 20 20 20 20 20  T_ROOT",        
e4a0: 20 20 20 20 20 20 20 26 7a 48 6f 6d 65 20 7d 2c         &zHome },
e4b0: 0a 20 20 20 20 20 20 7b 20 22 47 41 54 45 57 41  .      { "GATEWA
e4c0: 59 5f 49 4e 54 45 52 46 41 43 45 22 2c 20 20 20  Y_INTERFACE",   
e4d0: 20 20 20 20 20 20 20 20 26 67 61 74 65 77 61 79          &gateway
e4e0: 5f 69 6e 74 65 72 66 61 63 65 20 7d 2c 0a 20 20  _interface },.  
e4f0: 20 20 20 20 7b 20 22 48 54 54 50 5f 41 43 43 45      { "HTTP_ACCE
e500: 50 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  PT",            
e510: 20 20 20 20 20 26 7a 41 63 63 65 70 74 20 7d 2c       &zAccept },
e520: 0a 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 41  .      { "HTTP_A
e530: 43 43 45 50 54 5f 45 4e 43 4f 44 49 4e 47 22 2c  CCEPT_ENCODING",
e540: 20 20 20 20 20 20 20 20 26 7a 41 63 63 65 70 74          &zAccept
e550: 45 6e 63 6f 64 69 6e 67 20 7d 2c 0a 20 20 20 20  Encoding },.    
e560: 20 20 7b 20 22 48 54 54 50 5f 43 4f 4f 4b 49 45    { "HTTP_COOKIE
e570: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
e580: 20 20 20 26 7a 43 6f 6f 6b 69 65 20 7d 2c 0a 20     &zCookie },. 
e590: 20 20 20 20 20 7b 20 22 48 54 54 50 5f 48 4f 53       { "HTTP_HOS
e5a0: 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  T",             
e5b0: 20 20 20 20 20 20 26 7a 48 74 74 70 48 6f 73 74        &zHttpHost
e5c0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 48 54 54   },.      { "HTT
e5d0: 50 5f 49 46 5f 4d 4f 44 49 46 49 45 44 5f 53 49  P_IF_MODIFIED_SI
e5e0: 4e 43 45 22 2c 20 20 20 20 20 20 26 7a 49 66 4d  NCE",      &zIfM
e5f0: 6f 64 69 66 69 65 64 53 69 6e 63 65 20 7d 2c 0a  odifiedSince },.
e600: 20 20 20 20 20 20 7b 20 22 48 54 54 50 5f 49 46        { "HTTP_IF
e610: 5f 4e 4f 4e 45 5f 4d 41 54 43 48 22 2c 20 20 20  _NONE_MATCH",   
e620: 20 20 20 20 20 20 20 26 7a 49 66 4e 6f 6e 65 4d         &zIfNoneM
e630: 61 74 63 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20  atch },.      { 
e640: 22 48 54 54 50 5f 52 45 46 45 52 45 52 22 2c 20  "HTTP_REFERER", 
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e660: 7a 52 65 66 65 72 65 72 20 7d 2c 0a 20 20 20 20  zReferer },.    
e670: 20 20 7b 20 22 48 54 54 50 5f 55 53 45 52 5f 41    { "HTTP_USER_A
e680: 47 45 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  GENT",          
e690: 20 20 20 26 7a 41 67 65 6e 74 20 7d 2c 0a 20 20     &zAgent },.  
e6a0: 20 20 20 20 7b 20 22 50 41 54 48 22 2c 20 20 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 26 64 65 66 61 75 6c 74 5f 70 61       &default_pa
e6d0: 74 68 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 50  th },.      { "P
e6e0: 41 54 48 5f 49 4e 46 4f 22 2c 20 20 20 20 20 20  ATH_INFO",      
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 50               &zP
e700: 61 74 68 49 6e 66 6f 20 7d 2c 0a 20 20 20 20 20  athInfo },.     
e710: 20 7b 20 22 51 55 45 52 59 5f 53 54 52 49 4e 47   { "QUERY_STRING
e720: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
e730: 20 20 26 7a 51 75 65 72 79 53 74 72 69 6e 67 20    &zQueryString 
e740: 7d 2c 0a 20 20 20 20 20 20 7b 20 22 52 45 4d 4f  },.      { "REMO
e750: 54 45 5f 41 44 44 52 22 2c 20 20 20 20 20 20 20  TE_ADDR",       
e760: 20 20 20 20 20 20 20 20 20 20 26 7a 52 65 6d 6f            &zRemo
e770: 74 65 41 64 64 72 20 7d 2c 0a 20 20 20 20 20 20  teAddr },.      
e780: 7b 20 22 52 45 51 55 45 53 54 5f 4d 45 54 48 4f  { "REQUEST_METHO
e790: 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  D",             
e7a0: 20 26 7a 4d 65 74 68 6f 64 20 7d 2c 0a 20 20 20   &zMethod },.   
e7b0: 20 20 20 7b 20 22 52 45 51 55 45 53 54 5f 55 52     { "REQUEST_UR
e7c0: 49 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  I",             
e7d0: 20 20 20 20 26 7a 53 63 72 69 70 74 20 7d 2c 0a      &zScript },.
e7e0: 20 20 20 20 20 20 7b 20 22 52 45 4d 4f 54 45 5f        { "REMOTE_
e7f0: 55 53 45 52 22 2c 20 20 20 20 20 20 20 20 20 20  USER",          
e800: 20 20 20 20 20 20 20 26 7a 52 65 6d 6f 74 65 55         &zRemoteU
e810: 73 65 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ser },.      { "
e820: 53 43 52 49 50 54 5f 44 49 52 45 43 54 4f 52 59  SCRIPT_DIRECTORY
e830: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ",            &z
e840: 44 69 72 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  Dir },.      { "
e850: 53 43 52 49 50 54 5f 46 49 4c 45 4e 41 4d 45 22  SCRIPT_FILENAME"
e860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a  ,             &z
e870: 46 69 6c 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20  File },.      { 
e880: 22 53 43 52 49 50 54 5f 4e 41 4d 45 22 2c 20 20  "SCRIPT_NAME",  
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e8a0: 7a 52 65 61 6c 53 63 72 69 70 74 20 7d 2c 0a 20  zRealScript },. 
e8b0: 20 20 20 20 20 7b 20 22 53 45 52 56 45 52 5f 4e       { "SERVER_N
e8c0: 41 4d 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  AME",           
e8d0: 20 20 20 20 20 20 26 7a 53 65 72 76 65 72 4e 61        &zServerNa
e8e0: 6d 65 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  me },.      { "S
e8f0: 45 52 56 45 52 5f 50 4f 52 54 22 2c 20 20 20 20  ERVER_PORT",    
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 53               &zS
e910: 65 72 76 65 72 50 6f 72 74 20 7d 2c 0a 20 20 20  erverPort },.   
e920: 20 20 20 7b 20 22 53 45 52 56 45 52 5f 50 52 4f     { "SERVER_PRO
e930: 54 4f 43 4f 4c 22 2c 20 20 20 20 20 20 20 20 20  TOCOL",         
e940: 20 20 20 20 26 7a 50 72 6f 74 6f 63 6f 6c 20 7d      &zProtocol }
e950: 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61  ,.    };.    cha
e960: 72 20 2a 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65  r *zBaseFilename
e970: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
e980: 65 6e 61 6d 65 20 77 69 74 68 6f 75 74 20 64 69  ename without di
e990: 72 65 63 74 6f 72 79 20 70 72 65 66 69 78 20 2a  rectory prefix *
e9a0: 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f  /.    int seenCo
e9b0: 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 30 3b  ntentLength = 0;
e9c0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 43 6f     /* True if Co
e9d0: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 68 65  ntent-length: he
e9e0: 61 64 65 72 20 73 65 65 6e 20 2a 2f 0a 20 20 20  ader seen */.   
e9f0: 20 69 6e 74 20 6e 52 65 73 20 3d 20 30 3b 20 20   int nRes = 0;  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea10: 20 42 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   Bytes of payloa
ea20: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61  d */.    int nMa
ea30: 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20  lloc = 0;       
ea40: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
ea50: 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
ea60: 64 20 74 6f 20 61 52 65 73 20 2a 2f 0a 20 20 20  d to aRes */.   
ea70: 20 63 68 61 72 20 2a 61 52 65 73 20 3d 20 30 3b   char *aRes = 0;
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea90: 20 50 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 20   Payload */..   
eaa0: 20 2f 2a 20 49 66 20 69 74 73 20 65 78 65 63 75   /* If its execu
eab0: 74 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62  table, it must b
eac0: 65 20 61 20 43 47 49 20 70 72 6f 67 72 61 6d 2e  e a CGI program.
ead0: 20 20 53 74 61 72 74 20 62 79 0a 20 20 20 20 2a    Start by.    *
eae0: 2a 20 63 68 61 6e 67 69 6e 67 20 64 69 72 65 63  * changing direc
eaf0: 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 64 69  tories to the di
eb00: 72 65 63 74 6f 72 79 20 68 6f 6c 64 69 6e 67 20  rectory holding 
eb10: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20  the program..   
eb20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 68 64 69   */.    if( chdi
eb30: 72 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  r(zDir) ){.     
eb40: 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
eb50: 3b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74  ;.      Malfunct
eb60: 69 6f 6e 28 34 32 30 2c 20 2f 2a 20 4c 4f 47 3a  ion(420, /* LOG:
eb70: 20 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 20   chdir() failed 
eb80: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 22 63  */.           "c
eb90: 61 6e 6e 6f 74 20 63 68 64 69 72 20 74 6f 20 5b  annot chdir to [
eba0: 25 73 5d 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20  %s] from [%s]", 
ebb0: 0a 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72  .           zDir
ebc0: 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 39 39  , getcwd(zBuf,99
ebd0: 39 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  9));.    }..    
ebe0: 2f 2a 20 53 65 74 75 70 20 74 68 65 20 65 6e 76  /* Setup the env
ebf0: 69 72 6f 6e 6d 65 6e 74 20 61 70 70 72 6f 70 72  ironment appropr
ec00: 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  iately..    */. 
ec10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
ec20: 6e 74 29 28 73 69 7a 65 6f 66 28 63 67 69 65 6e  nt)(sizeof(cgien
ec30: 76 29 2f 73 69 7a 65 6f 66 28 63 67 69 65 6e 76  v)/sizeof(cgienv
ec40: 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  [0])); i++){.   
ec50: 20 20 20 69 66 28 20 2a 63 67 69 65 6e 76 5b 69     if( *cgienv[i
ec60: 5d 2e 70 7a 45 6e 76 56 61 6c 75 65 20 29 7b 0a  ].pzEnvValue ){.
ec70: 20 20 20 20 20 20 20 20 53 65 74 45 6e 76 28 63          SetEnv(c
ec80: 67 69 65 6e 76 5b 69 5d 2e 7a 45 6e 76 4e 61 6d  gienv[i].zEnvNam
ec90: 65 2c 2a 63 67 69 65 6e 76 5b 69 5d 2e 70 7a 45  e,*cgienv[i].pzE
eca0: 6e 76 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  nvValue);.      
ecb0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ecc0: 75 73 65 48 74 74 70 73 20 29 7b 0a 20 20 20 20  useHttps ){.    
ecd0: 20 20 70 75 74 65 6e 76 28 22 48 54 54 50 53 3d    putenv("HTTPS=
ece0: 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  on");.    }..   
ecf0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 62 6f 72 74   /*.    ** Abort
ed00: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 69   with an error i
ed10: 66 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74  f the CGI script
ed20: 20 69 73 20 77 72 69 74 61 62 6c 65 20 62 79 20   is writable by 
ed30: 61 6e 79 6f 6e 65 20 6f 74 68 65 72 0a 20 20 20  anyone other.   
ed40: 20 2a 2a 20 74 68 61 6e 20 69 74 73 20 6f 77 6e   ** than its own
ed50: 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
ed60: 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 6f  f( statbuf.st_mo
ed70: 64 65 20 26 20 30 30 32 32 20 29 7b 0a 20 20 20  de & 0022 ){.   
ed80: 20 20 20 43 67 69 53 63 72 69 70 74 57 72 69 74     CgiScriptWrit
ed90: 61 62 6c 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20  able();.    }.. 
eda0: 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 50 4f     /* For the PO
edb0: 53 54 20 6d 65 74 68 6f 64 20 61 6c 6c 20 69 6e  ST method all in
edc0: 70 75 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  put has been wri
edd0: 74 74 65 6e 20 74 6f 20 61 20 74 65 6d 70 6f 72  tten to a tempor
ede0: 61 72 79 20 66 69 6c 65 2c 0a 20 20 20 20 2a 2a  ary file,.    **
edf0: 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
ee00: 65 64 69 72 65 63 74 20 69 6e 70 75 74 20 74 6f  edirect input to
ee10: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
ee20: 66 72 6f 6d 20 74 68 61 74 20 66 69 6c 65 2e 0a  from that file..
ee30: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a      */.    if( z
ee40: 4d 65 74 68 6f 64 5b 30 5d 3d 3d 27 50 27 20 29  Method[0]=='P' )
ee50: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 75 70 28  {.      if( dup(
ee60: 30 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0)<0 ){.        
ee70: 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 34 33 30 2c  Malfunction(430,
ee80: 20 20 2f 2a 20 4c 4f 47 3a 20 64 75 70 28 30 29    /* LOG: dup(0)
ee90: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20   failed */.     
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
eeb0: 55 6e 61 62 6c 65 20 74 6f 20 64 75 70 6c 69 63  Unable to duplic
eec0: 61 74 69 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ation file descr
eed0: 69 70 74 6f 72 20 30 22 29 3b 0a 20 20 20 20 20  iptor 0");.     
eee0: 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 30   }.      close(0
eef0: 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 28 7a 54  );.      open(zT
ef00: 6d 70 4e 61 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 29  mpNam, O_RDONLY)
ef10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
ef20: 28 69 3d 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  (i=strlen(zFile)
ef30: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 7a 46 69 6c  -1; i>=0 && zFil
ef40: 65 5b 69 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  e[i]!='/'; i--){
ef50: 7d 0a 20 20 20 20 7a 42 61 73 65 46 69 6c 65 6e  }.    zBaseFilen
ef60: 61 6d 65 20 3d 20 26 7a 46 69 6c 65 5b 69 2b 31  ame = &zFile[i+1
ef70: 5d 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 30 20  ];.    if( i>=0 
ef80: 26 26 20 73 74 72 6e 63 6d 70 28 7a 42 61 73 65  && strncmp(zBase
ef90: 46 69 6c 65 6e 61 6d 65 2c 22 6e 70 68 2d 22 2c  Filename,"nph-",
efa0: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  4)==0 ){.      /
efb0: 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  * If the name of
efc0: 20 74 68 65 20 43 47 49 20 73 63 72 69 70 74 20   the CGI script 
efd0: 62 65 67 69 6e 73 20 77 69 74 68 20 22 6e 70 68  begins with "nph
efe0: 2d 22 20 74 68 65 6e 20 77 65 20 61 72 65 0a 20  -" then we are. 
eff0: 20 20 20 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20       ** dealing 
f000: 77 69 74 68 20 61 20 22 6e 6f 6e 2d 70 61 72 73  with a "non-pars
f010: 65 64 20 68 65 61 64 65 72 73 22 20 43 47 49 20  ed headers" CGI 
f020: 73 63 72 69 70 74 2e 20 20 4a 75 73 74 20 65 78  script.  Just ex
f030: 65 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 69 74  ec().      ** it
f040: 20 64 69 72 65 63 74 6c 79 20 61 6e 64 20 6c 65   directly and le
f050: 74 20 69 74 20 68 61 6e 64 6c 65 20 61 6c 6c 20  t it handle all 
f060: 69 74 73 20 6f 77 6e 20 68 65 61 64 65 72 20 67  its own header g
f070: 65 6e 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 20  eneration..     
f080: 20 2a 2f 0a 20 20 20 20 20 20 65 78 65 63 6c 28   */.      execl(
f090: 7a 42 61 73 65 46 69 6c 65 6e 61 6d 65 2c 7a 42  zBaseFilename,zB
f0a0: 61 73 65 46 69 6c 65 6e 61 6d 65 2c 28 63 68 61  aseFilename,(cha
f0b0: 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  r*)0);.      /* 
f0c0: 4e 4f 54 45 3a 20 4e 6f 20 6c 6f 67 20 65 6e 74  NOTE: No log ent
f0d0: 72 79 20 77 72 69 74 74 65 6e 20 66 6f 72 20 6e  ry written for n
f0e0: 70 68 2d 20 73 63 72 69 70 74 73 20 2a 2f 0a 20  ph- scripts */. 
f0f0: 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20 20       exit(0);.  
f100: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 61 6c 6c    }..    /* Fall
f110: 20 74 68 72 75 20 74 6f 20 68 65 72 65 20 6f 6e   thru to here on
f120: 6c 79 20 69 66 20 74 68 69 73 20 70 72 6f 63 65  ly if this proce
f130: 73 73 20 28 74 68 65 20 73 65 72 76 65 72 29 20  ss (the server) 
f140: 69 73 20 67 6f 69 6e 67 0a 20 20 20 20 2a 2a 20  is going.    ** 
f150: 74 6f 20 72 65 61 64 20 61 6e 64 20 61 75 67 6d  to read and augm
f160: 65 6e 74 20 74 68 65 20 68 65 61 64 65 72 20 73  ent the header s
f170: 65 6e 74 20 62 61 63 6b 20 62 79 20 74 68 65 20  ent back by the 
f180: 43 47 49 20 70 72 6f 63 65 73 73 2e 0a 20 20 20  CGI process..   
f190: 20 2a 2a 20 4f 70 65 6e 20 61 20 70 69 70 65 20   ** Open a pipe 
f1a0: 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 6f  to receive the o
f1b0: 75 74 70 75 74 20 66 72 6f 6d 20 74 68 65 20 43  utput from the C
f1c0: 47 49 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65  GI process.  The
f1d0: 6e 0a 20 20 20 20 2a 2a 20 66 6f 72 6b 20 74 68  n.    ** fork th
f1e0: 65 20 43 47 49 20 70 72 6f 63 65 73 73 2e 20 20  e CGI process.  
f1f0: 4f 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20  Once everything 
f200: 69 73 20 64 6f 6e 65 2c 20 77 65 20 73 68 6f 75  is done, we shou
f210: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 61 62 6c  ld be.    ** abl
f220: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 6f 75  e to read the ou
f230: 74 70 75 74 20 6f 66 20 43 47 49 20 6f 6e 20 74  tput of CGI on t
f240: 68 65 20 22 69 6e 22 20 73 74 72 65 61 6d 2e 0a  he "in" stream..
f250: 20 20 20 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20      */.    {.   
f260: 20 20 20 69 6e 74 20 70 78 5b 32 5d 3b 0a 20 20     int px[2];.  
f270: 20 20 20 20 69 66 28 20 70 69 70 65 28 70 78 29      if( pipe(px)
f280: 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66   ){.        Malf
f290: 75 6e 63 74 69 6f 6e 28 34 34 30 2c 20 2f 2a 20  unction(440, /* 
f2a0: 4c 4f 47 3a 20 70 69 70 65 28 29 20 66 61 69 6c  LOG: pipe() fail
f2b0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
f2c0: 20 20 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c            "Unabl
f2d0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 70 69  e to create a pi
f2e0: 70 65 20 66 6f 72 20 74 68 65 20 43 47 49 20 70  pe for the CGI p
f2f0: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
f300: 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6f 72 6b  }.      if( fork
f310: 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ()==0 ){.       
f320: 20 63 6c 6f 73 65 28 70 78 5b 30 5d 29 3b 0a 20   close(px[0]);. 
f330: 20 20 20 20 20 20 20 63 6c 6f 73 65 28 31 29 3b         close(1);
f340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 75 70  .        if( dup
f350: 28 70 78 5b 31 5d 29 21 3d 31 20 29 7b 0a 20 20  (px[1])!=1 ){.  
f360: 20 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74          Malfunct
f370: 69 6f 6e 28 34 35 30 2c 20 2f 2a 20 4c 4f 47 3a  ion(450, /* LOG:
f380: 20 64 75 70 28 31 29 20 66 61 69 6c 65 64 20 2a   dup(1) failed *
f390: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
f3a0: 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 64 75     "Unable to du
f3b0: 70 6c 69 63 61 74 65 20 66 69 6c 65 20 64 65 73  plicate file des
f3c0: 63 72 69 70 74 6f 72 20 25 64 20 74 6f 20 31 22  criptor %d to 1"
f3d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f3e0: 20 20 20 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20     px[1]);.     
f3f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 6c 6f     }.        clo
f400: 73 65 28 70 78 5b 31 5d 29 3b 0a 20 20 20 20 20  se(px[1]);.     
f410: 20 20 20 65 78 65 63 6c 28 7a 42 61 73 65 46 69     execl(zBaseFi
f420: 6c 65 6e 61 6d 65 2c 20 7a 42 61 73 65 46 69 6c  lename, zBaseFil
f430: 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  ename, (char*)0)
f440: 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 30  ;.        exit(0
f450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f460: 20 63 6c 6f 73 65 28 70 78 5b 31 5d 29 3b 0a 20   close(px[1]);. 
f470: 20 20 20 20 20 69 6e 20 3d 20 66 64 6f 70 65 6e       in = fdopen
f480: 28 70 78 5b 30 5d 2c 20 22 72 22 29 3b 0a 20 20  (px[0], "r");.  
f490: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d    }.    if( in==
f4a0: 30 20 29 7b 0a 20 20 20 20 20 20 43 67 69 45 72  0 ){.      CgiEr
f4b0: 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ror();.    }..  
f4c0: 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 70 72    /* Read and pr
f4d0: 6f 63 65 73 73 20 74 68 65 20 66 69 72 73 74 20  ocess the first 
f4e0: 6c 69 6e 65 20 6f 66 20 74 68 65 20 68 65 61 64  line of the head
f4f0: 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
f500: 68 65 0a 20 20 20 20 2a 2a 20 43 47 49 20 73 63  he.    ** CGI sc
f510: 72 69 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ript..    */.   
f520: 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20   if( useTimeout 
f530: 29 20 61 6c 61 72 6d 28 31 35 29 3b 0a 20 20 20  ) alarm(15);.   
f540: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
f550: 69 6e 65 2c 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ine,sizeof(zLine
f560: 29 2c 69 6e 29 20 26 26 20 21 69 73 73 70 61 63  ),in) && !isspac
f570: 65 28 7a 4c 69 6e 65 5b 30 5d 29 20 29 7b 0a 20  e(zLine[0]) ){. 
f580: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 61 73       if( strncas
f590: 65 63 6d 70 28 7a 4c 69 6e 65 2c 22 4c 6f 63 61  ecmp(zLine,"Loca
f5a0: 74 69 6f 6e 3a 22 2c 39 29 3d 3d 30 20 29 7b 0a  tion:",9)==0 ){.
f5b0: 20 20 20 20 20 20 20 20 53 74 61 72 74 52 65 73          StartRes
f5c0: 70 6f 6e 73 65 28 22 33 30 32 20 52 65 64 69 72  ponse("302 Redir
f5d0: 65 63 74 22 29 3b 0a 20 20 20 20 20 20 20 20 52  ect");.        R
f5e0: 65 6d 6f 76 65 4e 65 77 6c 69 6e 65 28 7a 4c 69  emoveNewline(zLi
f5f0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d  ne);.        z =
f600: 20 26 7a 4c 69 6e 65 5b 31 30 5d 3b 0a 20 20 20   &zLine[10];.   
f610: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70       while( issp
f620: 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  ace(*z) ){ z++; 
f630: 7d 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b  }.        nOut +
f640: 3d 20 70 72 69 6e 74 66 28 22 4c 6f 63 61 74 69  = printf("Locati
f650: 6f 6e 3a 20 25 73 5c 72 5c 6e 22 2c 7a 29 3b 0a  on: %s\r\n",z);.
f660: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f670: 73 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69 6e  strncasecmp(zLin
f680: 65 2c 22 53 74 61 74 75 73 3a 22 2c 37 29 3d 3d  e,"Status:",7)==
f690: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
f6a0: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
f6b0: 69 3d 37 3b 20 69 73 73 70 61 63 65 28 7a 4c 69  i=7; isspace(zLi
f6c0: 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  ne[i]); i++){}. 
f6d0: 20 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70         nOut += p
f6e0: 72 69 6e 74 66 28 22 25 73 20 25 73 22 2c 20 7a  rintf("%s %s", z
f6f0: 50 72 6f 74 6f 63 6f 6c 2c 20 26 7a 4c 69 6e 65  Protocol, &zLine
f700: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 74  [i]);.        st
f710: 72 6e 63 70 79 28 7a 52 65 70 6c 79 53 74 61 74  rncpy(zReplyStat
f720: 75 73 2c 20 26 7a 4c 69 6e 65 5b 69 5d 2c 20 33  us, &zLine[i], 3
f730: 29 3b 0a 20 20 20 20 20 20 20 20 7a 52 65 70 6c  );.        zRepl
f740: 79 53 74 61 74 75 73 5b 33 5d 20 3d 20 30 3b 0a  yStatus[3] = 0;.
f750: 20 20 20 20 20 20 20 20 73 74 61 74 75 73 53 65          statusSe
f760: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  nt = 1;.      }e
f770: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
f780: 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a 4c 69   strncasecmp(zLi
f790: 6e 65 2c 20 22 43 6f 6e 74 65 6e 74 2d 6c 65 6e  ne, "Content-len
f7a0: 67 74 68 3a 22 2c 20 31 34 29 3d 3d 30 20 29 7b  gth:", 14)==0 ){
f7b0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
f7c0: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 3d 20 31  ontentLength = 1
f7d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f7e0: 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e 73      StartRespons
f7f0: 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20 20  e("200 OK");.   
f800: 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69       nOut += pri
f810: 6e 74 66 28 22 25 73 22 2c 7a 4c 69 6e 65 29 3b  ntf("%s",zLine);
f820: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f830: 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 76 65 72      /* Copy ever
f840: 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68 72 75  ything else thru
f850: 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 65 20   without change 
f860: 6f 72 20 61 6e 61 6c 79 73 69 73 2e 0a 20 20 20  or analysis..   
f870: 20 2a 2f 0a 20 20 20 20 53 74 61 72 74 52 65 73   */.    StartRes
f880: 70 6f 6e 73 65 28 22 32 30 30 20 4f 4b 22 29 3b  ponse("200 OK");
f890: 0a 20 20 20 20 69 66 28 20 75 73 65 54 69 6d 65  .    if( useTime
f8a0: 6f 75 74 20 29 20 61 6c 61 72 6d 28 36 30 2a 35  out ) alarm(60*5
f8b0: 29 3b 0a 20 20 20 20 69 66 28 20 73 65 65 6e 43  );.    if( seenC
f8c0: 6f 6e 74 65 6e 74 4c 65 6e 67 74 68 20 29 7b 0a  ontentLength ){.
f8d0: 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72        nOut += pr
f8e0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 4c 69 6e 65  intf("%s", zLine
f8f0: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
f900: 28 63 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d  (c = getc(in))!=
f910: 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20 20 70  EOF ){.        p
f920: 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b 0a 20  utc(c,stdout);. 
f930: 20 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20         nOut++;. 
f940: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f950: 7b 0a 20 20 20 20 20 20 6e 52 65 73 20 3d 20 30  {.      nRes = 0
f960: 3b 0a 20 20 20 20 20 20 6e 4d 61 6c 6c 6f 63 20  ;.      nMalloc 
f970: 3d 20 31 30 30 30 3b 0a 20 20 20 20 20 20 61 52  = 1000;.      aR
f980: 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 4d 61 6c  es = malloc(nMal
f990: 6c 6f 63 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  loc+1);.      if
f9a0: 28 20 61 52 65 73 3d 3d 30 20 29 20 4d 61 6c 66  ( aRes==0 ) Malf
f9b0: 75 6e 63 74 69 6f 6e 28 36 30 30 2c 22 4f 75 74  unction(600,"Out
f9c0: 20 6f 66 20 6d 65 6d 6f 72 79 3a 20 25 64 20 62   of memory: %d b
f9d0: 79 74 65 73 22 2c 20 6e 4d 61 6c 6c 6f 63 29 3b  ytes", nMalloc);
f9e0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
f9f0: 20 3d 20 67 65 74 63 28 69 6e 29 29 21 3d 45 4f   = getc(in))!=EO
fa00: 46 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  F ){.        if(
fa10: 20 6e 52 65 73 3e 3d 6e 4d 61 6c 6c 6f 63 20 29   nRes>=nMalloc )
fa20: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 61 6c  {.          nMal
fa30: 6c 6f 63 20 3d 20 6e 4d 61 6c 6c 6f 63 2a 32 3b  loc = nMalloc*2;
fa40: 0a 20 20 20 20 20 20 20 20 20 20 61 52 65 73 20  .          aRes 
fa50: 3d 20 72 65 61 6c 6c 6f 63 28 61 52 65 73 2c 20  = realloc(aRes, 
fa60: 6e 4d 61 6c 6c 6f 63 2b 31 29 3b 0a 20 20 20 20  nMalloc+1);.    
fa70: 20 20 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d        if( aRes==
fa80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
fa90: 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 36 31    Malfunction(61
faa0: 30 2c 20 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  0, "Out of memor
fab0: 79 3a 20 25 64 20 62 79 74 65 73 22 2c 20 6e 4d  y: %d bytes", nM
fac0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
fad0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
fae0: 20 20 20 20 20 20 61 52 65 73 5b 6e 52 65 73 2b        aRes[nRes+
faf0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
fb00: 20 20 20 20 20 20 61 52 65 73 5b 6e 52 65 73 5d        aRes[nRes]
fb10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 4f 75 74   = 0;.      nOut
fb20: 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f 6e 74   += printf("Cont
fb30: 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64 5c 72  ent-length: %d\r
fb40: 5c 6e 5c 72 5c 6e 25 73 22 2c 20 6e 52 65 73 2c  \n\r\n%s", nRes,
fb50: 20 61 52 65 73 29 3b 0a 20 20 20 20 20 20 66 72   aRes);.      fr
fb60: 65 65 28 61 52 65 73 29 3b 0a 20 20 20 20 7d 0a  ee(aRes);.    }.
fb70: 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
fb80: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6f 75 6e    }else if( coun
fb90: 74 53 6c 61 73 68 65 73 28 7a 52 65 61 6c 53 63  tSlashes(zRealSc
fba0: 72 69 70 74 29 21 3d 63 6f 75 6e 74 53 6c 61 73  ript)!=countSlas
fbb0: 68 65 73 28 7a 53 63 72 69 70 74 29 20 29 7b 0a  hes(zScript) ){.
fbc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
fbd0: 71 75 65 73 74 20 55 52 49 20 66 6f 72 20 73 74  quest URI for st
fbe0: 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 63 6f 6e  atic content con
fbf0: 74 61 69 6e 73 20 6d 61 74 65 72 69 61 6c 20 70  tains material p
fc00: 61 73 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 61  ast the.    ** a
fc10: 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 20 66 69  ctual content fi
fc20: 6c 65 20 6e 61 6d 65 2c 20 72 65 70 6f 72 74 20  le name, report 
fc30: 74 68 61 74 20 61 73 20 61 20 34 30 34 20 65 72  that as a 404 er
fc40: 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 4e 6f 74 46  ror. */.    NotF
fc50: 6f 75 6e 64 28 34 36 30 29 3b 20 2f 2a 20 4c 4f  ound(460); /* LO
fc60: 47 3a 20 45 78 63 65 73 73 20 55 52 49 20 63 6f  G: Excess URI co
fc70: 6e 74 65 6e 74 20 70 61 73 74 20 73 74 61 74 69  ntent past stati
fc80: 63 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  c file name */. 
fc90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
fca0: 66 20 69 74 20 69 73 6e 27 74 20 65 78 65 63 75  f it isn't execu
fcb0: 74 61 62 6c 65 20 74 68 65 6e 20 69 74 0a 20 20  table then it.  
fcc0: 20 20 2a 2a 20 6d 75 73 74 20 61 20 73 69 6d 70    ** must a simp
fcd0: 6c 65 20 66 69 6c 65 20 74 68 61 74 20 6e 65 65  le file that nee
fce0: 64 73 20 74 6f 20 62 65 20 63 6f 70 69 65 64 20  ds to be copied 
fcf0: 74 6f 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 2a  to output..    *
fd00: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
fd10: 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d   *zContentType =
fd20: 20 47 65 74 4d 69 6d 65 54 79 70 65 28 7a 46 69   GetMimeType(zFi
fd30: 6c 65 2c 20 6c 65 6e 46 69 6c 65 29 3b 0a 20 20  le, lenFile);.  
fd40: 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
fd50: 63 68 61 72 20 7a 45 54 61 67 5b 31 30 30 5d 3b  char zETag[100];
fd60: 0a 0a 20 20 20 20 69 66 28 20 7a 54 6d 70 4e 61  ..    if( zTmpNa
fd70: 6d 20 29 20 75 6e 6c 69 6e 6b 28 7a 54 6d 70 4e  m ) unlink(zTmpN
fd80: 61 6d 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  am);.    sprintf
fd90: 28 7a 45 54 61 67 2c 20 22 6d 25 78 73 25 78 22  (zETag, "m%xs%x"
fda0: 2c 20 28 69 6e 74 29 73 74 61 74 62 75 66 2e 73  , (int)statbuf.s
fdb0: 74 5f 6d 74 69 6d 65 2c 20 28 69 6e 74 29 73 74  t_mtime, (int)st
fdc0: 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a  atbuf.st_size);.
fdd0: 20 20 20 20 69 66 28 20 43 6f 6d 70 61 72 65 45      if( CompareE
fde0: 74 61 67 73 28 7a 49 66 4e 6f 6e 65 4d 61 74 63  tags(zIfNoneMatc
fdf0: 68 2c 7a 45 54 61 67 29 3d 3d 30 0a 20 20 20 20  h,zETag)==0.    
fe00: 20 7c 7c 20 28 7a 49 66 4d 6f 64 69 66 69 65 64   || (zIfModified
fe10: 53 69 6e 63 65 21 3d 30 0a 20 20 20 20 20 20 20  Since!=0.       
fe20: 20 20 20 26 26 20 28 74 20 3d 20 50 61 72 73 65     && (t = Parse
fe30: 52 66 63 38 32 32 44 61 74 65 28 7a 49 66 4d 6f  Rfc822Date(zIfMo
fe40: 64 69 66 69 65 64 53 69 6e 63 65 29 29 3e 30 0a  difiedSince))>0.
fe50: 20 20 20 20 20 20 20 20 20 20 26 26 20 74 3e 3d            && t>=
fe60: 73 74 61 74 62 75 66 2e 73 74 5f 6d 74 69 6d 65  statbuf.st_mtime
fe70: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
fe80: 74 61 72 74 52 65 73 70 6f 6e 73 65 28 22 33 30  tartResponse("30
fe90: 34 20 4e 6f 74 20 4d 6f 64 69 66 69 65 64 22 29  4 Not Modified")
fea0: 3b 0a 20 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20  ;.      nOut += 
feb0: 44 61 74 65 54 61 67 28 22 4c 61 73 74 2d 4d 6f  DateTag("Last-Mo
fec0: 64 69 66 69 65 64 22 2c 20 73 74 61 74 62 75 66  dified", statbuf
fed0: 2e 73 74 5f 6d 74 69 6d 65 29 3b 0a 20 20 20 20  .st_mtime);.    
fee0: 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66    nOut += printf
fef0: 28 22 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a  ("Cache-Control:
ff00: 20 6d 61 78 2d 61 67 65 3d 25 64 5c 72 5c 6e 22   max-age=%d\r\n"
ff10: 2c 20 6d 78 41 67 65 29 3b 0a 20 20 20 20 20 20  , mxAge);.      
ff20: 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22  nOut += printf("
ff30: 45 54 61 67 3a 20 5c 22 25 73 5c 22 5c 72 5c 6e  ETag: \"%s\"\r\n
ff40: 22 2c 20 7a 45 54 61 67 29 3b 0a 20 20 20 20 20  ", zETag);.     
ff50: 20 6e 4f 75 74 20 2b 3d 20 70 72 69 6e 74 66 28   nOut += printf(
ff60: 22 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  "\r\n");.      f
ff70: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
ff80: 20 20 20 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72       MakeLogEntr
ff90: 79 28 30 2c 20 34 37 30 29 3b 20 20 2f 2a 20 4c  y(0, 470);  /* L
ffa0: 4f 47 3a 20 45 54 61 67 20 43 61 63 68 65 20 48  OG: ETag Cache H
ffb0: 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  it */.      retu
ffc0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e  rn;.    }.    in
ffd0: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 22   = fopen(zFile,"
ffe0: 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d  r");.    if( in=
fff0: 3d 30 20 29 20 4e 6f 74 46 6f 75 6e 64 28 34 38  =0 ) NotFound(48
10000 30 29 3b 20 2f 2a 20 4c 4f 47 3a 20 66 6f 70 65  0); /* LOG: fope
10010 6e 28 29 20 66 61 69 6c 65 64 20 66 6f 72 20 73  n() failed for s
10020 74 61 74 69 63 20 63 6f 6e 74 65 6e 74 20 2a 2f  tatic content */
10030 0a 20 20 20 20 53 74 61 72 74 52 65 73 70 6f 6e  .    StartRespon
10040 73 65 28 22 32 30 30 20 4f 4b 22 29 3b 0a 20 20  se("200 OK");.  
10050 20 20 6e 4f 75 74 20 2b 3d 20 44 61 74 65 54 61    nOut += DateTa
10060 67 28 22 4c 61 73 74 2d 4d 6f 64 69 66 69 65 64  g("Last-Modified
10070 22 2c 20 73 74 61 74 62 75 66 2e 73 74 5f 6d 74  ", statbuf.st_mt
10080 69 6d 65 29 3b 0a 20 20 20 20 6e 4f 75 74 20 2b  ime);.    nOut +
10090 3d 20 70 72 69 6e 74 66 28 22 43 61 63 68 65 2d  = printf("Cache-
100a0 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65  Control: max-age
100b0 3d 25 64 5c 72 5c 6e 22 2c 20 6d 78 41 67 65 29  =%d\r\n", mxAge)
100c0 3b 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72  ;.    nOut += pr
100d0 69 6e 74 66 28 22 45 54 61 67 3a 20 5c 22 25 73  intf("ETag: \"%s
100e0 5c 22 5c 72 5c 6e 22 2c 20 7a 45 54 61 67 29 3b  \"\r\n", zETag);
100f0 0a 20 20 20 20 6e 4f 75 74 20 2b 3d 20 70 72 69  .    nOut += pri
10100 6e 74 66 28 22 43 6f 6e 74 65 6e 74 2d 74 79 70  ntf("Content-typ
10110 65 3a 20 25 73 5c 72 5c 6e 22 2c 7a 43 6f 6e 74  e: %s\r\n",zCont
10120 65 6e 74 54 79 70 65 29 3b 0a 20 20 20 20 6e 4f  entType);.    nO
10130 75 74 20 2b 3d 20 70 72 69 6e 74 66 28 22 43 6f  ut += printf("Co
10140 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 20 25 64  ntent-length: %d
10150 5c 72 5c 6e 5c 72 5c 6e 22 2c 28 69 6e 74 29 73  \r\n\r\n",(int)s
10160 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  tatbuf.st_size);
10170 0a 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f  .    fflush(stdo
10180 75 74 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  ut);.    if( str
10190 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 48 45 41  cmp(zMethod,"HEA
101a0 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  D")==0 ){.      
101b0 4d 61 6b 65 4c 6f 67 45 6e 74 72 79 28 30 2c 20  MakeLogEntry(0, 
101c0 32 29 3b 20 2f 2a 20 4c 4f 47 3a 20 4e 6f 72 6d  2); /* LOG: Norm
101d0 61 6c 20 48 45 41 44 20 72 65 70 6c 79 20 2a 2f  al HEAD reply */
101e0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  .      fclose(in
101f0 29 3b 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28  );.      fflush(
10200 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 72  stdout);.      r
10210 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
10220 20 69 66 28 20 75 73 65 54 69 6d 65 6f 75 74 20   if( useTimeout 
10230 29 20 61 6c 61 72 6d 28 33 30 20 2b 20 73 74 61  ) alarm(30 + sta
10240 74 62 75 66 2e 73 74 5f 73 69 7a 65 2f 31 30 30  tbuf.st_size/100
10250 30 29 3b 0a 23 69 66 64 65 66 20 6c 69 6e 75 78  0);.#ifdef linux
10260 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 6f 66 66  .    {.      off
10270 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  _t offset = 0;. 
10280 20 20 20 20 20 6e 4f 75 74 20 2b 3d 20 73 65 6e       nOut += sen
10290 64 66 69 6c 65 28 66 69 6c 65 6e 6f 28 73 74 64  dfile(fileno(std
102a0 6f 75 74 29 2c 20 66 69 6c 65 6e 6f 28 69 6e 29  out), fileno(in)
102b0 2c 20 26 6f 66 66 73 65 74 2c 20 73 74 61 74 62  , &offset, statb
102c0 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
102d0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69   }.#else.    whi
102e0 6c 65 28 20 28 63 20 3d 20 67 65 74 63 28 69 6e  le( (c = getc(in
102f0 29 29 21 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20  ))!=EOF ){.     
10300 20 70 75 74 63 28 63 2c 73 74 64 6f 75 74 29 3b   putc(c,stdout);
10310 0a 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20  .      nOut++;. 
10320 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10330 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a  fclose(in);.  }.
10340 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
10350 3b 0a 20 20 4d 61 6b 65 4c 6f 67 45 6e 74 72 79  ;.  MakeLogEntry
10360 28 30 2c 20 30 29 3b 20 20 2f 2a 20 4c 4f 47 3a  (0, 0);  /* LOG:
10370 20 4e 6f 72 6d 61 6c 20 72 65 70 6c 79 20 2a 2f   Normal reply */
10380 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
10390 72 65 71 75 65 73 74 20 6d 75 73 74 20 61 72 72  request must arr
103a0 69 76 65 20 77 69 74 68 69 6e 20 33 30 20 73 65  ive within 30 se
103b0 63 6f 6e 64 73 20 6f 72 20 77 65 20 63 6c 6f 73  conds or we clos
103c0 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
103d0 0a 20 20 2a 2f 0a 20 20 6f 6d 69 74 4c 6f 67 20  .  */.  omitLog 
103e0 3d 20 31 3b 0a 20 20 69 66 28 20 75 73 65 54 69  = 1;.  if( useTi
103f0 6d 65 6f 75 74 20 29 20 61 6c 61 72 6d 28 33 30  meout ) alarm(30
10400 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4d 41  );.}..#define MA
10410 58 5f 50 41 52 41 4c 4c 45 4c 20 35 30 20 20 2f  X_PARALLEL 50  /
10420 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 69 6d 75  * Number of simu
10430 6c 74 61 6e 65 6f 75 73 20 63 68 69 6c 64 72 65  ltaneous childre
10440 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  n */../*.** All 
10450 70 6f 73 73 69 62 6c 65 20 66 6f 72 6d 73 20 6f  possible forms o
10460 66 20 61 6e 20 49 50 20 61 64 64 72 65 73 73 2e  f an IP address.
10470 20 20 4e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b    Needed to work
10480 20 61 72 6f 75 6e 64 20 47 43 43 20 73 74 72 69   around GCC stri
10490 63 74 0a 2a 2a 20 61 6c 69 61 73 69 6e 67 20 72  ct.** aliasing r
104a0 75 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ules..*/.typedef
104b0 20 75 6e 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63   union {.  struc
104c0 74 20 73 6f 63 6b 61 64 64 72 20 73 61 3b 20 20  t sockaddr sa;  
104d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
104e0 62 73 74 72 61 63 74 20 73 75 70 65 72 63 6c 61  bstract supercla
104f0 73 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ss */.  struct s
10500 6f 63 6b 61 64 64 72 5f 69 6e 20 73 61 34 3b 20  ockaddr_in sa4; 
10510 20 20 20 20 20 20 20 20 20 2f 2a 20 49 50 76 34           /* IPv4
10520 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63   */.  struct soc
10530 6b 61 64 64 72 5f 69 6e 36 20 73 61 36 3b 20 20  kaddr_in6 sa6;  
10540 20 20 20 20 20 20 20 2f 2a 20 49 50 76 36 20 2a         /* IPv6 *
10550 2f 0a 20 20 73 74 72 75 63 74 20 73 6f 63 6b 61  /.  struct socka
10560 64 64 72 5f 73 74 6f 72 61 67 65 20 73 61 73 3b  ddr_storage sas;
10570 20 20 20 20 20 2f 2a 20 53 68 6f 75 6c 64 20 62       /* Should b
10580 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  e the maximum of
10590 20 74 68 65 20 61 62 6f 76 65 20 33 20 2a 2f 0a   the above 3 */.
105a0 7d 20 61 64 64 72 65 73 73 3b 0a 0a 2f 2a 0a 2a  } address;../*.*
105b0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 48  * Implement an H
105c0 54 54 50 20 73 65 72 76 65 72 20 64 61 65 6d 6f  TTP server daemo
105d0 6e 20 6c 69 73 74 65 6e 69 6e 67 20 6f 6e 20 70  n listening on p
105e0 6f 72 74 20 69 50 6f 72 74 2e 0a 2a 2a 0a 2a 2a  ort iPort..**.**
105f0 20 41 73 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69   As new connecti
10600 6f 6e 73 20 61 72 72 69 76 65 2c 20 66 6f 72 6b  ons arrive, fork
10610 20 61 20 63 68 69 6c 64 20 61 6e 64 20 6c 65 74   a child and let
10620 20 63 68 69 6c 64 20 72 65 74 75 72 6e 0a 2a 2a   child return.**
10630 20 6f 75 74 20 6f 66 20 74 68 69 73 20 70 72 6f   out of this pro
10640 63 65 64 75 72 65 20 63 61 6c 6c 2e 20 20 54 68  cedure call.  Th
10650 65 20 63 68 69 6c 64 20 77 69 6c 6c 20 68 61 6e  e child will han
10660 64 6c 65 20 74 68 65 20 72 65 71 75 65 73 74 2e  dle the request.
10670 0a 2a 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6e  .** The parent n
10680 65 76 65 72 20 72 65 74 75 72 6e 73 20 66 72 6f  ever returns fro
10690 6d 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  m this procedure
106a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
106b0 20 74 6f 20 65 61 63 68 20 63 68 69 6c 64 20 61   to each child a
106c0 73 20 69 74 20 72 75 6e 73 2e 20 20 49 66 20 75  s it runs.  If u
106d0 6e 61 62 6c 65 20 74 6f 20 65 73 74 61 62 6c 69  nable to establi
106e0 73 68 20 61 0a 2a 2a 20 6c 69 73 74 65 6e 69 6e  sh a.** listenin
106f0 67 20 73 6f 63 6b 65 74 2c 20 72 65 74 75 72 6e  g socket, return
10700 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e   non-zero..*/.in
10710 74 20 68 74 74 70 5f 73 65 72 76 65 72 28 63 6f  t http_server(co
10720 6e 73 74 20 63 68 61 72 20 2a 7a 50 6f 72 74 2c  nst char *zPort,
10730 20 69 6e 74 20 6c 6f 63 61 6c 4f 6e 6c 79 29 7b   int localOnly){
10740 0a 20 20 69 6e 74 20 6c 69 73 74 65 6e 65 72 5b  .  int listener[
10750 32 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  20];            
10760 2f 2a 20 54 68 65 20 73 65 72 76 65 72 20 73 6f  /* The server so
10770 63 6b 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20 63  ckets */.  int c
10780 6f 6e 6e 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  onnection;      
10790 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 63          /* A soc
107a0 6b 65 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ket for each ind
107b0 69 76 69 64 75 61 6c 20 63 6f 6e 6e 65 63 74 69  ividual connecti
107c0 6f 6e 20 2a 2f 0a 20 20 66 64 5f 73 65 74 20 72  on */.  fd_set r
107d0 65 61 64 66 64 73 3b 20 20 20 20 20 20 20 20 20  eadfds;         
107e0 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 66       /* Set of f
107f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
10800 66 6f 72 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a  for select() */.
10810 20 20 61 64 64 72 65 73 73 20 69 6e 61 64 64 72    address inaddr
10820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10830 2a 20 52 65 6d 6f 74 65 20 61 64 64 72 65 73 73  * Remote address
10840 20 2a 2f 0a 20 20 73 6f 63 6b 6c 65 6e 5f 74 20   */.  socklen_t 
10850 6c 65 6e 61 64 64 72 3b 20 20 20 20 20 20 20 20  lenaddr;        
10860 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
10870 74 68 65 20 69 6e 61 64 64 72 20 73 74 72 75 63  the inaddr struc
10880 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  ture */.  int ch
10890 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ild;            
108a0 20 20 20 20 20 20 20 2f 2a 20 50 49 44 20 6f 66         /* PID of
108b0 20 74 68 65 20 63 68 69 6c 64 20 70 72 6f 63 65   the child proce
108c0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 68 69  ss */.  int nchi
108d0 6c 64 72 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  ldren = 0;      
108e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
108f0 66 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 65  f child processe
10900 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69  s */.  struct ti
10910 6d 65 76 61 6c 20 64 65 6c 61 79 3b 20 20 20 20  meval delay;    
10920 20 20 20 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20      /* How long 
10930 74 6f 20 77 61 69 74 20 69 6e 73 69 64 65 20 73  to wait inside s
10940 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 69 6e 74  elect() */.  int
10950 20 6f 70 74 20 3d 20 31 3b 20 20 20 20 20 20 20   opt = 1;       
10960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 74            /* set
10970 73 6f 63 6b 6f 70 74 20 66 6c 61 67 20 2a 2f 0a  sockopt flag */.
10980 20 20 73 74 72 75 63 74 20 61 64 64 72 69 6e 66    struct addrinf
10990 6f 20 73 48 69 6e 74 73 3b 20 20 20 20 20 20 2f  o sHints;      /
109a0 2a 20 41 64 64 72 65 73 73 20 68 69 6e 74 73 20  * Address hints 
109b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 64 64 72  */.  struct addr
109c0 69 6e 66 6f 20 2a 70 41 64 64 72 73 2c 20 2a 70  info *pAddrs, *p
109d0 3b 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ; /* */.  int rc
109e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
10a00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
10a10 2c 20 6e 3b 0a 20 20 69 6e 74 20 6d 61 78 46 64  , n;.  int maxFd
10a20 20 3d 20 2d 31 3b 0a 20 20 0a 20 20 6d 65 6d 73   = -1;.  .  mems
10a30 65 74 28 26 73 48 69 6e 74 73 2c 20 30 2c 20 73  et(&sHints, 0, s
10a40 69 7a 65 6f 66 28 73 48 69 6e 74 73 29 29 3b 0a  izeof(sHints));.
10a50 20 20 69 66 28 20 69 70 76 34 4f 6e 6c 79 20 29    if( ipv4Only )
10a60 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f  {.    sHints.ai_
10a70 66 61 6d 69 6c 79 20 3d 20 50 46 5f 49 4e 45 54  family = PF_INET
10a80 3b 0a 20 20 20 20 2f 2a 70 72 69 6e 74 66 28 22  ;.    /*printf("
10a90 69 70 76 34 20 6f 6e 6c 79 5c 6e 22 29 3b 2a 2f  ipv4 only\n");*/
10aa0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 70 76  .  }else if( ipv
10ab0 36 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 73 48 69  6Only ){.    sHi
10ac0 6e 74 73 2e 61 69 5f 66 61 6d 69 6c 79 20 3d 20  nts.ai_family = 
10ad0 50 46 5f 49 4e 45 54 36 3b 0a 20 20 20 20 2f 2a  PF_INET6;.    /*
10ae0 70 72 69 6e 74 66 28 22 69 70 76 36 20 6f 6e 6c  printf("ipv6 onl
10af0 79 5c 6e 22 29 3b 2a 2f 0a 20 20 7d 65 6c 73 65  y\n");*/.  }else
10b00 7b 0a 20 20 20 20 73 48 69 6e 74 73 2e 61 69 5f  {.    sHints.ai_
10b10 66 61 6d 69 6c 79 20 3d 20 50 46 5f 55 4e 53 50  family = PF_UNSP
10b20 45 43 3b 0a 20 20 7d 0a 20 20 73 48 69 6e 74 73  EC;.  }.  sHints
10b30 2e 61 69 5f 73 6f 63 6b 74 79 70 65 20 3d 20 53  .ai_socktype = S
10b40 4f 43 4b 5f 53 54 52 45 41 4d 3b 0a 20 20 73 48  OCK_STREAM;.  sH
10b50 69 6e 74 73 2e 61 69 5f 66 6c 61 67 73 20 3d 20  ints.ai_flags = 
10b60 41 49 5f 50 41 53 53 49 56 45 3b 0a 20 20 73 48  AI_PASSIVE;.  sH
10b70 69 6e 74 73 2e 61 69 5f 70 72 6f 74 6f 63 6f 6c  ints.ai_protocol
10b80 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 67 65 74   = 0;.  rc = get
10b90 61 64 64 72 69 6e 66 6f 28 6c 6f 63 61 6c 4f 6e  addrinfo(localOn
10ba0 6c 79 20 3f 20 22 6c 6f 63 61 6c 68 6f 73 74 22  ly ? "localhost"
10bb0 3a 20 30 2c 20 7a 50 6f 72 74 2c 20 26 73 48 69  : 0, zPort, &sHi
10bc0 6e 74 73 2c 20 26 70 41 64 64 72 73 29 3b 0a 20  nts, &pAddrs);. 
10bd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 66   if( rc ){.    f
10be0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
10bf0 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 64  could not get ad
10c00 64 72 20 69 6e 66 6f 3a 20 25 73 22 2c 20 0a 20  dr info: %s", . 
10c10 20 20 20 20 20 20 20 20 20 20 20 72 63 21 3d 45             rc!=E
10c20 41 49 5f 53 59 53 54 45 4d 20 3f 20 67 61 69 5f  AI_SYSTEM ? gai_
10c30 73 74 72 65 72 72 6f 72 28 72 63 29 20 3a 20 73  strerror(rc) : s
10c40 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
10c50 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10c60 20 7d 0a 20 20 66 6f 72 28 6e 3d 30 2c 20 70 3d   }.  for(n=0, p=
10c70 70 41 64 64 72 73 3b 20 6e 3c 28 69 6e 74 29 28  pAddrs; n<(int)(
10c80 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72 29  sizeof(listener)
10c90 2f 73 69 7a 65 6f 66 28 6c 69 73 74 65 6e 65 72  /sizeof(listener
10ca0 5b 30 5d 29 29 20 26 26 20 70 21 3d 30 3b 0a 20  [0])) && p!=0;. 
10cb0 20 20 20 20 20 20 20 70 3d 70 2d 3e 61 69 5f 6e         p=p->ai_n
10cc0 65 78 74 29 7b 0a 20 20 20 20 6c 69 73 74 65 6e  ext){.    listen
10cd0 65 72 5b 6e 5d 20 3d 20 73 6f 63 6b 65 74 28 70  er[n] = socket(p
10ce0 2d 3e 61 69 5f 66 61 6d 69 6c 79 2c 20 70 2d 3e  ->ai_family, p->
10cf0 61 69 5f 73 6f 63 6b 74 79 70 65 2c 20 70 2d 3e  ai_socktype, p->
10d00 61 69 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20  ai_protocol);.  
10d10 20 20 69 66 28 20 6c 69 73 74 65 6e 65 72 5b 6e    if( listener[n
10d20 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ]>=0 ){.      /*
10d30 20 69 66 20 77 65 20 63 61 6e 27 74 20 74 65 72   if we can't ter
10d40 6d 69 6e 61 74 65 20 6e 69 63 65 6c 79 2c 20 61  minate nicely, a
10d50 74 20 6c 65 61 73 74 20 61 6c 6c 6f 77 20 74 68  t least allow th
10d60 65 20 73 6f 63 6b 65 74 20 74 6f 20 62 65 20 72  e socket to be r
10d70 65 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 73  eused */.      s
10d80 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 74 65 6e  etsockopt(listen
10d90 65 72 5b 6e 5d 2c 20 53 4f 4c 5f 53 4f 43 4b 45  er[n], SOL_SOCKE
10da0 54 2c 20 53 4f 5f 52 45 55 53 45 41 44 44 52 2c  T, SO_REUSEADDR,
10db0 26 6f 70 74 2c 20 73 69 7a 65 6f 66 28 6f 70 74  &opt, sizeof(opt
10dc0 29 29 3b 0a 20 20 20 20 20 20 0a 23 69 66 20 64  ));.      .#if d
10dd0 65 66 69 6e 65 64 28 49 50 56 36 5f 56 36 4f 4e  efined(IPV6_V6ON
10de0 4c 59 29 0a 20 20 20 20 20 20 69 66 28 20 70 2d  LY).      if( p-
10df0 3e 61 69 5f 66 61 6d 69 6c 79 3d 3d 41 46 5f 49  >ai_family==AF_I
10e00 4e 45 54 36 20 29 7b 0a 20 20 20 20 20 20 20 20  NET6 ){.        
10e10 69 6e 74 20 76 36 6f 6e 6c 79 20 3d 20 31 3b 0a  int v6only = 1;.
10e20 20 20 20 20 20 20 20 20 73 65 74 73 6f 63 6b 6f          setsocko
10e30 70 74 28 6c 69 73 74 65 6e 65 72 5b 6e 5d 2c 20  pt(listener[n], 
10e40 49 50 50 52 4f 54 4f 5f 49 50 56 36 2c 20 49 50  IPPROTO_IPV6, IP
10e50 56 36 5f 56 36 4f 4e 4c 59 2c 0a 20 20 20 20 20  V6_V6ONLY,.     
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
10e70 76 36 6f 6e 6c 79 2c 20 73 69 7a 65 6f 66 28 76  v6only, sizeof(v
10e80 36 6f 6e 6c 79 29 29 3b 0a 20 20 20 20 20 20 7d  6only));.      }
10e90 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 0a 20  .#endif.      . 
10ea0 20 20 20 20 20 69 66 28 20 62 69 6e 64 28 6c 69       if( bind(li
10eb0 73 74 65 6e 65 72 5b 6e 5d 2c 20 70 2d 3e 61 69  stener[n], p->ai
10ec0 5f 61 64 64 72 2c 20 70 2d 3e 61 69 5f 61 64 64  _addr, p->ai_add
10ed0 72 6c 65 6e 29 3c 30 20 29 7b 0a 20 20 20 20 20  rlen)<0 ){.     
10ee0 20 20 20 70 72 69 6e 74 66 28 22 62 69 6e 64 20     printf("bind 
10ef0 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73  failed: %s\n", s
10f00 74 72 65 72 72 6f 72 28 65 72 72 6e 6f 29 29 3b  trerror(errno));
10f10 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6c  .        close(l
10f20 69 73 74 65 6e 65 72 5b 6e 5d 29 3b 0a 20 20 20  istener[n]);.   
10f30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
10f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10f50 20 6c 69 73 74 65 6e 28 6c 69 73 74 65 6e 65 72   listen(listener
10f60 5b 6e 5d 2c 20 32 30 29 3c 30 20 29 7b 0a 20 20  [n], 20)<0 ){.  
10f70 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 6c 69        printf("li
10f80 73 74 65 6e 28 29 20 66 61 69 6c 65 64 3a 20 25  sten() failed: %
10f90 73 5c 6e 22 2c 20 73 74 72 65 72 72 6f 72 28 65  s\n", strerror(e
10fa0 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  rrno));.        
10fb0 63 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 5b 6e  close(listener[n
10fc0 5d 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ]);.        cont
10fd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
10fe0 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20      n++;.    }. 
10ff0 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b   }.  if( n==0 ){
11000 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
11010 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  err, "cannot ope
11020 6e 20 61 6e 79 20 73 6f 63 6b 65 74 73 5c 6e 22  n any sockets\n"
11030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
11040 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
11050 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 63 68 69   ){.    if( nchi
11060 6c 64 72 65 6e 3e 4d 41 58 5f 50 41 52 41 4c 4c  ldren>MAX_PARALL
11070 45 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EL ){.      /* S
11080 6c 6f 77 20 64 6f 77 6e 20 69 66 20 63 6f 6e 6e  low down if conn
11090 65 63 74 69 6f 6e 73 20 61 72 65 20 61 72 72 69  ections are arri
110a0 76 69 6e 67 20 74 6f 6f 20 66 61 73 74 20 2a 2f  ving too fast */
110b0 0a 20 20 20 20 20 20 73 6c 65 65 70 28 20 6e 63  .      sleep( nc
110c0 68 69 6c 64 72 65 6e 2d 4d 41 58 5f 50 41 52 41  hildren-MAX_PARA
110d0 4c 4c 45 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  LLEL );.    }.  
110e0 20 20 64 65 6c 61 79 2e 74 76 5f 73 65 63 20 3d    delay.tv_sec =
110f0 20 36 30 3b 0a 20 20 20 20 64 65 6c 61 79 2e 74   60;.    delay.t
11100 76 5f 75 73 65 63 20 3d 20 30 3b 0a 20 20 20 20  v_usec = 0;.    
11110 46 44 5f 5a 45 52 4f 28 26 72 65 61 64 66 64 73  FD_ZERO(&readfds
11120 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
11130 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
11140 20 61 73 73 65 72 74 28 20 6c 69 73 74 65 6e 65   assert( listene
11150 72 5b 69 5d 3e 3d 30 20 29 3b 0a 20 20 20 20 20  r[i]>=0 );.     
11160 20 46 44 5f 53 45 54 28 20 6c 69 73 74 65 6e 65   FD_SET( listene
11170 72 5b 69 5d 2c 20 26 72 65 61 64 66 64 73 29 3b  r[i], &readfds);
11180 0a 20 20 20 20 20 20 69 66 28 20 6c 69 73 74 65  .      if( liste
11190 6e 65 72 5b 69 5d 3e 6d 61 78 46 64 20 29 20 6d  ner[i]>maxFd ) m
111a0 61 78 46 64 20 3d 20 6c 69 73 74 65 6e 65 72 5b  axFd = listener[
111b0 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  i];.    }.    se
111c0 6c 65 63 74 28 20 6d 61 78 46 64 2b 31 2c 20 26  lect( maxFd+1, &
111d0 72 65 61 64 66 64 73 2c 20 30 2c 20 30 2c 20 26  readfds, 0, 0, &
111e0 64 65 6c 61 79 29 3b 0a 20 20 20 20 66 6f 72 28  delay);.    for(
111f0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
11200 20 20 20 20 20 20 69 66 28 20 46 44 5f 49 53 53        if( FD_ISS
11210 45 54 28 6c 69 73 74 65 6e 65 72 5b 69 5d 2c 20  ET(listener[i], 
11220 26 72 65 61 64 66 64 73 29 20 29 7b 0a 20 20 20  &readfds) ){.   
11230 20 20 20 20 20 6c 65 6e 61 64 64 72 20 3d 20 73       lenaddr = s
11240 69 7a 65 6f 66 28 69 6e 61 64 64 72 29 3b 0a 20  izeof(inaddr);. 
11250 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
11260 6e 20 3d 20 61 63 63 65 70 74 28 6c 69 73 74 65  n = accept(liste
11270 6e 65 72 5b 69 5d 2c 20 26 69 6e 61 64 64 72 2e  ner[i], &inaddr.
11280 73 61 2c 20 26 6c 65 6e 61 64 64 72 29 3b 0a 20  sa, &lenaddr);. 
11290 20 20 20 20 20 20 20 69 66 28 20 63 6f 6e 6e 65         if( conne
112a0 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  ction>=0 ){.    
112b0 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 66 6f        child = fo
112c0 72 6b 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rk();.          
112d0 69 66 28 20 63 68 69 6c 64 21 3d 30 20 29 7b 0a  if( child!=0 ){.
112e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
112f0 63 68 69 6c 64 3e 30 20 29 20 6e 63 68 69 6c 64  child>0 ) nchild
11300 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ren++;.         
11310 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74     close(connect
11320 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ion);.          
11330 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 73 75 62    /* printf("sub
11340 70 72 6f 63 65 73 73 20 25 64 20 73 74 61 72 74  process %d start
11350 65 64 2e 2e 2e 5c 6e 22 2c 20 63 68 69 6c 64 29  ed...\n", child)
11360 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
11370 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  ; */.          }
11380 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11390 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 2c 20    int nErr = 0, 
113a0 66 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd;.            
113b0 63 6c 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20  close(0);.      
113c0 20 20 20 20 20 20 66 64 20 3d 20 64 75 70 28 63        fd = dup(c
113d0 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20  onnection);.    
113e0 20 20 20 20 20 20 20 20 69 66 28 20 66 64 21 3d          if( fd!=
113f0 30 20 29 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  0 ) nErr++;.    
11400 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 31 29          close(1)
11410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64  ;.            fd
11420 20 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f   = dup(connectio
11430 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
11440 69 66 28 20 66 64 21 3d 31 20 29 20 6e 45 72 72  if( fd!=1 ) nErr
11450 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
11460 63 6c 6f 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e  close(connection
11470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
11480 65 74 75 72 6e 20 6e 45 72 72 3b 0a 20 20 20 20  eturn nErr;.    
11490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
114a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
114b0 2f 2a 20 42 75 72 79 20 64 65 61 64 20 63 68 69  /* Bury dead chi
114c0 6c 64 72 65 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ldren */.      w
114d0 68 69 6c 65 28 20 28 63 68 69 6c 64 20 3d 20 77  hile( (child = w
114e0 61 69 74 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f  aitpid(0, 0, WNO
114f0 48 41 4e 47 29 29 3e 30 20 29 7b 0a 20 20 20 20  HANG))>0 ){.    
11500 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 70      /* printf("p
11510 72 6f 63 65 73 73 20 25 64 20 65 6e 64 73 5c 6e  rocess %d ends\n
11520 22 2c 20 63 68 69 6c 64 29 3b 20 66 66 6c 75 73  ", child); fflus
11530 68 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20  h(stdout); */.  
11540 20 20 20 20 20 20 6e 63 68 69 6c 64 72 65 6e 2d        nchildren-
11550 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
11560 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45  .  }.  /* NOT RE
11570 41 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78 69  ACHED */  .  exi
11580 74 28 31 29 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 61  t(1);.}...int ma
11590 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
115a0 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74  r **argv){.  int
115b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
115c0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
115d0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  ounter */.  char
115e0 20 2a 7a 50 65 72 6d 55 73 65 72 20 3d 20 30 3b   *zPermUser = 0;
115f0 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 64 61 65        /* Run dae
11600 6d 6f 6e 20 77 69 74 68 20 74 68 69 73 20 75 73  mon with this us
11610 65 72 27 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  er's permissions
11620 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11630 20 2a 7a 50 6f 72 74 20 3d 20 30 3b 20 20 20 20   *zPort = 0;    
11640 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  /* Implement an 
11650 48 54 54 50 20 73 65 72 76 65 72 20 70 72 6f 63  HTTP server proc
11660 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ess */.  int use
11670 43 68 72 6f 6f 74 4a 61 69 6c 20 3d 20 31 3b 20  ChrootJail = 1; 
11680 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
11690 65 20 61 20 63 68 61 6e 67 65 2d 72 6f 6f 74 20  e a change-root 
116a0 6a 61 69 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  jail */.  struct
116b0 20 70 61 73 73 77 64 20 2a 70 77 64 20 3d 20 30   passwd *pwd = 0
116c0 3b 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ;   /* Informati
116d0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75 73 65  on about the use
116e0 72 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  r */..  /* Recor
116f0 64 20 74 68 65 20 74 69 6d 65 20 77 68 65 6e 20  d the time when 
11700 70 72 6f 63 65 73 73 69 6e 67 20 62 65 67 69 6e  processing begin
11710 73 2e 0a 20 20 2a 2f 0a 20 20 67 65 74 74 69 6d  s..  */.  gettim
11720 65 6f 66 64 61 79 28 26 62 65 67 69 6e 54 69 6d  eofday(&beginTim
11730 65 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  e, 0);..  /* Par
11740 73 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  se command-line 
11750 61 72 67 75 6d 65 6e 74 73 0a 20 20 2a 2f 0a 20  arguments.  */. 
11760 20 77 68 69 6c 65 28 20 61 72 67 63 3e 31 20 26   while( argc>1 &
11770 26 20 61 72 67 76 5b 31 5d 5b 30 5d 3d 3d 27 2d  & argv[1][0]=='-
11780 27 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ' ){.    char *z
11790 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 20 20   = argv[1];.    
117a0 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 61 72 67  char *zArg = arg
117b0 63 3e 3d 33 20 3f 20 61 72 67 76 5b 32 5d 20 3a  c>=3 ? argv[2] :
117c0 20 22 30 22 3b 0a 20 20 20 20 69 66 28 20 7a 5b   "0";.    if( z[
117d0 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d  0]=='-' && z[1]=
117e0 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
117f0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 75  if( strcmp(z,"-u
11800 73 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ser")==0 ){.    
11810 20 20 7a 50 65 72 6d 55 73 65 72 20 3d 20 7a 41    zPermUser = zA
11820 72 67 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  rg;.    }else if
11830 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 72 6f 6f  ( strcmp(z,"-roo
11840 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
11850 7a 52 6f 6f 74 20 3d 20 7a 41 72 67 3b 0a 20 20  zRoot = zArg;.  
11860 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11870 6d 70 28 7a 2c 22 2d 6c 6f 67 66 69 6c 65 22 29  mp(z,"-logfile")
11880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4c 6f  ==0 ){.      zLo
11890 67 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20  gFile = zArg;.  
118a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
118b0 6d 70 28 7a 2c 22 2d 6d 61 78 2d 61 67 65 22 29  mp(z,"-max-age")
118c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 78 41  ==0 ){.      mxA
118d0 67 65 20 3d 20 61 74 6f 69 28 7a 41 72 67 29 3b  ge = atoi(zArg);
118e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
118f0 74 72 63 6d 70 28 7a 2c 22 2d 68 74 74 70 73 22  trcmp(z,"-https"
11900 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 73  )==0 ){.      us
11910 65 48 74 74 70 73 20 3d 20 61 74 6f 69 28 7a 41  eHttps = atoi(zA
11920 72 67 29 3b 0a 20 20 20 20 20 20 7a 48 74 74 70  rg);.      zHttp
11930 20 3d 20 75 73 65 48 74 74 70 73 20 3f 20 22 68   = useHttps ? "h
11940 74 74 70 73 22 20 3a 20 22 68 74 74 70 22 3b 0a  ttps" : "http";.
11950 20 20 20 20 20 20 69 66 28 20 75 73 65 48 74 74        if( useHtt
11960 70 73 20 29 20 7a 52 65 6d 6f 74 65 41 64 64 72  ps ) zRemoteAddr
11970 20 3d 20 67 65 74 65 6e 76 28 22 52 45 4d 4f 54   = getenv("REMOT
11980 45 5f 48 4f 53 54 22 29 3b 0a 20 20 20 20 7d 65  E_HOST");.    }e
11990 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
119a0 2c 20 22 2d 70 6f 72 74 22 29 3d 3d 30 20 29 7b  , "-port")==0 ){
119b0 0a 20 20 20 20 20 20 7a 50 6f 72 74 20 3d 20 7a  .      zPort = z
119c0 41 72 67 3b 0a 20 20 20 20 20 20 73 74 61 6e 64  Arg;.      stand
119d0 61 6c 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  alone = 1;.    }
119e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
119f0 7a 2c 20 22 2d 66 61 6d 69 6c 79 22 29 3d 3d 30  z, "-family")==0
11a00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
11a10 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76 34  rcmp(zArg, "ipv4
11a20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11a30 20 69 70 76 34 4f 6e 6c 79 20 3d 20 31 3b 0a 20   ipv4Only = 1;. 
11a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11a50 74 72 63 6d 70 28 7a 41 72 67 2c 20 22 69 70 76  trcmp(zArg, "ipv
11a60 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  6")==0 ){.      
11a70 20 20 69 70 76 36 4f 6e 6c 79 20 3d 20 31 3b 0a    ipv6Only = 1;.
11a80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11a90 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
11aa0 28 35 30 30 2c 20 20 2f 2a 20 4c 4f 47 3a 20 75  (500,  /* LOG: u
11ab0 6e 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63  nknown IP protoc
11ac0 6f 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ol */.          
11ad0 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
11ae0 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f 6c 3a 20  wn IP protocol: 
11af0 5b 25 73 5d 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a  [%s]\n", zArg);.
11b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
11b10 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20  e if( strcmp(z, 
11b20 22 2d 6a 61 69 6c 22 29 3d 3d 30 20 29 7b 0a 20  "-jail")==0 ){. 
11b30 20 20 20 20 20 69 66 28 20 61 74 6f 69 28 7a 41       if( atoi(zA
11b40 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
11b50 20 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20    useChrootJail 
11b60 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
11b70 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11b80 70 28 7a 2c 20 22 2d 64 65 62 75 67 22 29 3d 3d  p(z, "-debug")==
11b90 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  0 ){.      if( a
11ba0 74 6f 69 28 7a 41 72 67 29 20 29 7b 0a 20 20 20  toi(zArg) ){.   
11bb0 20 20 20 20 20 75 73 65 54 69 6d 65 6f 75 74 20       useTimeout 
11bc0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
11bd0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11be0 70 28 7a 2c 20 22 2d 64 61 74 65 74 65 73 74 22  p(z, "-datetest"
11bf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 65  )==0 ){.      Te
11c00 73 74 50 61 72 73 65 52 66 63 38 32 32 44 61 74  stParseRfc822Dat
11c10 65 28 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  e();.      print
11c20 66 28 22 4f 6b 5c 6e 22 29 3b 0a 20 20 20 20 20  f("Ok\n");.     
11c30 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 7d 65   exit(0);.    }e
11c40 6c 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75  lse{.      Malfu
11c50 6e 63 74 69 6f 6e 28 35 31 30 2c 20 2f 2a 20 4c  nction(510, /* L
11c60 4f 47 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d  OG: unknown comm
11c70 61 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and-line argumen
11c80 74 20 6f 6e 20 6c 61 75 6e 63 68 20 2a 2f 0a 20  t on launch */. 
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ca0 20 22 75 6e 6b 6e 6f 77 6e 20 61 72 67 75 6d 65   "unknown argume
11cb0 6e 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  nt: [%s]\n", z);
11cc0 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 76 20  .    }.    argv 
11cd0 2b 3d 20 32 3b 0a 20 20 20 20 61 72 67 63 20 2d  += 2;.    argc -
11ce0 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 2;.  }.  if( z
11cf0 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Root==0 ){.    i
11d00 66 28 20 73 74 61 6e 64 61 6c 6f 6e 65 20 29 7b  f( standalone ){
11d10 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 22  .      zRoot = "
11d20 2e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .";.    }else{. 
11d30 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e       Malfunction
11d40 28 35 32 30 2c 20 2f 2a 20 4c 4f 47 3a 20 2d 2d  (520, /* LOG: --
11d50 72 6f 6f 74 20 61 72 67 75 6d 65 6e 74 20 6d 69  root argument mi
11d60 73 73 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20  ssing */.       
11d70 20 20 20 20 20 20 20 20 20 20 20 22 6e 6f 20 2d             "no -
11d80 2d 72 6f 6f 74 20 73 70 65 63 69 66 69 65 64 22  -root specified"
11d90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
11da0 20 20 2f 2a 20 43 68 61 6e 67 65 20 64 69 72 65    /* Change dire
11db0 63 74 6f 72 69 65 73 20 74 6f 20 74 68 65 20 72  ctories to the r
11dc0 6f 6f 74 20 6f 66 20 74 68 65 20 48 54 54 50 20  oot of the HTTP 
11dd0 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 54 68 65  filesystem.  The
11de0 6e 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20  n.  ** create a 
11df0 63 68 72 6f 6f 74 20 6a 61 69 6c 20 74 68 65 72  chroot jail ther
11e00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68  e..  */.  if( ch
11e10 64 69 72 28 7a 52 6f 6f 74 29 21 3d 30 20 29 7b  dir(zRoot)!=0 ){
11e20 0a 20 20 20 20 4d 61 6c 66 75 6e 63 74 69 6f 6e  .    Malfunction
11e30 28 35 33 30 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68  (530, /* LOG: ch
11e40 64 69 72 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  dir() failed */.
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74  "cannot change t
11e70 6f 20 64 69 72 65 63 74 6f 72 79 20 5b 25 73 5d  o directory [%s]
11e80 22 2c 20 7a 52 6f 6f 74 29 3b 0a 20 20 7d 0a 0a  ", zRoot);.  }..
11e90 20 20 2f 2a 20 47 65 74 20 69 6e 66 6f 72 6d 61    /* Get informa
11ea0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 75  tion about the u
11eb0 73 65 72 20 69 66 20 61 76 61 69 6c 61 62 6c 65  ser if available
11ec0 20 2a 2f 0a 20 20 69 66 28 20 7a 50 65 72 6d 55   */.  if( zPermU
11ed0 73 65 72 20 29 20 70 77 64 20 3d 20 67 65 74 70  ser ) pwd = getp
11ee0 77 6e 61 6d 28 7a 50 65 72 6d 55 73 65 72 29 3b  wnam(zPermUser);
11ef0 0a 0a 20 20 2f 2a 20 45 6e 74 65 72 20 74 68 65  ..  /* Enter the
11f00 20 63 68 72 6f 6f 74 20 6a 61 69 6c 20 69 66 20   chroot jail if 
11f10 72 65 71 75 65 73 74 65 64 20 2a 2f 20 20 0a 20  requested */  . 
11f20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20 26   if( zPermUser &
11f30 26 20 75 73 65 43 68 72 6f 6f 74 4a 61 69 6c 20  & useChrootJail 
11f40 26 26 20 67 65 74 75 69 64 28 29 3d 3d 30 20 29  && getuid()==0 )
11f50 7b 0a 20 20 20 20 69 66 28 20 63 68 72 6f 6f 74  {.    if( chroot
11f60 28 22 2e 22 29 3c 30 20 29 7b 0a 20 20 20 20 20  (".")<0 ){.     
11f70 20 4d 61 6c 66 75 6e 63 74 69 6f 6e 28 35 34 30   Malfunction(540
11f80 2c 20 2f 2a 20 4c 4f 47 3a 20 63 68 72 6f 6f 74  , /* LOG: chroot
11f90 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  () failed */.   
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11fb0 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65  unable to create
11fc0 20 63 68 72 6f 6f 74 20 6a 61 69 6c 22 29 3b 0a   chroot jail");.
11fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11fe0 20 7a 52 6f 6f 74 20 3d 20 22 22 3b 0a 20 20 20   zRoot = "";.   
11ff0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 74   }.  }..  /* Act
12000 69 76 61 74 65 20 74 68 65 20 73 65 72 76 65 72  ivate the server
12010 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a  , if requested *
12020 2f 0a 20 20 69 66 28 20 7a 50 6f 72 74 20 26 26  /.  if( zPort &&
12030 20 68 74 74 70 5f 73 65 72 76 65 72 28 7a 50 6f   http_server(zPo
12040 72 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 4d 61  rt, 0) ){.    Ma
12050 6c 66 75 6e 63 74 69 6f 6e 28 35 35 30 2c 20 2f  lfunction(550, /
12060 2a 20 4c 4f 47 3a 20 73 65 72 76 65 72 20 73 74  * LOG: server st
12070 61 72 74 75 70 20 66 61 69 6c 65 64 20 2a 2f 0a  artup failed */.
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 22 66 61 69 6c 65 64 20 74 6f 20 73 74 61 72 74  "failed to start
120a0 20 73 65 72 76 65 72 22 29 3b 0a 20 20 7d 0a 0a   server");.  }..
120b0 20 20 2f 2a 20 44 72 6f 70 20 72 6f 6f 74 20 70    /* Drop root p
120c0 72 69 76 69 6c 65 67 65 73 2e 0a 20 20 2a 2f 0a  rivileges..  */.
120d0 20 20 69 66 28 20 7a 50 65 72 6d 55 73 65 72 20    if( zPermUser 
120e0 29 7b 0a 20 20 20 20 69 66 28 20 70 77 64 20 29  ){.    if( pwd )
120f0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 65 74 67  {.      if( setg
12100 69 64 28 70 77 64 2d 3e 70 77 5f 67 69 64 29 20  id(pwd->pw_gid) 
12110 29 7b 0a 20 20 20 20 20 20 20 20 4d 61 6c 66 75  ){.        Malfu
12120 6e 63 74 69 6f 6e 28 35 36 30 2c 20 2f 2a 20 4c  nction(560, /* L
12130 4f 47 3a 20 73 65 74 67 69 64 28 29 20 66 61 69  OG: setgid() fai
12140 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  led */.         
12150 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
12160 6f 74 20 73 65 74 20 67 72 6f 75 70 2d 69 64 20  ot set group-id 
12170 74 6f 20 25 64 22 2c 20 70 77 64 2d 3e 70 77 5f  to %d", pwd->pw_
12180 67 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gid);.      }.  
12190 20 20 20 20 69 66 28 20 73 65 74 75 69 64 28 70      if( setuid(p
121a0 77 64 2d 3e 70 77 5f 75 69 64 29 20 29 7b 0a 20  wd->pw_uid) ){. 
121b0 20 20 20 20 20 20 20 4d 61 6c 66 75 6e 63 74 69         Malfuncti
121c0 6f 6e 28 35 37 30 2c 20 2f 2a 20 4c 4f 47 3a 20  on(570, /* LOG: 
121d0 73 65 74 75 69 64 28 29 20 66 61 69 6c 65 64 20  setuid() failed 
121e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
121f0 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 73         "cannot s
12200 65 74 20 75 73 65 72 2d 69 64 20 74 6f 20 25 64  et user-id to %d
12210 22 2c 20 70 77 64 2d 3e 70 77 5f 75 69 64 29 3b  ", pwd->pw_uid);
12220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
12230 73 65 7b 0a 20 20 20 20 20 20 4d 61 6c 66 75 6e  se{.      Malfun
12240 63 74 69 6f 6e 28 35 38 30 2c 20 2f 2a 20 4c 4f  ction(580, /* LO
12250 47 3a 20 75 6e 6b 6e 6f 77 6e 20 75 73 65 72 20  G: unknown user 
12260 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
12270 20 20 20 20 20 22 6e 6f 20 73 75 63 68 20 75 73       "no such us
12280 65 72 20 5b 25 73 5d 22 2c 20 7a 50 65 72 6d 55  er [%s]", zPermU
12290 73 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ser);.    }.  }.
122a0 20 20 69 66 28 20 67 65 74 75 69 64 28 29 3d 3d    if( getuid()==
122b0 30 20 29 7b 0a 20 20 20 20 4d 61 6c 66 75 6e 63  0 ){.    Malfunc
122c0 74 69 6f 6e 28 35 39 30 2c 20 2f 2a 20 4c 4f 47  tion(590, /* LOG
122d0 3a 20 63 61 6e 6e 6f 74 20 72 75 6e 20 61 73 20  : cannot run as 
122e0 72 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  root */.        
122f0 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
12300 72 75 6e 20 61 73 20 72 6f 6f 74 22 29 3b 0a 20  run as root");. 
12310 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65   }..  /* Get the
12320 20 49 50 20 61 64 64 72 65 73 73 20 66 72 6f 6d   IP address from
12330 20 77 68 65 6e 63 65 20 74 68 65 20 72 65 71 75   whence the requ
12340 65 73 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 20  est originates. 
12350 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74   */.  if( zRemot
12360 65 41 64 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  eAddr==0 ){.    
12370 61 64 64 72 65 73 73 20 72 65 6d 6f 74 65 41 64  address remoteAd
12380 64 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  dr;.    unsigned
12390 20 69 6e 74 20 73 69 7a 65 20 3d 20 73 69 7a 65   int size = size
123a0 6f 66 28 72 65 6d 6f 74 65 41 64 64 72 29 3b 0a  of(remoteAddr);.
123b0 20 20 20 20 63 68 61 72 20 7a 48 6f 73 74 5b 4e      char zHost[N
123c0 49 5f 4d 41 58 48 4f 53 54 5d 3b 0a 20 20 20 20  I_MAXHOST];.    
123d0 69 66 28 20 67 65 74 70 65 65 72 6e 61 6d 65 28  if( getpeername(
123e0 30 2c 20 26 72 65 6d 6f 74 65 41 64 64 72 2e 73  0, &remoteAddr.s
123f0 61 2c 20 26 73 69 7a 65 29 3e 3d 30 20 29 7b 0a  a, &size)>=0 ){.
12400 20 20 20 20 20 20 67 65 74 6e 61 6d 65 69 6e 66        getnameinf
12410 6f 28 26 72 65 6d 6f 74 65 41 64 64 72 2e 73 61  o(&remoteAddr.sa
12420 2c 20 73 69 7a 65 2c 20 7a 48 6f 73 74 2c 20 73  , size, zHost, s
12430 69 7a 65 6f 66 28 7a 48 6f 73 74 29 2c 20 30 2c  izeof(zHost), 0,
12440 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
12450 20 20 20 20 20 20 4e 49 5f 4e 55 4d 45 52 49 43        NI_NUMERIC
12460 48 4f 53 54 29 3b 0a 20 20 20 20 20 20 7a 52 65  HOST);.      zRe
12470 6d 6f 74 65 41 64 64 72 20 3d 20 53 74 72 44 75  moteAddr = StrDu
12480 70 28 7a 48 6f 73 74 29 3b 0a 20 20 20 20 7d 0a  p(zHost);.    }.
12490 20 20 7d 0a 20 20 69 66 28 20 7a 52 65 6d 6f 74    }.  if( zRemot
124a0 65 41 64 64 72 21 3d 30 0a 20 20 20 26 26 20 73  eAddr!=0.   && s
124b0 74 72 6e 63 6d 70 28 7a 52 65 6d 6f 74 65 41 64  trncmp(zRemoteAd
124c0 64 72 2c 20 22 3a 3a 66 66 66 66 3a 22 2c 20 37  dr, "::ffff:", 7
124d0 29 3d 3d 30 0a 20 20 20 26 26 20 73 74 72 63 68  )==0.   && strch
124e0 72 28 7a 52 65 6d 6f 74 65 41 64 64 72 2b 37 2c  r(zRemoteAddr+7,
124f0 20 27 3a 27 29 3d 3d 30 0a 20 20 20 26 26 20 73   ':')==0.   && s
12500 74 72 63 68 72 28 7a 52 65 6d 6f 74 65 41 64 64  trchr(zRemoteAdd
12510 72 2b 37 2c 20 27 2e 27 29 21 3d 30 0a 20 20 29  r+7, '.')!=0.  )
12520 7b 0a 20 20 20 20 7a 52 65 6d 6f 74 65 41 64 64  {.    zRemoteAdd
12530 72 20 2b 3d 20 37 3b 0a 20 20 7d 0a 0a 20 20 2f  r += 7;.  }..  /
12540 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e  * Process the in
12550 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20  put stream */.  
12560 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20  for(i=0; i<100; 
12570 69 2b 2b 29 7b 0a 20 20 20 20 50 72 6f 63 65 73  i++){.    Proces
12580 73 4f 6e 65 52 65 71 75 65 73 74 28 30 29 3b 0a  sOneRequest(0);.
12590 20 20 7d 0a 20 20 50 72 6f 63 65 73 73 4f 6e 65    }.  ProcessOne
125a0 52 65 71 75 65 73 74 28 31 29 3b 0a 20 20 65 78  Request(1);.  ex
125b0 69 74 28 30 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a  it(0);.}..#if 0.
125c0 2f 2a 20 43 6f 70 79 2f 70 61 73 74 65 20 74 68  /* Copy/paste th
125d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74  e following text
125e0 20 69 6e 74 6f 20 53 51 4c 69 74 65 20 74 6f 20   into SQLite to 
125f0 67 65 6e 65 72 61 74 65 20 74 68 65 20 78 72 65  generate the xre
12600 66 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  f.** table that 
12610 64 65 73 63 72 69 62 65 73 20 61 6c 6c 20 65 72  describes all er
12620 72 6f 72 20 63 6f 64 65 73 2e 0a 2a 2f 0a 42 45  ror codes..*/.BE
12630 47 49 4e 3b 0a 43 52 45 41 54 45 20 54 41 42 4c  GIN;.CREATE TABL
12640 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
12650 78 72 65 66 28 6c 69 6e 65 6e 6f 20 49 4e 54 45  xref(lineno INTE
12660 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
12670 20 64 65 73 63 20 54 45 58 54 29 3b 0a 44 45 4c   desc TEXT);.DEL
12680 45 54 45 20 46 52 4f 4d 20 58 72 65 66 3b 0a 49  ETE FROM Xref;.I
12690 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
126a0 56 41 4c 55 45 53 28 31 30 30 2c 27 4d 61 6c 6c  VALUES(100,'Mall
126b0 6f 63 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49  oc() failed');.I
126c0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
126d0 56 41 4c 55 45 53 28 31 31 30 2c 27 4e 6f 74 20  VALUES(110,'Not 
126e0 61 75 74 68 6f 72 69 7a 65 64 27 29 3b 0a 49 4e  authorized');.IN
126f0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12700 41 4c 55 45 53 28 31 32 30 2c 27 43 47 49 20 45  ALUES(120,'CGI E
12710 72 72 6f 72 27 29 3b 0a 49 4e 53 45 52 54 20 49  rror');.INSERT I
12720 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
12730 31 33 30 2c 27 54 69 6d 65 6f 75 74 27 29 3b 0a  130,'Timeout');.
12740 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
12750 20 56 41 4c 55 45 53 28 31 34 30 2c 27 43 47 49   VALUES(140,'CGI
12760 20 73 63 72 69 70 74 20 69 73 20 77 72 69 74 61   script is writa
12770 62 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ble');.INSERT IN
12780 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 31  TO xref VALUES(1
12790 35 30 2c 27 43 61 6e 6e 6f 74 20 6f 70 65 6e 20  50,'Cannot open 
127a0 2d 61 75 74 68 20 66 69 6c 65 27 29 3b 0a 49 4e  -auth file');.IN
127b0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
127c0 41 4c 55 45 53 28 31 36 30 2c 27 68 74 74 70 20  ALUES(160,'http 
127d0 72 65 71 75 65 73 74 20 6f 6e 20 68 74 74 70 73  request on https
127e0 2d 6f 6e 6c 79 20 70 61 67 65 27 29 3b 0a 49 4e  -only page');.IN
127f0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12800 41 4c 55 45 53 28 31 37 30 2c 27 2d 61 75 74 68  ALUES(170,'-auth
12810 20 72 65 64 69 72 65 63 74 27 29 3b 0a 49 4e 53   redirect');.INS
12820 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41  ERT INTO xref VA
12830 4c 55 45 53 28 31 38 30 2c 27 6d 61 6c 66 6f 72  LUES(180,'malfor
12840 6d 65 64 20 65 6e 74 72 79 20 69 6e 20 2d 61 75  med entry in -au
12850 74 68 20 66 69 6c 65 27 29 3b 0a 49 4e 53 45 52  th file');.INSER
12860 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12870 45 53 28 31 39 30 2c 27 63 68 64 69 72 28 29 20  ES(190,'chdir() 
12880 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
12890 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
128a0 53 28 32 30 30 2c 27 62 61 64 20 70 72 6f 74 6f  S(200,'bad proto
128b0 63 6f 6c 20 69 6e 20 48 54 54 50 20 68 65 61 64  col in HTTP head
128c0 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  er');.INSERT INT
128d0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 31  O xref VALUES(21
128e0 30 2c 27 45 6d 70 74 79 20 72 65 71 75 65 73 74  0,'Empty request
128f0 20 55 52 49 27 29 3b 0a 49 4e 53 45 52 54 20 49   URI');.INSERT I
12900 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
12910 32 32 30 2c 27 55 6e 6b 6e 6f 77 6e 20 72 65 71  220,'Unknown req
12920 75 65 73 74 20 6d 65 74 68 6f 64 27 29 3b 0a 49  uest method');.I
12930 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
12940 56 41 4c 55 45 53 28 32 33 30 2c 27 52 65 66 65  VALUES(230,'Refe
12950 72 72 65 72 20 69 73 20 64 65 76 69 64 73 2e 6e  rrer is devids.n
12960 65 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  et');.INSERT INT
12970 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 34  O xref VALUES(24
12980 30 2c 27 49 6c 6c 65 67 61 6c 20 63 6f 6e 74 65  0,'Illegal conte
12990 6e 74 20 69 6e 20 48 4f 53 54 3a 20 70 61 72 61  nt in HOST: para
129a0 6d 65 74 65 72 27 29 3b 0a 49 4e 53 45 52 54 20  meter');.INSERT 
129b0 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
129c0 28 32 35 30 2c 27 44 69 73 61 6c 6c 6f 77 65 64  (250,'Disallowed
129d0 20 75 73 65 72 20 61 67 65 6e 74 27 29 3b 0a 49   user agent');.I
129e0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
129f0 56 41 4c 55 45 53 28 32 36 30 2c 27 44 69 73 61  VALUES(260,'Disa
12a00 6c 6c 6f 77 65 64 20 72 65 66 65 72 72 65 72 27  llowed referrer'
12a10 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12a20 72 65 66 20 56 41 4c 55 45 53 28 32 37 30 2c 27  ref VALUES(270,'
12a30 52 65 71 75 65 73 74 20 74 6f 6f 20 6c 61 72 67  Request too larg
12a40 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  e');.INSERT INTO
12a50 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 38 30   xref VALUES(280
12a60 2c 27 6d 6b 73 74 65 6d 70 28 29 20 66 61 69 6c  ,'mkstemp() fail
12a70 65 64 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ed');.INSERT INT
12a80 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 39  O xref VALUES(29
12a90 30 2c 27 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  0,'cannot create
12aa0 20 74 65 6d 70 20 66 69 6c 65 20 66 6f 72 20 50   temp file for P
12ab0 4f 53 54 20 63 6f 6e 74 65 6e 74 27 29 3b 0a 49  OST content');.I
12ac0 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
12ad0 56 41 4c 55 45 53 28 33 30 30 2c 27 50 61 74 68  VALUES(300,'Path
12ae0 20 65 6c 65 6d 65 6e 74 20 62 65 67 69 6e 73 20   element begins 
12af0 77 69 74 68 20 2e 20 6f 72 20 2d 27 29 3b 0a 49  with . or -');.I
12b00 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20  NSERT INTO xref 
12b10 56 41 4c 55 45 53 28 33 31 30 2c 27 55 52 49 20  VALUES(310,'URI 
12b20 64 6f 65 73 20 6e 6f 74 20 73 74 61 72 74 20 77  does not start w
12b30 69 74 68 20 2f 27 29 3b 0a 49 4e 53 45 52 54 20  ith /');.INSERT 
12b40 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53  INTO xref VALUES
12b50 28 33 32 30 2c 27 55 52 49 20 74 6f 6f 20 6c 6f  (320,'URI too lo
12b60 6e 67 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ng');.INSERT INT
12b70 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 33  O xref VALUES(33
12b80 30 2c 27 4d 69 73 73 69 6e 67 20 48 4f 53 54 3a  0,'Missing HOST:
12b90 20 70 61 72 61 6d 65 74 65 72 27 29 3b 0a 49 4e   parameter');.IN
12ba0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12bb0 41 4c 55 45 53 28 33 34 30 2c 27 48 4f 53 54 20  ALUES(340,'HOST 
12bc0 70 61 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 6f  parameter too lo
12bd0 6e 67 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ng');.INSERT INT
12be0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 35  O xref VALUES(35
12bf0 30 2c 27 2a 2e 77 65 62 73 69 74 65 20 70 65 72  0,'*.website per
12c00 6d 69 73 73 69 6f 6e 73 27 29 3b 0a 49 4e 53 45  missions');.INSE
12c10 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12c20 55 45 53 28 33 36 30 2c 27 63 68 64 69 72 28 29  UES(360,'chdir()
12c30 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52   failed');.INSER
12c40 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55  T INTO xref VALU
12c50 45 53 28 33 37 30 2c 27 72 65 64 69 72 65 63 74  ES(370,'redirect
12c60 20 74 6f 20 6e 6f 74 2d 66 6f 75 6e 64 20 70 61   to not-found pa
12c70 67 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ge');.INSERT INT
12c80 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 33 38  O xref VALUES(38
12c90 30 2c 27 55 52 49 20 6e 6f 74 20 66 6f 75 6e 64  0,'URI not found
12ca0 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12cb0 78 72 65 66 20 56 41 4c 55 45 53 28 33 39 30 2c  xref VALUES(390,
12cc0 27 46 69 6c 65 20 6e 6f 74 20 72 65 61 64 61 62  'File not readab
12cd0 6c 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  le');.INSERT INT
12ce0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 30  O xref VALUES(40
12cf0 30 2c 27 55 52 49 20 69 73 20 61 20 64 69 72 65  0,'URI is a dire
12d00 63 74 6f 72 79 20 77 2f 6f 20 69 6e 64 65 78 2e  ctory w/o index.
12d10 68 74 6d 6c 27 29 3b 0a 49 4e 53 45 52 54 20 49  html');.INSERT I
12d20 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28  NTO xref VALUES(
12d30 34 31 30 2c 27 72 65 64 69 72 65 63 74 20 74 6f  410,'redirect to
12d40 20 61 64 64 20 74 72 61 69 6c 69 6e 67 20 2f 27   add trailing /'
12d50 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  );.INSERT INTO x
12d60 72 65 66 20 56 41 4c 55 45 53 28 34 32 30 2c 27  ref VALUES(420,'
12d70 63 68 64 69 72 28 29 20 66 61 69 6c 65 64 27 29  chdir() failed')
12d80 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72  ;.INSERT INTO xr
12d90 65 66 20 56 41 4c 55 45 53 28 34 33 30 2c 27 64  ef VALUES(430,'d
12da0 75 70 28 30 29 20 66 61 69 6c 65 64 27 29 3b 0a  up(0) failed');.
12db0 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66  INSERT INTO xref
12dc0 20 56 41 4c 55 45 53 28 34 34 30 2c 27 70 69 70   VALUES(440,'pip
12dd0 65 28 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e  e() failed');.IN
12de0 53 45 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56  SERT INTO xref V
12df0 41 4c 55 45 53 28 34 35 30 2c 27 64 75 70 28 31  ALUES(450,'dup(1
12e00 29 20 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45  ) failed');.INSE
12e10 52 54 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c  RT INTO xref VAL
12e20 55 45 53 28 34 36 30 2c 27 45 78 63 65 73 73 20  UES(460,'Excess 
12e30 55 52 49 20 63 6f 6e 74 65 6e 74 20 70 61 73 74  URI content past
12e40 20 73 74 61 74 69 63 20 66 69 6c 65 20 6e 61 6d   static file nam
12e50 65 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  e');.INSERT INTO
12e60 20 78 72 65 66 20 56 41 4c 55 45 53 28 34 37 30   xref VALUES(470
12e70 2c 27 45 54 61 67 20 43 61 63 68 65 20 48 69 74  ,'ETag Cache Hit
12e80 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
12e90 78 72 65 66 20 56 41 4c 55 45 53 28 34 38 30 2c  xref VALUES(480,
12ea0 27 66 6f 70 65 6e 28 29 20 66 61 69 6c 65 64 20  'fopen() failed 
12eb0 66 6f 72 20 73 74 61 74 69 63 20 63 6f 6e 74 65  for static conte
12ec0 6e 74 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  nt');.INSERT INT
12ed0 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 32 2c  O xref VALUES(2,
12ee0 27 4e 6f 72 6d 61 6c 20 48 45 41 44 20 72 65 70  'Normal HEAD rep
12ef0 6c 79 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54  ly');.INSERT INT
12f00 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 30 2c  O xref VALUES(0,
12f10 27 4e 6f 72 6d 61 6c 20 72 65 70 6c 79 27 29 3b  'Normal reply');
12f20 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 72 65  .INSERT INTO xre
12f30 66 20 56 41 4c 55 45 53 28 35 30 30 2c 27 75 6e  f VALUES(500,'un
12f40 6b 6e 6f 77 6e 20 49 50 20 70 72 6f 74 6f 63 6f  known IP protoco
12f50 6c 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  l');.INSERT INTO
12f60 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 31 30   xref VALUES(510
12f70 2c 27 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e  ,'unknown comman
12f80 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20  d-line argument 
12f90 6f 6e 20 6c 61 75 6e 63 68 27 29 3b 0a 49 4e 53  on launch');.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 35 32 30 2c 27 2d 2d 72 6f 6f 74  LUES(520,'--root
12fc0 20 61 72 67 75 6d 65 6e 74 20 6d 69 73 73 69 6e   argument missin
12fd0 67 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f  g');.INSERT INTO
12fe0 20 78 72 65 66 20 56 41 4c 55 45 53 28 35 33 30   xref VALUES(530
12ff0 2c 27 63 68 64 69 72 28 29 20 66 61 69 6c 65 64  ,'chdir() failed
13000 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
13010 78 72 65 66 20 56 41 4c 55 45 53 28 35 34 30 2c  xref VALUES(540,
13020 27 63 68 72 6f 6f 74 28 29 20 66 61 69 6c 65 64  'chroot() failed
13030 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e 54 4f 20  ');.INSERT INTO 
13040 78 72 65 66 20 56 41 4c 55 45 53 28 35 35 30 2c  xref VALUES(550,
13050 27 73 65 72 76 65 72 20 73 74 61 72 74 75 70 20  'server startup 
13060 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
13070 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
13080 53 28 35 36 30 2c 27 73 65 74 67 69 64 28 29 20  S(560,'setgid() 
13090 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
130a0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
130b0 53 28 35 37 30 2c 27 73 65 74 75 69 64 28 29 20  S(570,'setuid() 
130c0 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
130d0 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
130e0 53 28 35 38 30 2c 27 75 6e 6b 6e 6f 77 6e 20 75  S(580,'unknown u
130f0 73 65 72 27 29 3b 0a 49 4e 53 45 52 54 20 49 4e  ser');.INSERT IN
13100 54 4f 20 78 72 65 66 20 56 41 4c 55 45 53 28 35  TO xref VALUES(5
13110 39 30 2c 27 63 61 6e 6e 6f 74 20 72 75 6e 20 61  90,'cannot run a
13120 73 20 72 6f 6f 74 27 29 3b 0a 49 4e 53 45 52 54  s root');.INSERT
13130 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
13140 53 28 36 30 30 2c 27 6d 61 6c 6c 6f 63 28 29 20  S(600,'malloc() 
13150 66 61 69 6c 65 64 27 29 3b 0a 49 4e 53 45 52 54  failed');.INSERT
13160 20 49 4e 54 4f 20 78 72 65 66 20 56 41 4c 55 45   INTO xref VALUE
13170 53 28 36 31 30 2c 27 6d 61 6c 6c 6f 63 28 29 20  S(610,'malloc() 
13180 66 61 69 6c 65 64 27 29 3b 0a 43 4f 4d 4d 49 54  failed');.COMMIT
13190 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 20  ;.#endif /* SQL 
131a0 2a 2f 0a                                         */.