0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 36 20 44 2e 20 52 69 63 68 (c) 2006 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76 lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65 ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 l be useful,.**
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20 RPOSE. See the
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50 GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 d have received
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 ation, Inc., 59
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 ton, MA 02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 307, USA..**.**
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 nformation:.**
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 * http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 43 20 66 75 6e 63 contains C func
0380: 74 69 6f 6e 73 20 61 6e 64 20 70 72 6f 63 65 64 tions and proced
0390: 75 72 65 73 20 74 68 61 74 20 70 72 6f 76 69 64 ures that provid
03a0: 65 20 75 73 65 66 75 6c 0a 2a 2a 20 73 65 72 76 e useful.** serv
03b0: 69 63 65 73 20 74 6f 20 43 47 49 20 70 72 6f 67 ices to CGI prog
03c0: 72 61 6d 73 2e 20 20 54 68 65 72 65 20 61 72 65 rams. There are
03d0: 20 70 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20 procedures for
03e0: 70 61 72 73 69 6e 67 20 61 6e 64 0a 2a 2a 20 64 parsing and.** d
03f0: 69 73 70 65 6e 73 69 6e 67 20 51 55 45 52 59 5f ispensing QUERY_
0400: 53 54 52 49 4e 47 20 70 61 72 61 6d 65 74 65 72 STRING parameter
0410: 73 20 61 6e 64 20 63 6f 6f 6b 69 65 73 2c 20 74 s and cookies, t
0420: 68 65 20 22 6d 70 72 69 6e 74 66 28 29 22 0a 2a he "mprintf()".*
0430: 2a 20 66 6f 72 6d 61 74 74 69 6e 67 20 66 75 6e * formatting fun
0440: 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 63 6f ction and its co
0450: 75 73 69 6e 73 2c 20 61 6e 64 20 72 6f 75 74 69 usins, and routi
0460: 6e 65 73 20 74 6f 20 65 6e 63 6f 64 65 20 61 6e nes to encode an
0470: 64 0a 2a 2a 20 64 65 63 6f 64 65 20 73 74 72 69 d.** decode stri
0480: 6e 67 73 20 69 6e 20 48 54 4d 4c 20 6f 72 20 48 ngs in HTML or H
0490: 54 54 50 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 TTP..*/.#include
04a0: 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 66 64 "config.h".#ifd
04b0: 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 23 ef __MINGW32__.#
04c0: 20 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f include <windo
04d0: 77 73 2e 68 3e 20 20 20 20 20 20 20 20 20 20 20 ws.h>
04e0: 2f 2a 20 66 6f 72 20 53 6c 65 65 70 20 6f 6e 63 /* for Sleep onc
04f0: 65 20 73 65 72 76 65 72 20 77 6f 72 6b 73 20 61 e server works a
0500: 67 61 69 6e 20 2a 2f 0a 23 20 20 69 6e 63 6c 75 gain */.# inclu
0510: 64 65 20 3c 77 69 6e 73 6f 63 6b 32 2e 68 3e 20 de <winsock2.h>
0520: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 63 6b /* sock
0530: 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f et operations */
0540: 0a 23 20 20 64 65 66 69 6e 65 20 73 6c 65 65 70 .# define sleep
0550: 20 53 6c 65 65 70 20 20 20 20 20 20 20 20 20 20 Sleep
0560: 20 20 2f 2a 20 77 69 6e 64 6f 77 73 20 64 6f 65 /* windows doe
0570: 73 20 6e 6f 74 20 68 61 76 65 20 73 6c 65 65 70 s not have sleep
0580: 2c 20 62 75 74 20 53 6c 65 65 70 20 2a 2f 0a 23 , but Sleep */.#
0590: 20 20 69 6e 63 6c 75 64 65 20 3c 77 73 32 74 63 include <ws2tc
05a0: 70 69 70 2e 68 3e 20 20 20 20 20 20 20 20 20 20 pip.h>
05b0: 0a 23 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64 .#else.# includ
05c0: 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e e <sys/socket.h>
05d0: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6e 65 74 .# include <net
05e0: 69 6e 65 74 2f 69 6e 2e 68 3e 0a 23 20 20 69 6e inet/in.h>.# in
05f0: 63 6c 75 64 65 20 3c 61 72 70 61 2f 69 6e 65 74 clude <arpa/inet
0600: 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c .h>.# include <
0610: 73 79 73 2f 74 69 6d 65 73 2e 68 3e 0a 23 20 20 sys/times.h>.#
0620: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d include <sys/tim
0630: 65 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 e.h>.# include
0640: 3c 73 79 73 2f 77 61 69 74 2e 68 3e 0a 23 20 20 <sys/wait.h>.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 65 6c include <sys/sel
0660: 65 63 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 ect.h>.#endif.#i
0670: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a nclude <time.h>.
0680: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e #include <stdio.
0690: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 h>.#include <std
06a0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 lib.h>.#include
06b0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c <unistd.h>.#incl
06c0: 75 64 65 20 22 63 67 69 2e 68 22 0a 0a 23 69 66 ude "cgi.h"..#if
06d0: 20 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a 2a INTERFACE./*.**
06e0: 20 53 68 6f 72 74 63 75 74 73 20 66 6f 72 20 63 Shortcuts for c
06f0: 67 69 5f 70 61 72 61 6d 65 74 65 72 2e 20 20 50 gi_parameter. P
0700: 28 22 78 22 29 20 72 65 74 75 72 6e 73 20 74 68 ("x") returns th
0710: 65 20 76 61 6c 75 65 20 6f 66 20 71 75 65 72 79 e value of query
0720: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 72 parameter.** or
0730: 20 63 6f 6f 6b 69 65 20 22 78 22 2c 20 6f 72 20 cookie "x", or
0740: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 NULL if there is
0750: 20 6e 6f 20 73 75 63 68 20 70 61 72 61 6d 65 74 no such paramet
0760: 65 72 20 6f 72 20 63 6f 6f 6b 69 65 2e 20 20 50 er or cookie. P
0770: 44 28 22 78 22 2c 22 79 22 29 0a 2a 2a 20 64 6f D("x","y").** do
0780: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 es the same exce
0790: 70 74 20 22 79 22 20 69 73 20 72 65 74 75 72 6e pt "y" is return
07a0: 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e ed in place of N
07b0: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 ULL if there is
07c0: 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2f 0a 23 64 not match..*/.#d
07d0: 65 66 69 6e 65 20 50 28 78 29 20 20 20 20 20 20 efine P(x)
07e0: 20 20 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 cgi_parameter(
07f0: 28 78 29 2c 30 29 0a 23 64 65 66 69 6e 65 20 50 (x),0).#define P
0800: 44 28 78 2c 79 29 20 20 20 20 20 63 67 69 5f 70 D(x,y) cgi_p
0810: 61 72 61 6d 65 74 65 72 28 28 78 29 2c 28 79 29 arameter((x),(y)
0820: 29 0a 23 64 65 66 69 6e 65 20 51 50 28 78 29 20 ).#define QP(x)
0830: 20 20 20 20 20 20 71 75 6f 74 61 62 6c 65 5f 73 quotable_s
0840: 74 72 69 6e 67 28 63 67 69 5f 70 61 72 61 6d 65 tring(cgi_parame
0850: 74 65 72 28 28 78 29 2c 30 29 29 0a 23 64 65 66 ter((x),0)).#def
0860: 69 6e 65 20 51 50 44 28 78 2c 79 29 20 20 20 20 ine QPD(x,y)
0870: 71 75 6f 74 61 62 6c 65 5f 73 74 72 69 6e 67 28 quotable_string(
0880: 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 28 78 cgi_parameter((x
0890: 29 2c 28 79 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 ),(y))).../*.**
08a0: 44 65 73 74 69 6e 61 74 69 6f 6e 73 20 66 6f 72 Destinations for
08b0: 20 6f 75 74 70 75 74 20 74 65 78 74 2e 0a 2a 2f output text..*/
08c0: 0a 23 64 65 66 69 6e 65 20 43 47 49 5f 48 45 41 .#define CGI_HEA
08d0: 44 45 52 20 20 20 30 0a 23 64 65 66 69 6e 65 20 DER 0.#define
08e0: 43 47 49 5f 42 4f 44 59 20 20 20 20 20 31 0a 0a CGI_BODY 1..
08f0: 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 #endif /* INTERF
0900: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 ACE */../*.** Pr
0910: 6f 76 69 64 65 20 61 20 72 65 6c 69 61 62 6c 65 ovide a reliable
0920: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 implementation
0930: 6f 66 20 61 20 63 61 73 65 6c 65 73 73 20 73 74 of a caseless st
0940: 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 0a ring comparison.
0950: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a ** function..*/.
0960: 23 64 65 66 69 6e 65 20 73 74 72 69 63 6d 70 20 #define stricmp
0970: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 0a 65 sqlite3StrICmp.e
0980: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 xtern int sqlite
0990: 33 53 74 72 49 43 6d 70 28 63 6f 6e 73 74 20 63 3StrICmp(const c
09a0: 68 61 72 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 har*, const char
09b0: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 48 *);../*.** The H
09c0: 54 54 50 20 72 65 70 6c 79 20 69 73 20 67 65 6e TTP reply is gen
09d0: 65 72 61 74 65 64 20 69 6e 20 74 77 6f 20 70 69 erated in two pi
09e0: 65 63 65 73 3a 20 74 68 65 20 68 65 61 64 65 72 eces: the header
09f0: 20 61 6e 64 20 74 68 65 20 62 6f 64 79 2e 0a 2a and the body..*
0a00: 2a 20 54 68 65 73 65 20 70 69 65 63 65 73 20 61 * These pieces a
0a10: 72 65 20 67 65 6e 65 72 61 74 65 64 20 73 65 70 re generated sep
0a20: 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 arately because
0a30: 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 they are not nec
0a40: 65 73 73 61 72 79 0a 2a 2a 20 70 72 6f 64 75 63 essary.** produc
0a50: 65 64 20 69 6e 20 6f 72 64 65 72 2e 20 20 50 61 ed in order. Pa
0a60: 72 74 73 20 6f 66 20 74 68 65 20 68 65 61 64 65 rts of the heade
0a70: 72 20 6d 69 67 68 74 20 62 65 20 62 75 69 6c 74 r might be built
0a80: 20 61 66 74 65 72 20 61 6c 6c 20 6f 72 0a 2a 2a after all or.**
0a90: 20 70 61 72 74 20 6f 66 20 74 68 65 20 62 6f 64 part of the bod
0aa0: 79 2e 20 20 54 68 65 20 68 65 61 64 65 72 20 61 y. The header a
0ab0: 6e 64 20 62 6f 64 79 20 61 72 65 20 61 63 63 75 nd body are accu
0ac0: 6d 75 6c 61 74 65 64 20 69 6e 20 73 65 70 61 72 mulated in separ
0ad0: 61 74 65 0a 2a 2a 20 42 6c 6f 62 20 73 74 72 75 ate.** Blob stru
0ae0: 63 74 75 72 65 73 20 74 68 65 6e 20 6f 75 74 70 ctures then outp
0af0: 75 74 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 ut sequentially
0b00: 6f 6e 63 65 20 65 76 65 72 79 74 68 69 6e 67 20 once everything
0b10: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 62 75 69 6c has been.** buil
0b20: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 67 69 t..**.** The cgi
0b30: 5f 64 65 73 74 69 6e 61 74 69 6f 6e 28 29 20 69 _destination() i
0b40: 6e 74 65 72 66 61 63 65 20 73 77 69 74 63 68 20 nterface switch
0b50: 62 65 74 77 65 65 6e 20 74 68 65 20 62 75 66 66 between the buff
0b60: 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 ers..*/.static B
0b70: 6c 6f 62 20 63 67 69 43 6f 6e 74 65 6e 74 5b 32 lob cgiContent[2
0b80: 5d 20 3d 20 7b 20 42 4c 4f 42 5f 49 4e 49 54 49 ] = { BLOB_INITI
0b90: 41 4c 49 5a 45 52 2c 20 42 4c 4f 42 5f 49 4e 49 ALIZER, BLOB_INI
0ba0: 54 49 41 4c 49 5a 45 52 20 7d 3b 0a 73 74 61 74 TIALIZER };.stat
0bb0: 69 63 20 42 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e ic Blob *pConten
0bc0: 74 20 3d 20 26 63 67 69 43 6f 6e 74 65 6e 74 5b t = &cgiContent[
0bd0: 30 5d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 0];../*.** Set t
0be0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 62 he destination b
0bf0: 75 66 66 65 72 20 69 6e 74 6f 20 77 68 69 63 68 uffer into which
0c00: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 43 to accumulate C
0c10: 47 49 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 GI content..*/.v
0c20: 6f 69 64 20 63 67 69 5f 64 65 73 74 69 6e 61 74 oid cgi_destinat
0c30: 69 6f 6e 28 69 6e 74 20 64 65 73 74 29 7b 0a 20 ion(int dest){.
0c40: 20 73 77 69 74 63 68 28 20 64 65 73 74 20 29 7b switch( dest ){
0c50: 0a 20 20 20 20 63 61 73 65 20 43 47 49 5f 48 45 . case CGI_HE
0c60: 41 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 70 43 ADER: {. pC
0c70: 6f 6e 74 65 6e 74 20 3d 20 26 63 67 69 43 6f 6e ontent = &cgiCon
0c80: 74 65 6e 74 5b 30 5d 3b 0a 20 20 20 20 20 20 62 tent[0];. b
0c90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
0ca0: 63 61 73 65 20 43 47 49 5f 42 4f 44 59 3a 20 7b case CGI_BODY: {
0cb0: 0a 20 20 20 20 20 20 70 43 6f 6e 74 65 6e 74 20 . pContent
0cc0: 3d 20 26 63 67 69 43 6f 6e 74 65 6e 74 5b 31 5d = &cgiContent[1]
0cd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
0ce0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 }. default
0cf0: 3a 20 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 61 : {. cgi_pa
0d00: 6e 69 63 28 22 62 61 64 20 64 65 73 74 69 6e 61 nic("bad destina
0d10: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 tion");. }.
0d20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e }.}../*.** Appen
0d30: 64 20 72 65 70 6c 79 20 63 6f 6e 74 65 6e 74 20 d reply content
0d40: 74 6f 20 77 68 61 74 20 61 6c 72 65 61 64 79 20 to what already
0d50: 65 78 69 73 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 exists..*/.void
0d60: 63 67 69 5f 61 70 70 65 6e 64 5f 63 6f 6e 74 65 cgi_append_conte
0d70: 6e 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a nt(const char *z
0d80: 44 61 74 61 2c 20 69 6e 74 20 6e 41 6d 74 29 7b Data, int nAmt){
0d90: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 . blob_append(p
0da0: 43 6f 6e 74 65 6e 74 2c 20 7a 44 61 74 61 2c 20 Content, zData,
0db0: 6e 41 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nAmt);.}../*.**
0dc0: 52 65 73 65 74 20 74 68 65 20 48 54 54 50 20 72 Reset the HTTP r
0dd0: 65 70 6c 79 20 74 65 78 74 20 74 6f 20 62 65 20 eply text to be
0de0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e an empty string.
0df0: 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 72 65 73 .*/.void cgi_res
0e00: 65 74 5f 63 6f 6e 74 65 6e 74 28 76 6f 69 64 29 et_content(void)
0e10: 7b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 {. blob_reset(&
0e20: 63 67 69 43 6f 6e 74 65 6e 74 5b 30 5d 29 3b 0a cgiContent[0]);.
0e30: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 67 blob_reset(&cg
0e40: 69 43 6f 6e 74 65 6e 74 5b 31 5d 29 3b 0a 7d 0a iContent[1]);.}.
0e50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 ./*.** Return a
0e60: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 pointer to the C
0e70: 47 49 20 6f 75 74 70 75 74 20 62 6c 6f 62 2e 0a GI output blob..
0e80: 2a 2f 0a 42 6c 6f 62 20 2a 63 67 69 5f 6f 75 74 */.Blob *cgi_out
0e90: 70 75 74 5f 62 6c 6f 62 28 76 6f 69 64 29 7b 0a put_blob(void){.
0ea0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6e 74 65 6e return pConten
0eb0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 62 t;.}../*.** Comb
0ec0: 69 6e 65 20 74 68 65 20 68 65 61 64 65 72 20 61 ine the header a
0ed0: 6e 64 20 62 6f 64 79 20 6f 66 20 74 68 65 20 43 nd body of the C
0ee0: 47 49 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 GI into a single
0ef0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 string..*/.stat
0f00: 69 63 20 76 6f 69 64 20 63 67 69 5f 63 6f 6d 62 ic void cgi_comb
0f10: 69 6e 65 5f 68 65 61 64 65 72 5f 61 6e 64 5f 62 ine_header_and_b
0f20: 6f 64 79 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 ody(void){. int
0f30: 20 73 69 7a 65 20 3d 20 62 6c 6f 62 5f 73 69 7a size = blob_siz
0f40: 65 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 31 5d e(&cgiContent[1]
0f50: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3e 30 20 );. if( size>0
0f60: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 ){. blob_appe
0f70: 6e 64 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 30 nd(&cgiContent[0
0f80: 5d 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 ], blob_buffer(&
0f90: 63 67 69 43 6f 6e 74 65 6e 74 5b 31 5d 29 2c 20 cgiContent[1]),
0fa0: 73 69 7a 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f size);. blob_
0fb0: 72 65 73 65 74 28 26 63 67 69 43 6f 6e 74 65 6e reset(&cgiConten
0fc0: 74 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a t[1]);. }.}../*
0fd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 .** Return a poi
0fe0: 6e 74 65 72 20 74 6f 20 74 68 65 20 48 54 54 50 nter to the HTTP
0ff0: 20 72 65 70 6c 79 20 74 65 78 74 2e 0a 2a 2f 0a reply text..*/.
1000: 63 68 61 72 20 2a 63 67 69 5f 65 78 74 72 61 63 char *cgi_extrac
1010: 74 5f 63 6f 6e 74 65 6e 74 28 69 6e 74 20 2a 70 t_content(int *p
1020: 6e 41 6d 74 29 7b 0a 20 20 63 67 69 5f 63 6f 6d nAmt){. cgi_com
1030: 62 69 6e 65 5f 68 65 61 64 65 72 5f 61 6e 64 5f bine_header_and_
1040: 62 6f 64 79 28 29 3b 0a 20 20 72 65 74 75 72 6e body();. return
1050: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 63 67 blob_buffer(&cg
1060: 69 43 6f 6e 74 65 6e 74 5b 30 5d 29 3b 0a 7d 0a iContent[0]);.}.
1070: 0a 2f 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 ./*.** Additiona
1080: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 l information us
1090: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 20 48 ed to form the H
10a0: 54 54 50 20 72 65 70 6c 79 0a 2a 2f 0a 73 74 61 TTP reply.*/.sta
10b0: 74 69 63 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 tic char *zConte
10c0: 6e 74 54 79 70 65 20 3d 20 22 74 65 78 74 2f 68 ntType = "text/h
10d0: 74 6d 6c 22 3b 20 20 20 20 20 2f 2a 20 43 6f 6e tml"; /* Con
10e0: 74 65 6e 74 20 74 79 70 65 20 6f 66 20 74 68 65 tent type of the
10f0: 20 72 65 70 6c 79 20 2a 2f 0a 73 74 61 74 69 63 reply */.static
1100: 20 63 68 61 72 20 2a 7a 52 65 70 6c 79 53 74 61 char *zReplySta
1110: 74 75 73 20 3d 20 22 4f 4b 22 3b 20 20 20 20 20 tus = "OK";
1120: 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 79 20 /* Reply
1130: 73 74 61 74 75 73 20 64 65 73 63 72 69 70 74 69 status descripti
1140: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 on */.static int
1150: 20 69 52 65 70 6c 79 53 74 61 74 75 73 20 3d 20 iReplyStatus =
1160: 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 200;
1170: 20 20 20 2f 2a 20 52 65 70 6c 79 20 73 74 61 74 /* Reply stat
1180: 75 73 20 63 6f 64 65 20 2a 2f 0a 73 74 61 74 69 us code */.stati
1190: 63 20 42 6c 6f 62 20 65 78 74 72 61 48 65 61 64 c Blob extraHead
11a0: 65 72 20 3d 20 42 4c 4f 42 5f 49 4e 49 54 49 41 er = BLOB_INITIA
11b0: 4c 49 5a 45 52 3b 20 20 2f 2a 20 45 78 74 72 61 LIZER; /* Extra
11c0: 20 68 65 61 64 65 72 20 74 65 78 74 20 2a 2f 0a header text */.
11d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 ./*.** Set the r
11e0: 65 70 6c 79 20 63 6f 6e 74 65 6e 74 20 74 79 70 eply content typ
11f0: 65 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 e.*/.void cgi_se
1200: 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 63 t_content_type(c
1210: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 onst char *zType
1220: 29 7b 0a 20 20 7a 43 6f 6e 74 65 6e 74 54 79 70 ){. zContentTyp
1230: 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 22 e = mprintf("%s"
1240: 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a , zType);.}../*.
1250: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 70 6c 79 ** Set the reply
1260: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 content to the
1270: 73 70 65 63 69 66 69 65 64 20 42 4c 4f 42 2e 0a specified BLOB..
1280: 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 74 5f */.void cgi_set_
1290: 63 6f 6e 74 65 6e 74 28 42 6c 6f 62 20 2a 70 4e content(Blob *pN
12a0: 65 77 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 63 67 ewContent){. cg
12b0: 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 i_reset_content(
12c0: 29 3b 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 );. cgi_destina
12d0: 74 69 6f 6e 28 43 47 49 5f 48 45 41 44 45 52 29 tion(CGI_HEADER)
12e0: 3b 0a 20 20 63 67 69 43 6f 6e 74 65 6e 74 5b 30 ;. cgiContent[0
12f0: 5d 20 3d 20 2a 70 4e 65 77 43 6f 6e 74 65 6e 74 ] = *pNewContent
1300: 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 4e ;. blob_zero(pN
1310: 65 77 43 6f 6e 74 65 6e 74 29 3b 0a 7d 0a 0a 2f ewContent);.}../
1320: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 70 *.** Set the rep
1330: 6c 79 20 73 74 61 74 75 73 20 63 6f 64 65 0a 2a ly status code.*
1340: 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 74 5f 73 /.void cgi_set_s
1350: 74 61 74 75 73 28 69 6e 74 20 69 53 74 61 74 2c tatus(int iStat,
1360: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 const char *zSt
1370: 61 74 29 7b 0a 20 20 7a 52 65 70 6c 79 53 74 61 at){. zReplySta
1380: 74 75 73 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 tus = mprintf("%
1390: 73 22 2c 20 7a 53 74 61 74 29 3b 0a 20 20 69 52 s", zStat);. iR
13a0: 65 70 6c 79 53 74 61 74 75 73 20 3d 20 69 53 74 eplyStatus = iSt
13b0: 61 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 at;.}../*.** App
13c0: 65 6e 64 20 74 65 78 74 20 74 6f 20 74 68 65 20 end text to the
13d0: 68 65 61 64 65 72 20 6f 66 20 61 6e 20 48 54 54 header of an HTT
13e0: 50 20 72 65 70 6c 79 0a 2a 2f 0a 76 6f 69 64 20 P reply.*/.void
13f0: 63 67 69 5f 61 70 70 65 6e 64 5f 68 65 61 64 65 cgi_append_heade
1400: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c r(const char *zL
1410: 69 6e 65 29 7b 0a 20 20 62 6c 6f 62 5f 61 70 70 ine){. blob_app
1420: 65 6e 64 28 26 65 78 74 72 61 48 65 61 64 65 72 end(&extraHeader
1430: 2c 20 7a 4c 69 6e 65 2c 20 2d 31 29 3b 0a 7d 0a , zLine, -1);.}.
1440: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 63 6f 6f ./*.** Set a coo
1450: 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 kie..**.** Zero
1460: 6c 69 66 65 74 69 6d 65 20 69 6d 70 6c 69 65 73 lifetime implies
1470: 20 61 20 73 65 73 73 69 6f 6e 20 63 6f 6f 6b 69 a session cooki
1480: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 73 e..*/.void cgi_s
1490: 65 74 5f 63 6f 6f 6b 69 65 28 0a 20 20 63 6f 6e et_cookie(. con
14a0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 st char *zName,
14b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
14c0: 65 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 63 6f e cookie */. co
14d0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 nst char *zValue
14e0: 2c 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 , /* Value of
14f0: 74 68 65 20 63 6f 6f 6b 69 65 2e 20 20 41 75 74 the cookie. Aut
1500: 6f 6d 61 74 69 63 61 6c 6c 79 20 65 73 63 61 70 omatically escap
1510: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 ed */. const ch
1520: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 2f 2a ar *zPath, /*
1530: 20 50 61 74 68 20 63 6f 6f 6b 69 65 20 61 70 70 Path cookie app
1540: 6c 69 65 73 20 74 6f 2e 20 20 4e 55 4c 4c 20 6d lies to. NULL m
1550: 65 61 6e 73 20 22 2f 22 20 2a 2f 0a 20 20 69 6e eans "/" */. in
1560: 74 20 6c 69 66 65 74 69 6d 65 20 20 20 20 20 20 t lifetime
1570: 20 20 20 20 2f 2a 20 45 78 70 69 72 61 74 69 6f /* Expiratio
1580: 6e 20 6f 66 20 74 68 65 20 63 6f 6f 6b 69 65 20 n of the cookie
1590: 69 6e 20 73 65 63 6f 6e 64 73 20 66 72 6f 6d 20 in seconds from
15a0: 6e 6f 77 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 now */.){. if(
15b0: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 zPath==0 ) zPath
15c0: 20 3d 20 67 2e 7a 54 6f 70 3b 0a 20 20 69 66 28 = g.zTop;. if(
15d0: 20 6c 69 66 65 74 69 6d 65 3e 30 20 29 7b 0a 20 lifetime>0 ){.
15e0: 20 20 20 63 68 61 72 20 2a 7a 44 61 74 65 3b 0a char *zDate;.
15f0: 20 20 20 20 6c 69 66 65 74 69 6d 65 20 2b 3d 20 lifetime +=
1600: 28 69 6e 74 29 74 69 6d 65 28 30 29 3b 0a 20 20 (int)time(0);.
1610: 20 20 7a 44 61 74 65 20 3d 20 63 67 69 5f 72 66 zDate = cgi_rf
1620: 63 38 32 32 5f 64 61 74 65 73 74 61 6d 70 28 6c c822_datestamp(l
1630: 69 66 65 74 69 6d 65 29 3b 0a 20 20 20 20 62 6c ifetime);. bl
1640: 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 78 74 72 ob_appendf(&extr
1650: 61 48 65 61 64 65 72 2c 0a 20 20 20 20 20 20 20 aHeader,.
1660: 22 53 65 74 2d 43 6f 6f 6b 69 65 3a 20 25 73 3d "Set-Cookie: %s=
1670: 25 74 3b 20 50 61 74 68 3d 25 73 3b 20 65 78 70 %t; Path=%s; exp
1680: 69 72 65 73 3d 25 73 3b 20 56 65 72 73 69 6f 6e ires=%s; Version
1690: 3d 31 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 =1\r\n",.
16a0: 20 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 2c 20 zName, zValue,
16b0: 7a 50 61 74 68 2c 20 7a 44 61 74 65 29 3b 0a 20 zPath, zDate);.
16c0: 20 20 20 69 66 28 20 7a 44 61 74 65 5b 30 5d 20 if( zDate[0]
16d0: 29 20 66 72 65 65 28 20 7a 44 61 74 65 20 29 3b ) free( zDate );
16e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c . }else{. bl
16f0: 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 78 74 72 ob_appendf(&extr
1700: 61 48 65 61 64 65 72 2c 0a 20 20 20 20 20 20 20 aHeader,.
1710: 22 53 65 74 2d 43 6f 6f 6b 69 65 3a 20 25 73 3d "Set-Cookie: %s=
1720: 25 74 3b 20 50 61 74 68 3d 25 73 3b 20 56 65 72 %t; Path=%s; Ver
1730: 73 69 6f 6e 3d 31 5c 72 5c 6e 22 2c 0a 20 20 20 sion=1\r\n",.
1740: 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 zName, zValu
1750: 65 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 7d e, zPath);. }.}
1760: 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 64 ..#if 0./*.** Ad
1770: 64 20 61 6e 20 45 54 61 67 20 68 65 61 64 65 72 d an ETag header
1780: 20 6c 69 6e 65 0a 2a 2f 0a 73 74 61 74 69 63 20 line.*/.static
1790: 63 68 61 72 20 2a 63 67 69 5f 61 64 64 5f 65 74 char *cgi_add_et
17a0: 61 67 28 63 68 61 72 20 2a 7a 54 78 74 2c 20 69 ag(char *zTxt, i
17b0: 6e 74 20 6e 4c 65 6e 29 7b 0a 20 20 4d 44 35 43 nt nLen){. MD5C
17c0: 6f 6e 74 65 78 74 20 63 74 78 3b 0a 20 20 75 6e ontext ctx;. un
17d0: 73 69 67 6e 65 64 20 63 68 61 72 20 64 69 67 65 signed char dige
17e0: 73 74 5b 31 36 5d 3b 0a 20 20 69 6e 74 20 69 2c st[16];. int i,
17f0: 20 6a 3b 0a 20 20 63 68 61 72 20 7a 45 54 61 67 j;. char zETag
1800: 5b 36 34 5d 3b 0a 0a 20 20 4d 44 35 49 6e 69 74 [64];.. MD5Init
1810: 28 26 63 74 78 29 3b 0a 20 20 4d 44 35 55 70 64 (&ctx);. MD5Upd
1820: 61 74 65 28 26 63 74 78 2c 7a 54 78 74 2c 6e 4c ate(&ctx,zTxt,nL
1830: 65 6e 29 3b 0a 20 20 4d 44 35 46 69 6e 61 6c 28 en);. MD5Final(
1840: 64 69 67 65 73 74 2c 26 63 74 78 29 3b 0a 20 20 digest,&ctx);.
1850: 66 6f 72 28 6a 3d 69 3d 30 3b 20 69 3c 31 36 3b for(j=i=0; i<16;
1860: 20 69 2b 2b 2c 6a 2b 3d 32 29 7b 0a 20 20 20 20 i++,j+=2){.
1870: 62 70 72 69 6e 74 66 28 26 7a 45 54 61 67 5b 6a bprintf(&zETag[j
1880: 5d 2c 73 69 7a 65 6f 66 28 7a 45 54 61 67 29 2d ],sizeof(zETag)-
1890: 6a 2c 22 25 30 32 78 22 2c 28 69 6e 74 29 64 69 j,"%02x",(int)di
18a0: 67 65 73 74 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 gest[i]);. }.
18b0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 78 blob_appendf(&ex
18c0: 74 72 61 48 65 61 64 65 72 2c 20 22 45 54 61 67 traHeader, "ETag
18d0: 3a 20 25 73 5c 72 5c 6e 22 2c 20 7a 45 54 61 67 : %s\r\n", zETag
18e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 64 );. return strd
18f0: 75 70 28 7a 45 54 61 67 29 3b 0a 7d 0a 0a 2f 2a up(zETag);.}../*
1900: 0a 2a 2a 20 44 6f 20 73 6f 6d 65 20 63 61 63 68 .** Do some cach
1910: 65 20 63 6f 6e 74 72 6f 6c 20 73 74 75 66 66 2e e control stuff.
1920: 20 46 69 72 73 74 2c 20 77 65 20 67 65 6e 65 72 First, we gener
1930: 61 74 65 20 61 6e 20 45 54 61 67 20 61 6e 64 20 ate an ETag and
1940: 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 0a 2a 2a include it in.**
1950: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 68 65 the response he
1960: 61 64 65 72 73 2e 20 53 65 63 6f 6e 64 2c 20 77 aders. Second, w
1970: 65 20 64 6f 20 77 68 61 74 65 76 65 72 20 69 73 e do whatever is
1980: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 necessary to de
1990: 74 65 72 6d 69 6e 65 20 69 66 0a 2a 2a 20 74 68 termine if.** th
19a0: 65 20 72 65 71 75 65 73 74 20 77 61 73 20 61 73 e request was as
19b0: 6b 69 6e 67 20 61 62 6f 75 74 20 63 61 63 68 69 king about cachi
19c0: 6e 67 20 61 6e 64 20 77 68 65 74 68 65 72 20 77 ng and whether w
19d0: 65 20 6e 65 65 64 20 74 6f 20 73 65 6e 64 20 62 e need to send b
19e0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f ack the.** respo
19f0: 6e 73 65 20 62 6f 64 79 2e 20 49 66 20 77 65 20 nse body. If we
1a00: 73 68 6f 75 6c 64 6e 27 74 20 73 65 6e 64 20 61 shouldn't send a
1a10: 20 62 6f 64 79 2c 20 72 65 74 75 72 6e 20 6e 6f body, return no
1a20: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 43 75 n-zero..**.** Cu
1a30: 72 72 65 6e 74 6c 79 2c 20 77 65 20 6a 75 73 74 rrently, we just
1a40: 20 63 68 65 63 6b 20 74 68 65 20 45 54 61 67 20 check the ETag
1a50: 61 67 61 69 6e 73 74 20 61 6e 79 20 49 66 2d 4e against any If-N
1a60: 6f 6e 65 2d 4d 61 74 63 68 20 68 65 61 64 65 72 one-Match header
1a70: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 4d 45 3a 20 49 ..**.** FIXME: I
1a80: 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28 61 74 n some cases (at
1a90: 74 61 63 68 6d 65 6e 74 73 2c 20 66 69 6c 65 20 tachments, file
1aa0: 63 6f 6e 74 65 6e 74 73 29 20 77 65 20 63 6f 75 contents) we cou
1ab0: 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 49 66 2d 4d ld check.** If-M
1ac0: 6f 64 69 66 69 65 64 2d 53 69 6e 63 65 20 68 65 odified-Since he
1ad0: 61 64 65 72 73 20 61 6e 64 20 61 6c 77 61 79 73 aders and always
1ae0: 20 69 6e 63 6c 75 64 65 20 4c 61 73 74 2d 4d 6f include Last-Mo
1af0: 64 69 66 69 65 64 20 69 6e 20 72 65 73 70 6f 6e dified in respon
1b00: 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ses..*/.static i
1b10: 6e 74 20 63 68 65 63 6b 5f 63 61 63 68 65 5f 63 nt check_cache_c
1b20: 6f 6e 74 72 6f 6c 28 76 6f 69 64 29 7b 0a 20 20 ontrol(void){.
1b30: 2f 2a 20 46 49 58 4d 45 3a 20 74 68 65 72 65 27 /* FIXME: there'
1b40: 73 20 73 6f 6d 65 20 67 6f 74 63 68 61 73 20 77 s some gotchas w
1b50: 74 68 20 63 6f 6f 6b 69 65 73 20 61 6e 64 20 73 th cookies and s
1b60: 6f 6d 65 20 68 65 61 64 65 72 73 2e 20 2a 2f 0a ome headers. */.
1b70: 20 20 63 68 61 72 20 2a 7a 45 54 61 67 20 3d 20 char *zETag =
1b80: 63 67 69 5f 61 64 64 5f 65 74 61 67 28 62 6c 6f cgi_add_etag(blo
1b90: 62 5f 62 75 66 66 65 72 28 26 63 67 69 43 6f 6e b_buffer(&cgiCon
1ba0: 74 65 6e 74 29 2c 62 6c 6f 62 5f 73 69 7a 65 28 tent),blob_size(
1bb0: 26 63 67 69 43 6f 6e 74 65 6e 74 29 29 3b 0a 20 &cgiContent));.
1bc0: 20 63 68 61 72 20 2a 7a 4d 61 74 63 68 20 3d 20 char *zMatch =
1bd0: 50 28 22 48 54 54 50 5f 49 46 5f 4e 4f 4e 45 5f P("HTTP_IF_NONE_
1be0: 4d 41 54 43 48 22 29 3b 0a 0a 20 20 69 66 28 20 MATCH");.. if(
1bf0: 7a 45 54 61 67 21 3d 30 20 26 26 20 7a 4d 61 74 zETag!=0 && zMat
1c00: 63 68 21 3d 30 20 29 20 7b 0a 20 20 20 20 63 68 ch!=0 ) {. ch
1c10: 61 72 20 2a 7a 42 75 66 20 3d 20 73 74 72 64 75 ar *zBuf = strdu
1c20: 70 28 7a 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 p(zMatch);. i
1c30: 66 28 20 7a 42 75 66 21 3d 30 20 29 7b 0a 20 20 f( zBuf!=0 ){.
1c40: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 6b 20 3d char *zTok =
1c50: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 0;. char *
1c60: 7a 50 6f 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 zPos;. for(
1c70: 20 7a 54 6f 6b 20 3d 20 73 74 72 74 6f 6b 5f 72 zTok = strtok_r
1c80: 28 7a 42 75 66 2c 20 22 2c 5c 22 22 2c 26 7a 50 (zBuf, ",\"",&zP
1c90: 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 os);.
1ca0: 7a 54 6f 6b 20 26 26 20 73 74 72 63 61 73 65 63 zTok && strcasec
1cb0: 6d 70 28 7a 54 6f 6b 2c 7a 45 54 61 67 29 3b 0a mp(zTok,zETag);.
1cc0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 6b 20 zTok
1cd0: 3d 20 20 73 74 72 74 6f 6b 5f 72 28 30 2c 20 22 = strtok_r(0, "
1ce0: 2c 5c 22 22 2c 26 7a 50 6f 73 29 29 7b 7d 0a 20 ,\"",&zPos)){}.
1cf0: 20 20 20 20 20 66 72 65 65 28 7a 42 75 66 29 3b free(zBuf);
1d00: 0a 20 20 20 20 20 20 69 66 28 7a 54 6f 6b 29 20 . if(zTok)
1d10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a return 1;. }.
1d20: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 }. . return
1d30: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 0;.}.#endif../*.
1d40: 2a 2a 20 44 6f 20 61 20 6e 6f 72 6d 61 6c 20 48 ** Do a normal H
1d50: 54 54 50 20 72 65 70 6c 79 0a 2a 2f 0a 76 6f 69 TTP reply.*/.voi
1d60: 64 20 63 67 69 5f 72 65 70 6c 79 28 76 6f 69 64 d cgi_reply(void
1d70: 29 7b 0a 20 20 69 6e 74 20 74 6f 74 61 6c 5f 73 ){. int total_s
1d80: 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 ize = 0;. if( i
1d90: 52 65 70 6c 79 53 74 61 74 75 73 3c 3d 30 20 29 ReplyStatus<=0 )
1da0: 7b 0a 20 20 20 20 69 52 65 70 6c 79 53 74 61 74 {. iReplyStat
1db0: 75 73 20 3d 20 32 30 30 3b 0a 20 20 20 20 7a 52 us = 200;. zR
1dc0: 65 70 6c 79 53 74 61 74 75 73 20 3d 20 22 4f 4b eplyStatus = "OK
1dd0: 22 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 ";. }..#if 0.
1de0: 69 66 28 20 69 52 65 70 6c 79 53 74 61 74 75 73 if( iReplyStatus
1df0: 3d 3d 32 30 30 20 26 26 20 63 68 65 63 6b 5f 63 ==200 && check_c
1e00: 61 63 68 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 29 ache_control() )
1e10: 20 7b 0a 20 20 20 20 2f 2a 20 63 68 61 6e 67 65 {. /* change
1e20: 20 74 68 65 20 73 74 61 74 75 73 20 74 6f 20 22 the status to "
1e30: 75 6e 63 68 61 6e 67 65 64 22 20 61 6e 64 20 77 unchanged" and w
1e40: 65 20 63 61 6e 20 73 6b 69 70 20 73 65 6e 64 69 e can skip sendi
1e50: 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 61 63 ng the. ** ac
1e60: 74 75 61 6c 20 72 65 73 70 6f 6e 73 65 20 62 6f tual response bo
1e70: 64 79 2e 20 4f 62 76 69 6f 75 73 6c 79 20 77 65 dy. Obviously we
1e80: 20 6f 6e 6c 79 20 64 6f 20 74 68 69 73 20 77 68 only do this wh
1e90: 65 6e 20 77 65 20 5f 68 61 76 65 5f 20 61 0a 20 en we _have_ a.
1ea0: 20 20 20 2a 2a 20 62 6f 64 79 20 28 63 6f 64 65 ** body (code
1eb0: 20 32 30 30 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 200).. */.
1ec0: 20 20 69 52 65 70 6c 79 53 74 61 74 75 73 20 3d iReplyStatus =
1ed0: 20 33 30 34 3b 0a 20 20 20 20 7a 52 65 70 6c 79 304;. zReply
1ee0: 53 74 61 74 75 73 20 3d 20 22 4e 6f 74 20 4d 6f Status = "Not Mo
1ef0: 64 69 66 69 65 64 22 3b 0a 20 20 7d 0a 23 65 6e dified";. }.#en
1f00: 64 69 66 0a 0a 20 20 69 66 28 20 67 2e 66 75 6c dif.. if( g.ful
1f10: 6c 48 74 74 70 52 65 70 6c 79 20 29 7b 0a 20 20 lHttpReply ){.
1f20: 20 20 63 68 61 72 20 2a 7a 44 61 74 65 20 3d 20 char *zDate =
1f30: 63 67 69 5f 72 66 63 38 32 32 5f 64 61 74 65 73 cgi_rfc822_dates
1f40: 74 61 6d 70 28 74 69 6d 65 28 30 29 29 3b 0a 20 tamp(time(0));.
1f50: 20 20 20 66 70 72 69 6e 74 66 28 67 2e 68 74 74 fprintf(g.htt
1f60: 70 4f 75 74 2c 20 22 48 54 54 50 2f 31 2e 30 20 pOut, "HTTP/1.0
1f70: 25 64 20 25 73 5c 72 5c 6e 22 2c 20 69 52 65 70 %d %s\r\n", iRep
1f80: 6c 79 53 74 61 74 75 73 2c 20 7a 52 65 70 6c 79 lyStatus, zReply
1f90: 53 74 61 74 75 73 29 3b 0a 20 20 20 20 66 70 72 Status);. fpr
1fa0: 69 6e 74 66 28 67 2e 68 74 74 70 4f 75 74 2c 20 intf(g.httpOut,
1fb0: 22 44 61 74 65 3a 20 25 73 5c 72 5c 6e 22 2c 20 "Date: %s\r\n",
1fc0: 7a 44 61 74 65 20 29 3b 0a 20 20 20 20 69 66 28 zDate );. if(
1fd0: 20 7a 44 61 74 65 5b 30 5d 20 29 20 66 72 65 65 zDate[0] ) free
1fe0: 28 20 7a 44 61 74 65 20 29 3b 0a 20 20 20 20 66 ( zDate );. f
1ff0: 70 72 69 6e 74 66 28 67 2e 68 74 74 70 4f 75 74 printf(g.httpOut
2000: 2c 20 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 , "Connection: c
2010: 6c 6f 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 7d 65 lose\r\n");. }e
2020: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 lse{. fprintf
2030: 28 67 2e 68 74 74 70 4f 75 74 2c 20 22 53 74 61 (g.httpOut, "Sta
2040: 74 75 73 3a 20 25 64 20 25 73 5c 72 5c 6e 22 2c tus: %d %s\r\n",
2050: 20 69 52 65 70 6c 79 53 74 61 74 75 73 2c 20 7a iReplyStatus, z
2060: 52 65 70 6c 79 53 74 61 74 75 73 29 3b 0a 20 20 ReplyStatus);.
2070: 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 }.. if( blob_si
2080: 7a 65 28 26 65 78 74 72 61 48 65 61 64 65 72 29 ze(&extraHeader)
2090: 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 >0 ){. fprint
20a0: 66 28 67 2e 68 74 74 70 4f 75 74 2c 20 22 25 73 f(g.httpOut, "%s
20b0: 22 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 ", blob_buffer(&
20c0: 65 78 74 72 61 48 65 61 64 65 72 29 29 3b 0a 20 extraHeader));.
20d0: 20 7d 0a 0a 20 20 69 66 28 20 67 2e 69 73 43 6f }.. if( g.isCo
20e0: 6e 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 63 6f nst ){. /* co
20f0: 6e 73 74 61 6e 74 20 6d 65 61 6e 73 20 74 68 61 nstant means tha
2100: 74 20 74 68 65 20 69 6e 70 75 74 20 55 52 4c 20 t the input URL
2110: 77 69 6c 6c 20 5f 6e 65 76 65 72 5f 20 67 65 6e will _never_ gen
2120: 65 72 61 74 65 20 61 6e 79 74 68 69 6e 67 0a 20 erate anything.
2130: 20 20 20 2a 2a 20 65 6c 73 65 2e 20 49 6e 20 74 ** else. In t
2140: 68 65 20 63 61 73 65 20 6f 66 20 61 74 74 61 63 he case of attac
2150: 68 6d 65 6e 74 73 2c 20 74 68 65 20 63 6f 6e 74 hments, the cont
2160: 65 6e 74 73 20 77 6f 6e 27 74 20 63 68 61 6e 67 ents won't chang
2170: 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a e because. **
2180: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 an attempt to c
2190: 68 61 6e 67 65 20 74 68 65 6d 20 67 65 6e 65 72 hange them gener
21a0: 61 74 65 73 20 61 20 6e 65 77 20 61 74 74 61 63 ates a new attac
21b0: 68 6d 65 6e 74 20 6e 75 6d 62 65 72 2e 20 49 6e hment number. In
21c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 the. ** case
21d0: 20 6f 66 20 6d 6f 73 74 20 2f 67 65 74 66 69 6c of most /getfil
21e0: 65 20 63 61 6c 6c 73 20 66 6f 72 20 73 70 65 63 e calls for spec
21f0: 69 66 69 63 20 76 65 72 73 69 6f 6e 73 2c 20 74 ific versions, t
2200: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 65 0a he only way the.
2210: 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 63 ** content c
2220: 68 61 6e 67 65 73 20 69 73 20 69 66 20 73 6f 6d hanges is if som
2230: 65 6f 6e 65 20 62 72 65 61 6b 73 20 74 68 65 20 eone breaks the
2240: 53 43 4d 2e 20 41 6e 64 20 69 66 20 74 68 61 74 SCM. And if that
2250: 20 68 61 70 70 65 6e 73 2c 20 61 0a 20 20 20 20 happens, a.
2260: 2a 2a 20 73 74 61 6c 65 20 63 61 63 68 65 20 69 ** stale cache i
2270: 73 20 74 68 65 20 6c 65 61 73 74 20 6f 66 20 74 s the least of t
2280: 68 65 20 70 72 6f 62 6c 65 6d 2e 20 53 6f 20 77 he problem. So w
2290: 65 20 70 72 6f 76 69 64 65 20 61 6e 20 45 78 70 e provide an Exp
22a0: 69 72 65 73 0a 20 20 20 20 2a 2a 20 68 65 61 64 ires. ** head
22b0: 65 72 20 73 65 74 20 74 6f 20 61 20 72 65 61 73 er set to a reas
22c0: 6f 6e 61 62 6c 65 20 70 65 72 69 6f 64 20 28 64 onable period (d
22d0: 65 66 61 75 6c 74 3a 20 6f 6e 65 20 77 65 65 6b efault: one week
22e0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a ).. */. /*
22f0: 74 69 6d 65 5f 74 20 65 78 70 69 72 65 73 20 3d time_t expires =
2300: 20 74 69 6d 65 28 30 29 20 2b 20 61 74 6f 69 28 time(0) + atoi(
2310: 64 62 5f 63 6f 6e 66 69 67 28 22 63 6f 6e 73 74 db_config("const
2320: 61 6e 74 5f 65 78 70 69 72 65 73 22 2c 22 36 30 ant_expires","60
2330: 34 38 30 30 22 29 29 3b 2a 2f 0a 20 20 20 20 74 4800"));*/. t
2340: 69 6d 65 5f 74 20 65 78 70 69 72 65 73 20 3d 20 ime_t expires =
2350: 74 69 6d 65 28 30 29 20 2b 20 36 30 34 38 30 30 time(0) + 604800
2360: 3b 0a 20 20 20 20 63 68 61 72 20 2a 20 7a 44 61 ;. char * zDa
2370: 74 65 20 3d 20 63 67 69 5f 72 66 63 38 32 32 5f te = cgi_rfc822_
2380: 64 61 74 65 73 74 61 6d 70 28 65 78 70 69 72 65 datestamp(expire
2390: 73 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 s);. fprintf(
23a0: 67 2e 68 74 74 70 4f 75 74 2c 20 22 45 78 70 69 g.httpOut, "Expi
23b0: 72 65 73 3a 20 25 73 5c 72 5c 6e 22 2c 20 7a 44 res: %s\r\n", zD
23c0: 61 74 65 20 29 3b 0a 20 20 20 20 69 66 28 20 7a ate );. if( z
23d0: 44 61 74 65 5b 30 5d 20 29 20 66 72 65 65 28 20 Date[0] ) free(
23e0: 7a 44 61 74 65 20 29 3b 0a 20 20 7d 0a 0a 20 20 zDate );. }..
23f0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 6e 74 65 6e /* Content inten
2400: 64 65 64 20 66 6f 72 20 6c 6f 67 67 65 64 20 69 ded for logged i
2410: 6e 20 75 73 65 72 73 20 73 68 6f 75 6c 64 20 6f n users should o
2420: 6e 6c 79 20 62 65 20 63 61 63 68 65 64 20 69 6e nly be cached in
2430: 0a 20 20 2a 2a 20 74 68 65 20 62 72 6f 77 73 65 . ** the browse
2440: 72 2c 20 6e 6f 74 20 73 6f 6d 65 20 73 68 61 72 r, not some shar
2450: 65 64 20 6c 6f 63 61 74 69 6f 6e 2e 0a 20 20 2a ed location.. *
2460: 2f 0a 20 20 66 70 72 69 6e 74 66 28 67 2e 68 74 /. fprintf(g.ht
2470: 74 70 4f 75 74 2c 20 22 43 61 63 68 65 2d 63 6f tpOut, "Cache-co
2480: 6e 74 72 6f 6c 3a 20 70 72 69 76 61 74 65 5c 72 ntrol: private\r
2490: 5c 6e 22 29 3b 0a 0a 23 69 66 20 46 4f 53 53 49 \n");..#if FOSSI
24a0: 4c 5f 49 31 38 4e 0a 20 20 66 70 72 69 6e 74 66 L_I18N. fprintf
24b0: 28 67 2e 68 74 74 70 4f 75 74 2c 0a 20 20 20 20 (g.httpOut,.
24c0: 20 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 "Content-Type:
24d0: 25 73 3b 20 63 68 61 72 73 65 74 3d 25 73 5c 72 %s; charset=%s\r
24e0: 5c 6e 22 2c 20 7a 43 6f 6e 74 65 6e 74 54 79 70 \n", zContentTyp
24f0: 65 2c 20 6e 6c 5f 6c 61 6e 67 69 6e 66 6f 28 43 e, nl_langinfo(C
2500: 4f 44 45 53 45 54 29 29 3b 0a 23 65 6c 73 65 0a ODESET));.#else.
2510: 20 20 66 70 72 69 6e 74 66 28 67 2e 68 74 74 70 fprintf(g.http
2520: 4f 75 74 2c 0a 20 20 20 20 20 22 43 6f 6e 74 65 Out,. "Conte
2530: 6e 74 2d 54 79 70 65 3a 20 25 73 3b 20 63 68 61 nt-Type: %s; cha
2540: 72 73 65 74 3d 49 53 4f 2d 38 38 35 39 2d 31 5c rset=ISO-8859-1\
2550: 72 5c 6e 22 2c 20 7a 43 6f 6e 74 65 6e 74 54 79 r\n", zContentTy
2560: 70 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 pe);.#endif. if
2570: 28 20 73 74 72 63 6d 70 28 7a 43 6f 6e 74 65 6e ( strcmp(zConten
2580: 74 54 79 70 65 2c 22 61 70 70 6c 69 63 61 74 69 tType,"applicati
2590: 6f 6e 2f 78 2d 66 6f 73 73 69 6c 22 29 3d 3d 30 on/x-fossil")==0
25a0: 20 29 7b 0a 20 20 20 20 63 67 69 5f 63 6f 6d 62 ){. cgi_comb
25b0: 69 6e 65 5f 68 65 61 64 65 72 5f 61 6e 64 5f 62 ine_header_and_b
25c0: 6f 64 79 28 29 3b 0a 20 20 20 20 62 6c 6f 62 5f ody();. blob_
25d0: 63 6f 6d 70 72 65 73 73 28 26 63 67 69 43 6f 6e compress(&cgiCon
25e0: 74 65 6e 74 5b 30 5d 2c 20 26 63 67 69 43 6f 6e tent[0], &cgiCon
25f0: 74 65 6e 74 5b 30 5d 29 3b 0a 20 20 7d 0a 0a 20 tent[0]);. }..
2600: 20 69 66 28 20 69 52 65 70 6c 79 53 74 61 74 75 if( iReplyStatu
2610: 73 20 21 3d 20 33 30 34 20 29 20 7b 0a 20 20 20 s != 304 ) {.
2620: 20 74 6f 74 61 6c 5f 73 69 7a 65 20 3d 20 62 6c total_size = bl
2630: 6f 62 5f 73 69 7a 65 28 26 63 67 69 43 6f 6e 74 ob_size(&cgiCont
2640: 65 6e 74 5b 30 5d 29 20 2b 20 62 6c 6f 62 5f 73 ent[0]) + blob_s
2650: 69 7a 65 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b ize(&cgiContent[
2660: 31 5d 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 1]);. fprintf
2670: 28 67 2e 68 74 74 70 4f 75 74 2c 20 22 43 6f 6e (g.httpOut, "Con
2680: 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 25 64 5c tent-Length: %d\
2690: 72 5c 6e 22 2c 20 74 6f 74 61 6c 5f 73 69 7a 65 r\n", total_size
26a0: 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 );. }. fprintf
26b0: 28 67 2e 68 74 74 70 4f 75 74 2c 20 22 5c 72 5c (g.httpOut, "\r\
26c0: 6e 22 29 3b 0a 20 20 69 66 28 20 74 6f 74 61 6c n");. if( total
26d0: 5f 73 69 7a 65 3e 30 20 26 26 20 69 52 65 70 6c _size>0 && iRepl
26e0: 79 53 74 61 74 75 73 20 21 3d 20 33 30 34 20 29 yStatus != 304 )
26f0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 73 69 7a {. int i, siz
2700: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 e;. for(i=0;
2710: 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 i<2; i++){.
2720: 20 73 69 7a 65 20 3d 20 62 6c 6f 62 5f 73 69 7a size = blob_siz
2730: 65 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 69 5d e(&cgiContent[i]
2740: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a );. if( siz
2750: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 e>0 ){. f
2760: 77 72 69 74 65 28 62 6c 6f 62 5f 62 75 66 66 65 write(blob_buffe
2770: 72 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 69 5d r(&cgiContent[i]
2780: 29 2c 20 31 2c 20 73 69 7a 65 2c 20 67 2e 68 74 ), 1, size, g.ht
2790: 74 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a tpOut);. }.
27a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 47 49 44 }. }. CGID
27b0: 45 42 55 47 28 28 22 44 4f 4e 45 5c 6e 22 29 29 EBUG(("DONE\n"))
27c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 ;.}../*.** Do a
27d0: 72 65 64 69 72 65 63 74 20 72 65 71 75 65 73 74 redirect request
27e0: 20 74 6f 20 74 68 65 20 55 52 4c 20 67 69 76 65 to the URL give
27f0: 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e n in the argumen
2800: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 55 52 4c t..**.** The URL
2810: 20 6d 75 73 74 20 62 65 20 72 65 6c 61 74 69 76 must be relativ
2820: 65 20 74 6f 20 74 68 65 20 62 61 73 65 20 6f 66 e to the base of
2830: 20 74 68 65 20 66 6f 73 73 69 6c 20 73 65 72 76 the fossil serv
2840: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f er..*/.void cgi_
2850: 72 65 64 69 72 65 63 74 28 63 6f 6e 73 74 20 63 redirect(const c
2860: 68 61 72 20 2a 7a 55 52 4c 29 7b 0a 20 20 63 68 har *zURL){. ch
2870: 61 72 20 2a 7a 4c 6f 63 61 74 69 6f 6e 3b 0a 20 ar *zLocation;.
2880: 20 43 47 49 44 45 42 55 47 28 28 22 72 65 64 69 CGIDEBUG(("redi
2890: 72 65 63 74 20 74 6f 20 25 73 5c 6e 22 2c 20 7a rect to %s\n", z
28a0: 55 52 4c 29 29 3b 0a 20 20 69 66 28 20 73 74 72 URL));. if( str
28b0: 6e 63 6d 70 28 7a 55 52 4c 2c 22 68 74 74 70 3a ncmp(zURL,"http:
28c0: 22 2c 35 29 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 ",5)==0 || strnc
28d0: 6d 70 28 7a 55 52 4c 2c 22 68 74 74 70 73 3a 22 mp(zURL,"https:"
28e0: 2c 36 29 3d 3d 30 20 7c 7c 20 2a 7a 55 52 4c 3d ,6)==0 || *zURL=
28f0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 7a 4c 6f 63 ='/' ){. zLoc
2900: 61 74 69 6f 6e 20 3d 20 6d 70 72 69 6e 74 66 28 ation = mprintf(
2910: 22 4c 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72 5c "Location: %s\r\
2920: 6e 22 2c 20 7a 55 52 4c 29 3b 0a 20 20 7d 65 6c n", zURL);. }el
2930: 73 65 7b 0a 20 20 20 20 7a 4c 6f 63 61 74 69 6f se{. zLocatio
2940: 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 4c 6f 63 n = mprintf("Loc
2950: 61 74 69 6f 6e 3a 20 25 73 2f 25 73 5c 72 5c 6e ation: %s/%s\r\n
2960: 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c 20 7a ", g.zBaseURL, z
2970: 55 52 4c 29 3b 0a 20 20 7d 0a 20 20 63 67 69 5f URL);. }. cgi_
2980: 61 70 70 65 6e 64 5f 68 65 61 64 65 72 28 7a 4c append_header(zL
2990: 6f 63 61 74 69 6f 6e 29 3b 0a 20 20 63 67 69 5f ocation);. cgi_
29a0: 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b reset_content();
29b0: 0a 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c . cgi_printf("<
29c0: 68 74 6d 6c 3e 5c 6e 3c 70 3e 52 65 64 69 72 65 html>\n<p>Redire
29d0: 63 74 20 74 6f 20 25 68 3c 2f 70 3e 5c 6e 3c 2f ct to %h</p>\n</
29e0: 68 74 6d 6c 3e 5c 6e 22 2c 20 7a 55 52 4c 29 3b html>\n", zURL);
29f0: 0a 20 20 63 67 69 5f 73 65 74 5f 73 74 61 74 75 . cgi_set_statu
2a00: 73 28 33 30 32 2c 20 22 4d 6f 76 65 64 20 54 65 s(302, "Moved Te
2a10: 6d 70 6f 72 61 72 69 6c 79 22 29 3b 0a 20 20 66 mporarily");. f
2a20: 72 65 65 28 7a 4c 6f 63 61 74 69 6f 6e 29 3b 0a ree(zLocation);.
2a30: 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20 cgi_reply();.
2a40: 20 65 78 69 74 28 30 29 3b 0a 7d 0a 76 6f 69 64 exit(0);.}.void
2a50: 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 63 cgi_redirectf(c
2a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
2a70: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c at, ...){. va_l
2a80: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 ist ap;. va_sta
2a90: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b rt(ap, zFormat);
2aa0: 0a 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 . cgi_redirect(
2ab0: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 vmprintf(zFormat
2ac0: 2c 20 61 70 29 29 3b 0a 20 20 76 61 5f 65 6e 64 , ap));. va_end
2ad0: 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 (ap);.}../*.** I
2ae0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 nformation about
2af0: 20 61 6c 6c 20 71 75 65 72 79 20 70 61 72 61 6d all query param
2b00: 65 74 65 72 73 20 61 6e 64 20 63 6f 6f 6b 69 65 eters and cookie
2b10: 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 s are stored.**
2b20: 69 6e 20 74 68 65 73 65 20 76 61 72 69 61 62 6c in these variabl
2b30: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e es..*/.static in
2b40: 74 20 6e 41 6c 6c 6f 63 51 50 20 3d 20 30 3b 20 t nAllocQP = 0;
2b50: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 /* Space allocat
2b60: 65 64 20 66 6f 72 20 61 50 61 72 61 6d 51 50 5b ed for aParamQP[
2b70: 5d 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ] */.static int
2b80: 6e 55 73 65 64 51 50 20 3d 20 30 3b 20 20 2f 2a nUsedQP = 0; /*
2b90: 20 53 70 61 63 65 20 61 63 74 75 61 6c 6c 79 20 Space actually
2ba0: 75 73 65 64 20 69 6e 20 61 50 61 72 61 6d 51 50 used in aParamQP
2bb0: 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 [] */.static int
2bc0: 20 73 6f 72 74 51 50 20 3d 20 30 3b 20 20 20 2f sortQP = 0; /
2bd0: 2a 20 54 72 75 65 20 69 66 20 61 50 61 72 61 6d * True if aParam
2be0: 51 50 5b 5d 20 6e 65 65 64 73 20 73 6f 72 74 69 QP[] needs sorti
2bf0: 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 ng */.static int
2c00: 20 73 65 71 51 50 20 3d 20 30 3b 20 20 20 20 2f seqQP = 0; /
2c10: 2a 20 53 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 * Sequence numbe
2c20: 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 rs */.static str
2c30: 75 63 74 20 51 50 61 72 61 6d 20 7b 20 20 20 2f uct QParam { /
2c40: 2a 20 4f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 * One entry for
2c50: 65 61 63 68 20 71 75 65 72 79 20 70 61 72 61 6d each query param
2c60: 65 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 20 2a eter or cookie *
2c70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
2c80: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a zName; /*
2c90: 20 50 61 72 61 6d 65 74 65 72 20 6f 72 20 63 6f Parameter or co
2ca0: 6f 6b 69 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 okie name */. c
2cb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 onst char *zValu
2cc0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 e; /* Valu
2cd0: 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 e of the query p
2ce0: 61 72 61 6d 65 74 65 72 20 6f 72 20 63 6f 6f 6b arameter or cook
2cf0: 69 65 20 2a 2f 0a 20 20 69 6e 74 20 73 65 71 3b ie */. int seq;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2d10: 20 20 2f 2a 20 4f 72 64 65 72 20 6f 66 20 69 6e /* Order of in
2d20: 73 65 72 74 69 6f 6e 20 2a 2f 0a 7d 20 2a 61 50 sertion */.} *aP
2d30: 61 72 61 6d 51 50 3b 20 20 20 20 20 20 20 20 20 aramQP;
2d40: 20 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 /* An array
2d50: 6f 66 20 61 6c 6c 20 70 61 72 61 6d 65 74 65 72 of all parameter
2d60: 73 20 61 6e 64 20 63 6f 6f 6b 69 65 73 20 2a 2f s and cookies */
2d70: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 6f 74 ../*.** Add anot
2d80: 68 65 72 20 71 75 65 72 79 20 70 61 72 61 6d 65 her query parame
2d90: 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 20 74 6f ter or cookie to
2da0: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 73 the parameter s
2db0: 65 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 et..** zName is
2dc0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 the name of the
2dd0: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 query parameter
2de0: 6f 72 20 63 6f 6f 6b 69 65 20 61 6e 64 20 7a 56 or cookie and zV
2df0: 61 6c 75 65 0a 2a 2a 20 69 73 20 69 74 73 20 66 alue.** is its f
2e00: 75 6c 6c 79 20 64 65 63 6f 64 65 64 20 76 61 6c ully decoded val
2e10: 75 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 ue..**.** zName
2e20: 61 6e 64 20 7a 56 61 6c 75 65 20 61 72 65 20 6e and zValue are n
2e30: 6f 74 20 63 6f 70 69 65 64 20 61 6e 64 20 6d 75 ot copied and mu
2e40: 73 74 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f 72 st not change or
2e50: 20 62 65 0a 2a 2a 20 64 65 61 6c 6c 6f 63 61 74 be.** deallocat
2e60: 65 64 20 61 66 74 65 72 20 74 68 69 73 20 72 6f ed after this ro
2e70: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a utine returns..*
2e80: 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 74 5f 70 /.void cgi_set_p
2e90: 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 arameter_nocopy(
2ea0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
2eb0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a e, const char *z
2ec0: 56 61 6c 75 65 29 7b 0a 20 20 69 66 28 20 6e 41 Value){. if( nA
2ed0: 6c 6c 6f 63 51 50 3c 3d 6e 55 73 65 64 51 50 20 llocQP<=nUsedQP
2ee0: 29 7b 0a 20 20 20 20 6e 41 6c 6c 6f 63 51 50 20 ){. nAllocQP
2ef0: 3d 20 6e 41 6c 6c 6f 63 51 50 2a 32 20 2b 20 31 = nAllocQP*2 + 1
2f00: 30 3b 0a 20 20 20 20 61 50 61 72 61 6d 51 50 20 0;. aParamQP
2f10: 3d 20 72 65 61 6c 6c 6f 63 28 20 61 50 61 72 61 = realloc( aPara
2f20: 6d 51 50 2c 20 6e 41 6c 6c 6f 63 51 50 2a 73 69 mQP, nAllocQP*si
2f30: 7a 65 6f 66 28 61 50 61 72 61 6d 51 50 5b 30 5d zeof(aParamQP[0]
2f40: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 61 50 61 ) );. if( aPa
2f50: 72 61 6d 51 50 3d 3d 30 20 29 20 65 78 69 74 28 ramQP==0 ) exit(
2f60: 31 29 3b 0a 20 20 7d 0a 20 20 61 50 61 72 61 6d 1);. }. aParam
2f70: 51 50 5b 6e 55 73 65 64 51 50 5d 2e 7a 4e 61 6d QP[nUsedQP].zNam
2f80: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 61 50 61 e = zName;. aPa
2f90: 72 61 6d 51 50 5b 6e 55 73 65 64 51 50 5d 2e 7a ramQP[nUsedQP].z
2fa0: 56 61 6c 75 65 20 3d 20 7a 56 61 6c 75 65 3b 0a Value = zValue;.
2fb0: 20 20 61 50 61 72 61 6d 51 50 5b 6e 55 73 65 64 aParamQP[nUsed
2fc0: 51 50 5d 2e 73 65 71 20 3d 20 73 65 71 51 50 2b QP].seq = seqQP+
2fd0: 2b 3b 0a 20 20 6e 55 73 65 64 51 50 2b 2b 3b 0a +;. nUsedQP++;.
2fe0: 20 20 73 6f 72 74 51 50 20 3d 20 31 3b 0a 7d 0a sortQP = 1;.}.
2ff0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 6f 74 68 ./*.** Add anoth
3000: 65 72 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 er query paramet
3010: 65 72 20 6f 72 20 63 6f 6f 6b 69 65 20 74 6f 20 er or cookie to
3020: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 73 65 the parameter se
3030: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 69 73 20 74 t..** zName is t
3040: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 71 he name of the q
3050: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 6f uery parameter o
3060: 72 20 63 6f 6f 6b 69 65 20 61 6e 64 20 7a 56 61 r cookie and zVa
3070: 6c 75 65 0a 2a 2a 20 69 73 20 69 74 73 20 66 75 lue.** is its fu
3080: 6c 6c 79 20 64 65 63 6f 64 65 64 20 76 61 6c 75 lly decoded valu
3090: 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 70 69 65 73 20 e..**.** Copies
30a0: 61 72 65 20 6d 61 64 65 20 6f 66 20 62 6f 74 68 are made of both
30b0: 20 74 68 65 20 7a 4e 61 6d 65 20 61 6e 64 20 7a the zName and z
30c0: 56 61 6c 75 65 20 70 61 72 61 6d 65 74 65 72 73 Value parameters
30d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 ..*/.void cgi_se
30e0: 74 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 t_parameter(cons
30f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 t char *zName, c
3100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 onst char *zValu
3110: 65 29 7b 0a 20 20 63 67 69 5f 73 65 74 5f 70 61 e){. cgi_set_pa
3120: 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 6d rameter_nocopy(m
3130: 70 72 69 6e 74 66 28 22 25 73 22 2c 7a 4e 61 6d printf("%s",zNam
3140: 65 29 2c 20 6d 70 72 69 6e 74 66 28 22 25 73 22 e), mprintf("%s"
3150: 2c 7a 56 61 6c 75 65 29 29 3b 0a 7d 0a 0a 2f 2a ,zValue));.}../*
3160: 0a 2a 2a 20 52 65 70 6c 61 63 65 20 61 20 70 61 .** Replace a pa
3170: 72 61 6d 65 74 65 72 20 77 69 74 68 20 61 20 6e rameter with a n
3180: 65 77 20 76 61 6c 75 65 2e 0a 2a 2f 0a 76 6f 69 ew value..*/.voi
3190: 64 20 63 67 69 5f 72 65 70 6c 61 63 65 5f 70 61 d cgi_replace_pa
31a0: 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 rameter(const ch
31b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 ar *zName, const
31c0: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a char *zValue){.
31d0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 int i;. for(i
31e0: 3d 30 3b 20 69 3c 6e 55 73 65 64 51 50 3b 20 69 =0; i<nUsedQP; i
31f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 ++){. if( str
3200: 63 6d 70 28 61 50 61 72 61 6d 51 50 5b 69 5d 2e cmp(aParamQP[i].
3210: 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 zName,zName)==0
3220: 29 7b 0a 20 20 20 20 20 20 61 50 61 72 61 6d 51 ){. aParamQ
3230: 50 5b 69 5d 2e 7a 56 61 6c 75 65 20 3d 20 7a 56 P[i].zValue = zV
3240: 61 6c 75 65 3b 0a 20 20 20 20 20 20 72 65 74 75 alue;. retu
3250: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 rn;. }. }.
3260: 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 cgi_set_paramete
3270: 72 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d 65 2c 20 r_nocopy(zName,
3280: 7a 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a zValue);.}../*.*
3290: 2a 20 41 64 64 20 61 20 71 75 65 72 79 20 70 61 * Add a query pa
32a0: 72 61 6d 65 74 65 72 2e 20 20 54 68 65 20 7a 4e rameter. The zN
32b0: 61 6d 65 20 70 6f 72 74 69 6f 6e 20 69 73 20 66 ame portion is f
32c0: 69 78 65 64 20 62 75 74 20 61 20 63 6f 70 79 0a ixed but a copy.
32d0: 2a 2a 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 ** must be made
32e0: 6f 66 20 7a 56 61 6c 75 65 2e 0a 2a 2f 0a 76 6f of zValue..*/.vo
32f0: 69 64 20 63 67 69 5f 73 65 74 65 6e 76 28 63 6f id cgi_setenv(co
3300: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c nst char *zName,
3310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 const char *zVa
3320: 6c 75 65 29 7b 0a 20 20 63 67 69 5f 73 65 74 5f lue){. cgi_set_
3330: 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 parameter_nocopy
3340: 28 7a 4e 61 6d 65 2c 20 6d 70 72 69 6e 74 66 28 (zName, mprintf(
3350: 22 25 73 22 2c 7a 56 61 6c 75 65 29 29 3b 0a 7d "%s",zValue));.}
3360: 0a 20 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 . ../*.** Add a
3370: 6c 69 73 74 20 6f 66 20 71 75 65 72 79 20 70 61 list of query pa
3380: 72 61 6d 65 74 65 72 73 20 6f 72 20 63 6f 6f 6b rameters or cook
3390: 69 65 73 20 74 6f 20 74 68 65 20 70 61 72 61 6d ies to the param
33a0: 65 74 65 72 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 eter set..**.**
33b0: 45 61 63 68 20 70 61 72 61 6d 65 74 65 72 20 69 Each parameter i
33c0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 4e 41 s of the form NA
33d0: 4d 45 3d 56 41 4c 55 45 2e 20 20 42 6f 74 68 20 ME=VALUE. Both
33e0: 74 68 65 20 4e 41 4d 45 20 61 6e 64 20 74 68 65 the NAME and the
33f0: 0a 2a 2a 20 56 41 4c 55 45 20 6d 61 79 20 62 65 .** VALUE may be
3400: 20 75 72 6c 2d 65 6e 63 6f 64 65 64 20 28 22 2b url-encoded ("+
3410: 22 20 66 6f 72 20 73 70 61 63 65 2c 20 22 25 48 " for space, "%H
3420: 48 22 20 66 6f 72 20 6f 74 68 65 72 20 73 70 65 H" for other spe
3430: 63 69 61 6c 0a 2a 2a 20 63 68 61 72 61 63 74 65 cial.** characte
3440: 72 73 29 2e 20 20 42 75 74 20 74 68 69 73 20 72 rs). But this r
3450: 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 74 outine assumes t
3460: 68 61 74 20 4e 41 4d 45 20 63 6f 6e 74 61 69 6e hat NAME contain
3470: 73 20 6e 6f 0a 2a 2a 20 73 70 65 63 69 61 6c 20 s no.** special
3480: 63 68 61 72 61 63 74 65 72 20 61 6e 64 20 74 68 character and th
3490: 65 72 65 66 6f 72 65 20 64 6f 65 73 20 6e 6f 74 erefore does not
34a0: 20 64 65 63 6f 64 65 20 69 74 2e 0a 2a 2a 0a 2a decode it..**.*
34b0: 2a 20 49 66 20 4e 41 4d 45 20 62 65 67 69 6e 73 * If NAME begins
34c0: 20 77 69 74 68 20 61 6e 6f 74 68 65 72 20 6f 74 with another ot
34d0: 68 65 72 20 74 68 61 6e 20 61 20 6c 6f 77 65 72 her than a lower
34e0: 2d 63 61 73 65 20 6c 65 74 74 65 72 20 74 68 65 -case letter the
34f0: 6e 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 n.** the entire
3500: 4e 41 4d 45 3d 56 41 4c 55 45 20 74 65 72 6d 20 NAME=VALUE term
3510: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 48 65 6e is ignored. Hen
3520: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a ce:.**.** *
3530: 20 20 63 6f 6f 6b 69 65 73 20 61 6e 64 20 71 75 cookies and qu
3540: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 74 ery parameters t
3550: 68 61 74 20 68 61 76 65 20 75 70 70 65 72 63 61 hat have upperca
3560: 73 65 20 6e 61 6d 65 73 0a 2a 2a 20 20 20 20 20 se names.**
3570: 20 20 20 20 61 72 65 20 69 67 6e 6f 72 65 64 2e are ignored.
3580: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 2a 20 20 69 .**.** * i
3590: 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 t is impossible
35a0: 66 6f 72 20 61 20 63 6f 6f 6b 69 65 20 6f 72 20 for a cookie or
35b0: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 query parameter
35c0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 76 to.** ov
35d0: 65 72 72 69 64 65 20 74 68 65 20 76 61 6c 75 65 erride the value
35e0: 20 6f 66 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 of an environme
35f0: 6e 74 20 76 61 72 69 61 62 6c 65 20 73 69 6e 63 nt variable sinc
3600: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6e 76 e.** env
3610: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c ironment variabl
3620: 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 75 es always have u
3630: 70 70 65 72 63 61 73 65 20 6e 61 6d 65 73 2e 0a ppercase names..
3640: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 **.** Parameters
3650: 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 are separated b
3660: 79 20 74 68 65 20 22 74 65 72 6d 69 6e 61 74 6f y the "terminato
3670: 72 22 20 63 68 61 72 61 63 74 65 72 2e 20 20 57 r" character. W
3680: 68 69 74 65 73 70 61 63 65 0a 2a 2a 20 62 65 66 hitespace.** bef
3690: 6f 72 65 20 74 68 65 20 4e 41 4d 45 20 69 73 20 ore the NAME is
36a0: 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 ignored..**.** T
36b0: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 he input string
36c0: 22 7a 22 20 69 73 20 6d 6f 64 69 66 69 65 64 20 "z" is modified
36d0: 62 75 74 20 6e 6f 20 63 6f 70 69 65 73 20 69 73 but no copies is
36e0: 20 6d 61 64 65 2e 20 20 22 7a 22 0a 2a 2a 20 73 made. "z".** s
36f0: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 64 65 61 hould not be dea
3700: 6c 6c 6f 63 61 74 65 64 20 6f 72 20 63 68 61 6e llocated or chan
3710: 67 65 64 20 61 67 61 69 6e 20 61 66 74 65 72 20 ged again after
3720: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 this routine.**
3730: 72 65 74 75 72 6e 73 20 6f 72 20 69 74 20 77 69 returns or it wi
3740: 6c 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20 70 ll corrupt the p
3750: 61 72 61 6d 65 74 65 72 20 74 61 62 6c 65 2e 0a arameter table..
3760: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 */.static void a
3770: 64 64 5f 70 61 72 61 6d 5f 6c 69 73 74 28 63 68 dd_param_list(ch
3780: 61 72 20 2a 7a 2c 20 69 6e 74 20 74 65 72 6d 69 ar *z, int termi
3790: 6e 61 74 6f 72 29 7b 0a 20 20 77 68 69 6c 65 28 nator){. while(
37a0: 20 2a 7a 20 29 7b 0a 20 20 20 20 63 68 61 72 20 *z ){. char
37b0: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61 72 *zName;. char
37c0: 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 20 20 77 68 *zValue;. wh
37d0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29 ile( isspace(*z)
37e0: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7a ){ z++; }. z
37f0: 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 20 20 77 68 Name = z;. wh
3800: 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 ile( *z && *z!='
3810: 3d 27 20 26 26 20 2a 7a 21 3d 74 65 72 6d 69 6e =' && *z!=termin
3820: 61 74 6f 72 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 ator ){ z++; }.
3830: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 3d 27 20 29 if( *z=='=' )
3840: 7b 0a 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a {. *z = 0;.
3850: 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 z++;.
3860: 20 7a 56 61 6c 75 65 20 3d 20 7a 3b 0a 20 20 20 zValue = z;.
3870: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 while( *z &&
3880: 2a 7a 21 3d 74 65 72 6d 69 6e 61 74 6f 72 20 29 *z!=terminator )
3890: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 { z++; }. i
38a0: 66 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 20 f( *z ){.
38b0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 *z = 0;.
38c0: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 z++;. }.
38d0: 20 20 20 20 64 65 68 74 74 70 69 7a 65 28 7a 56 dehttpize(zV
38e0: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 alue);. }else
38f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 20 29 {. if( *z )
3900: 7b 20 2a 7a 2b 2b 20 3d 20 30 3b 20 7d 0a 20 20 { *z++ = 0; }.
3910: 20 20 20 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b zValue = "";
3920: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 . }. if( i
3930: 73 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 30 5d 29 slower(zName[0])
3940: 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 ){. cgi_se
3950: 74 5f 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f t_parameter_noco
3960: 70 79 28 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 py(zName, zValue
3970: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a );. }. }.}..
3980: 2f 2a 0a 2a 2a 20 2a 70 7a 20 69 73 20 61 20 73 /*.** *pz is a s
3990: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 tring that consi
39a0: 73 74 73 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 sts of multiple
39b0: 6c 69 6e 65 73 20 6f 66 20 74 65 78 74 2e 20 20 lines of text.
39c0: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 This.** routine
39d0: 66 69 6e 64 73 20 74 68 65 20 65 6e 64 20 6f 66 finds the end of
39e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69 6e the current lin
39f0: 65 20 6f 66 20 74 65 78 74 20 61 6e 64 20 63 6f e of text and co
3a00: 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 22 5c nverts.** the "\
3a10: 6e 22 20 6f 72 20 22 5c 72 5c 6e 22 20 74 68 61 n" or "\r\n" tha
3a20: 74 20 65 6e 64 73 20 74 68 61 74 20 6c 69 6e 65 t ends that line
3a30: 20 69 6e 74 6f 20 61 20 22 5c 30 30 30 22 2e 20 into a "\000".
3a40: 20 49 74 20 74 68 65 6e 0a 2a 2a 20 61 64 76 61 It then.** adva
3a50: 6e 63 65 73 20 2a 70 7a 20 74 6f 20 74 68 65 20 nces *pz to the
3a60: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 beginning of the
3a70: 20 6e 65 78 74 20 6c 69 6e 65 20 61 6e 64 20 72 next line and r
3a80: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 70 72 eturns the.** pr
3a90: 65 76 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 evious value of
3aa0: 2a 70 7a 20 28 77 68 69 63 68 20 69 73 20 74 68 *pz (which is th
3ab0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 e start of the c
3ac0: 75 72 72 65 6e 74 20 6c 69 6e 65 2e 29 0a 2a 2f urrent line.).*/
3ad0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 67 65 .static char *ge
3ae0: 74 5f 6c 69 6e 65 5f 66 72 6f 6d 5f 73 74 72 69 t_line_from_stri
3af0: 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 69 6e ng(char **pz, in
3b00: 74 20 2a 70 4c 65 6e 29 7b 0a 20 20 63 68 61 72 t *pLen){. char
3b10: 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74 *z = *pz;. int
3b20: 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d i;. if( z[0]==
3b30: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 0 ) return 0;.
3b40: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 for(i=0; z[i]; i
3b50: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 ++){. if( z[i
3b60: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 ]=='\n' ){.
3b70: 20 69 66 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d if( i>0 && z[i-
3b80: 31 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 1]=='\r' ){.
3b90: 20 20 20 20 7a 5b 69 2d 31 5d 20 3d 20 30 3b 0a z[i-1] = 0;.
3ba0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
3bb0: 20 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 z[i] = 0;.
3bc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 2b 2b }. i++
3bd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
3be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 20 3d }. }. *pz =
3bf0: 20 26 7a 5b 69 5d 3b 0a 20 20 2a 70 4c 65 6e 20 &z[i];. *pLen
3c00: 2d 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 7a -= i;. return z
3c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 ;.}../*.** The i
3c20: 6e 70 75 74 20 2a 70 7a 20 70 6f 69 6e 74 73 20 nput *pz points
3c30: 74 6f 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 to content that
3c40: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 is terminated by
3c50: 20 61 20 22 5c 72 5c 6e 22 0a 2a 2a 20 66 6f 6c a "\r\n".** fol
3c60: 6c 6f 77 65 64 20 62 79 20 74 68 65 20 62 6f 75 lowed by the bou
3c70: 6e 64 72 79 20 6d 61 72 6b 65 72 20 7a 42 6f 75 ndry marker zBou
3c80: 6e 64 72 79 2e 20 20 41 6e 20 65 78 74 72 61 20 ndry. An extra
3c90: 22 2d 2d 22 20 6d 61 79 20 6f 72 0a 2a 2a 20 6d "--" may or.** m
3ca0: 61 79 20 6e 6f 74 20 62 65 20 61 70 70 65 6e 64 ay not be append
3cb0: 65 64 20 74 6f 20 74 68 65 20 62 6f 75 6e 64 72 ed to the boundr
3cc0: 79 20 6d 61 72 6b 65 72 2e 20 20 54 68 65 72 65 y marker. There
3cd0: 20 61 72 65 20 2a 70 4c 65 6e 20 63 68 61 72 61 are *pLen chara
3ce0: 63 74 65 72 73 0a 2a 2a 20 69 6e 20 2a 70 7a 2e cters.** in *pz.
3cf0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 .**.** This rout
3d00: 69 6e 65 20 61 64 64 73 20 61 20 22 5c 30 30 30 ine adds a "\000
3d10: 22 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 " to the end of
3d20: 74 68 65 20 63 6f 6e 74 65 6e 74 20 28 6f 76 65 the content (ove
3d30: 72 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 rwriting.** the
3d40: 22 5c 72 5c 6e 22 29 20 61 6e 64 20 72 65 74 75 "\r\n") and retu
3d50: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f rns a pointer to
3d60: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 54 the content. T
3d70: 68 65 20 2a 70 7a 20 69 6e 70 75 74 0a 2a 2a 20 he *pz input.**
3d80: 69 73 20 61 64 6a 75 73 74 65 64 20 74 6f 20 70 is adjusted to p
3d90: 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 oint to the firs
3da0: 74 20 6c 69 6e 65 20 66 6f 6c 6c 6f 77 69 6e 67 t line following
3db0: 20 74 68 65 20 62 6f 75 6e 64 72 79 2e 0a 2a 2a the boundry..**
3dc0: 20 54 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 The length of t
3dd0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 73 74 he content is st
3de0: 6f 72 65 64 20 69 6e 20 2a 70 6e 43 6f 6e 74 65 ored in *pnConte
3df0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 nt..*/.static ch
3e00: 61 72 20 2a 67 65 74 5f 62 6f 75 6e 64 65 64 5f ar *get_bounded_
3e10: 63 6f 6e 74 65 6e 74 28 0a 20 20 63 68 61 72 20 content(. char
3e20: 2a 2a 70 7a 2c 20 20 20 20 20 20 20 20 20 2f 2a **pz, /*
3e30: 20 43 6f 6e 74 65 6e 74 20 74 61 6b 65 6e 20 66 Content taken f
3e40: 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e rom here */. in
3e50: 74 20 2a 70 4c 65 6e 2c 20 20 20 20 20 20 20 20 t *pLen,
3e60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 /* Number of by
3e70: 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 28 tes of data in (
3e80: 2a 70 7a 29 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 *pz)[] */. char
3e90: 20 2a 7a 42 6f 75 6e 64 72 79 2c 20 20 20 20 2f *zBoundry, /
3ea0: 2a 20 42 6f 75 6e 64 72 79 20 74 65 78 74 20 6d * Boundry text m
3eb0: 61 72 6b 69 6e 67 20 74 68 65 20 65 6e 64 20 6f arking the end o
3ec0: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 f content */. i
3ed0: 6e 74 20 2a 70 6e 43 6f 6e 74 65 6e 74 20 20 20 nt *pnContent
3ee0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 /* Write the s
3ef0: 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 ize of the conte
3f00: 6e 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 nt here */.){.
3f10: 63 68 61 72 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 char *z = *pz;.
3f20: 20 69 6e 74 20 6c 65 6e 20 3d 20 2a 70 4c 65 6e int len = *pLen
3f30: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 ;. int i;. int
3f40: 20 6e 42 6f 75 6e 64 72 79 20 3d 20 73 74 72 6c nBoundry = strl
3f50: 65 6e 28 7a 42 6f 75 6e 64 72 79 29 3b 0a 20 20 en(zBoundry);.
3f60: 2a 70 6e 43 6f 6e 74 65 6e 74 20 3d 20 6c 65 6e *pnContent = len
3f70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c ;. for(i=0; i<l
3f80: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 en; i++){. if
3f90: 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 26 26 20 ( z[i]=='\n' &&
3fa0: 73 74 72 6e 63 6d 70 28 7a 42 6f 75 6e 64 72 79 strncmp(zBoundry
3fb0: 2c 20 26 7a 5b 69 2b 31 5d 2c 20 6e 42 6f 75 6e , &z[i+1], nBoun
3fc0: 64 72 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 dry)==0 ){.
3fd0: 20 69 66 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d if( i>0 && z[i-
3fe0: 31 5d 3d 3d 27 5c 72 27 20 29 20 69 2d 2d 3b 0a 1]=='\r' ) i--;.
3ff0: 20 20 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a z[i] = 0;.
4000: 20 20 20 20 20 20 2a 70 6e 43 6f 6e 74 65 6e 74 *pnContent
4010: 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 20 2b 3d = i;. i +=
4020: 20 6e 42 6f 75 6e 64 72 79 3b 0a 20 20 20 20 20 nBoundry;.
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
4040: 7d 0a 20 20 2a 70 7a 20 3d 20 26 7a 5b 69 5d 3b }. *pz = &z[i];
4050: 0a 20 20 67 65 74 5f 6c 69 6e 65 5f 66 72 6f 6d . get_line_from
4060: 5f 73 74 72 69 6e 67 28 70 7a 2c 20 70 4c 65 6e _string(pz, pLen
4070: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 20 20 );. return z;
4080: 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f .}../*.** To
4090: 6b 65 6e 69 7a 65 20 61 20 6c 69 6e 65 20 6f 66 kenize a line of
40a0: 20 74 65 78 74 20 69 6e 74 6f 20 61 73 20 6d 61 text into as ma
40b0: 6e 79 20 61 73 20 6e 41 72 67 20 74 6f 6b 65 6e ny as nArg token
40c0: 73 2e 20 20 4d 61 6b 65 0a 2a 2a 20 61 7a 41 72 s. Make.** azAr
40d0: 67 5b 5d 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 g[] point to the
40e0: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 74 start of each t
40f0: 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 oken..**.** Toke
4100: 6e 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 73 70 ns consist of sp
4110: 61 63 65 20 6f 72 20 73 65 6d 69 2d 63 6f 6c 6f ace or semi-colo
4120: 6e 20 64 65 6c 69 6d 69 74 65 64 20 77 6f 72 64 n delimited word
4130: 73 20 6f 72 0a 2a 2a 20 73 74 72 69 6e 67 73 20 s or.** strings
4140: 69 6e 73 69 64 65 20 64 6f 75 62 6c 65 2d 71 75 inside double-qu
4150: 6f 74 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a otes. Example:.
4160: 2a 2a 0a 2a 2a 20 20 20 20 63 6f 6e 74 65 6e 74 **.** content
4170: 2d 64 69 73 70 6f 73 69 74 69 6f 6e 3a 20 66 6f -disposition: fo
4180: 72 6d 2d 64 61 74 61 3b 20 6e 61 6d 65 3d 22 66 rm-data; name="f
4190: 6e 22 3b 20 66 69 6c 65 6e 61 6d 65 3d 22 69 6e n"; filename="in
41a0: 64 65 78 2e 68 74 6d 6c 22 0a 2a 2a 0a 2a 2a 20 dex.html".**.**
41b0: 54 68 65 20 6c 69 6e 65 20 61 62 6f 76 65 20 69 The line above i
41c0: 73 20 74 6f 6b 65 6e 69 7a 65 64 20 61 73 20 66 s tokenized as f
41d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 ollows:.**.**
41e0: 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 63 6f 6e azArg[0] = "con
41f0: 74 65 6e 74 2d 64 69 73 70 6f 73 69 74 69 6f 6e tent-disposition
4200: 3a 22 0a 2a 2a 20 20 20 20 61 7a 41 72 67 5b 31 :".** azArg[1
4210: 5d 20 3d 20 22 66 6f 72 6d 2d 64 61 74 61 22 0a ] = "form-data".
4220: 2a 2a 20 20 20 20 61 7a 41 72 67 5b 32 5d 20 3d ** azArg[2] =
4230: 20 22 6e 61 6d 65 3d 22 0a 2a 2a 20 20 20 20 61 "name=".** a
4240: 7a 41 72 67 5b 33 5d 20 3d 20 22 66 6e 22 0a 2a zArg[3] = "fn".*
4250: 2a 20 20 20 20 61 7a 41 72 67 5b 34 5d 20 3d 20 * azArg[4] =
4260: 22 66 69 6c 65 6e 61 6d 65 3d 22 0a 2a 2a 20 20 "filename=".**
4270: 20 20 61 7a 41 72 67 5b 35 5d 20 3d 20 22 69 6e azArg[5] = "in
4280: 64 65 78 2e 68 74 6d 6c 22 0a 2a 2a 20 20 20 20 dex.html".**
4290: 61 7a 41 72 67 5b 36 5d 20 3d 20 30 3b 0a 2a 2a azArg[6] = 0;.**
42a0: 0a 2a 2a 20 27 5c 30 30 30 27 20 63 68 61 72 61 .** '\000' chara
42b0: 63 74 65 72 73 20 61 72 65 20 69 6e 73 65 72 74 cters are insert
42c0: 65 64 20 69 6e 20 7a 5b 5d 20 61 74 20 74 68 65 ed in z[] at the
42d0: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 74 6f 6b end of each tok
42e0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 en..** This rout
42f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 ine returns the
4300: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 total number of
4310: 74 6f 6b 65 6e 73 20 6f 6e 20 74 68 65 20 6c 69 tokens on the li
4320: 6e 65 2c 20 36 0a 2a 2a 20 69 6e 20 74 68 65 20 ne, 6.** in the
4330: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2e 0a 2a example above..*
4340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f 6b /.static int tok
4350: 65 6e 69 7a 65 5f 6c 69 6e 65 28 63 68 61 72 20 enize_line(char
4360: 2a 7a 2c 20 69 6e 74 20 6d 78 41 72 67 2c 20 63 *z, int mxArg, c
4370: 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 har **azArg){.
4380: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 int i = 0;. whi
4390: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 77 68 le( *z ){. wh
43a0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 29 ile( isspace(*z)
43b0: 20 7c 7c 20 2a 7a 3d 3d 27 3b 27 20 29 7b 20 7a || *z==';' ){ z
43c0: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 2a 7a ++; }. if( *z
43d0: 3d 3d 27 22 27 20 26 26 20 7a 5b 31 5d 20 29 7b =='"' && z[1] ){
43e0: 0a 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 . *z = 0;.
43f0: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 z++;.
4400: 69 66 28 20 69 3c 6d 78 41 72 67 2d 31 20 29 7b if( i<mxArg-1 ){
4410: 20 61 7a 41 72 67 5b 69 2b 2b 5d 20 3d 20 7a 3b azArg[i++] = z;
4420: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 }. while(
4430: 2a 7a 20 26 26 20 2a 7a 21 3d 27 22 27 20 29 7b *z && *z!='"' ){
4440: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 z++; }. if
4450: 28 20 2a 7a 3d 3d 30 20 29 20 62 72 65 61 6b 3b ( *z==0 ) break;
4460: 0a 20 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 . *z = 0;.
4470: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 z++;. }e
4480: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 69 lse{. if( i
4490: 3c 6d 78 41 72 67 2d 31 20 29 7b 20 61 7a 41 72 <mxArg-1 ){ azAr
44a0: 67 5b 69 2b 2b 5d 20 3d 20 7a 3b 20 7d 0a 20 20 g[i++] = z; }.
44b0: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 while( *z &&
44c0: 20 21 69 73 73 70 61 63 65 28 2a 7a 29 20 26 26 !isspace(*z) &&
44d0: 20 2a 7a 21 3d 27 3b 27 20 26 26 20 2a 7a 21 3d *z!=';' && *z!=
44e0: 27 22 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 '"' ){ z++; }.
44f0: 20 20 20 20 69 66 28 20 2a 7a 20 26 26 20 2a 7a if( *z && *z
4500: 21 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20 !='"' ){.
4510: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 *z = 0;.
4520: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 z++;. }.
4530: 20 20 7d 0a 20 20 7d 0a 20 20 61 7a 41 72 67 5b }. }. azArg[
4540: 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e i] = 0;. return
4550: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 i;.}../*.** Sca
4560: 6e 20 74 68 65 20 6d 75 6c 74 69 70 61 72 74 2d n the multipart-
4570: 66 6f 72 6d 20 63 6f 6e 74 65 6e 74 20 61 6e 64 form content and
4580: 20 6d 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 make appropriat
4590: 65 20 65 6e 74 72 69 65 73 0a 2a 2a 20 69 6e 74 e entries.** int
45a0: 6f 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 o the parameter
45b0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 table..**.** The
45c0: 20 63 6f 6e 74 65 6e 74 20 73 74 72 69 6e 67 20 content string
45d0: 22 7a 22 20 69 73 20 6d 6f 64 69 66 69 65 64 20 "z" is modified
45e0: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 by this routine
45f0: 62 75 74 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 but it is.** not
4600: 20 63 6f 70 69 65 64 2e 20 20 54 68 65 20 63 61 copied. The ca
4610: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d lling function m
4620: 75 73 74 20 6e 6f 74 20 64 65 61 6c 6c 6f 63 61 ust not dealloca
4630: 74 65 20 6f 72 20 6d 6f 64 69 66 79 0a 2a 2a 20 te or modify.**
4640: 22 7a 22 20 61 66 74 65 72 20 74 68 69 73 20 72 "z" after this r
4650: 6f 75 74 69 6e 65 20 66 69 6e 69 73 68 65 73 20 outine finishes
4660: 6f 72 20 69 74 20 63 6f 75 6c 64 20 63 6f 72 72 or it could corr
4670: 75 70 74 20 74 68 65 20 70 61 72 61 6d 65 74 65 upt the paramete
4680: 72 0a 2a 2a 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 r.** table..*/.s
4690: 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f 63 65 tatic void proce
46a0: 73 73 5f 6d 75 6c 74 69 70 61 72 74 5f 66 6f 72 ss_multipart_for
46b0: 6d 5f 64 61 74 61 28 63 68 61 72 20 2a 7a 2c 20 m_data(char *z,
46c0: 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 63 68 61 72 int len){. char
46d0: 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e 74 20 6e *zLine;. int n
46e0: 41 72 67 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a Arg, i;. char *
46f0: 7a 42 6f 75 6e 64 72 79 3b 0a 20 20 63 68 61 72 zBoundry;. char
4700: 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 63 68 61 72 *zValue;. char
4710: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 *zName = 0;. i
4720: 6e 74 20 73 68 6f 77 42 79 74 65 73 20 3d 20 30 nt showBytes = 0
4730: 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b ;. char *azArg[
4740: 35 30 5d 3b 0a 0a 20 20 7a 42 6f 75 6e 64 72 79 50];.. zBoundry
4750: 20 3d 20 67 65 74 5f 6c 69 6e 65 5f 66 72 6f 6d = get_line_from
4760: 5f 73 74 72 69 6e 67 28 26 7a 2c 20 26 6c 65 6e _string(&z, &len
4770: 29 3b 0a 20 20 69 66 28 20 7a 42 6f 75 6e 64 72 );. if( zBoundr
4780: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 y==0 ) return;.
4790: 20 77 68 69 6c 65 28 20 28 7a 4c 69 6e 65 20 3d while( (zLine =
47a0: 20 67 65 74 5f 6c 69 6e 65 5f 66 72 6f 6d 5f 73 get_line_from_s
47b0: 74 72 69 6e 67 28 26 7a 2c 20 26 6c 65 6e 29 29 tring(&z, &len))
47c0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a !=0 ){. if( z
47d0: 4c 69 6e 65 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 Line[0]==0 ){.
47e0: 20 20 20 20 69 6e 74 20 6e 43 6f 6e 74 65 6e 74 int nContent
47f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 56 61 6c = 0;. zVal
4800: 75 65 20 3d 20 67 65 74 5f 62 6f 75 6e 64 65 64 ue = get_bounded
4810: 5f 63 6f 6e 74 65 6e 74 28 26 7a 2c 20 26 6c 65 _content(&z, &le
4820: 6e 2c 20 7a 42 6f 75 6e 64 72 79 2c 20 26 6e 43 n, zBoundry, &nC
4830: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 ontent);. i
4840: 66 28 20 7a 4e 61 6d 65 20 26 26 20 7a 56 61 6c f( zName && zVal
4850: 75 65 20 26 26 20 69 73 6c 6f 77 65 72 28 7a 4e ue && islower(zN
4860: 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 ame[0]) ){.
4870: 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d cgi_set_param
4880: 65 74 65 72 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d eter_nocopy(zNam
4890: 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 e, zValue);.
48a0: 20 20 20 20 69 66 28 20 73 68 6f 77 42 79 74 65 if( showByte
48b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 s ){. c
48c0: 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 72 gi_set_parameter
48d0: 5f 6e 6f 63 6f 70 79 28 6d 70 72 69 6e 74 66 28 _nocopy(mprintf(
48e0: 22 25 73 3a 62 79 74 65 73 22 2c 20 7a 4e 61 6d "%s:bytes", zNam
48f0: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 e),.
4900: 20 20 20 6d 70 72 69 6e 74 66 28 22 25 64 22 2c mprintf("%d",
4910: 6e 43 6f 6e 74 65 6e 74 29 29 3b 0a 20 20 20 20 nContent));.
4920: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
4930: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 zName = 0;.
4940: 20 20 20 20 20 73 68 6f 77 42 79 74 65 73 20 3d showBytes =
4950: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0;. }else{.
4960: 20 20 20 20 20 6e 41 72 67 20 3d 20 74 6f 6b 65 nArg = toke
4970: 6e 69 7a 65 5f 6c 69 6e 65 28 7a 4c 69 6e 65 2c nize_line(zLine,
4980: 20 73 69 7a 65 6f 66 28 61 7a 41 72 67 29 2f 73 sizeof(azArg)/s
4990: 69 7a 65 6f 66 28 61 7a 41 72 67 5b 30 5d 29 2c izeof(azArg[0]),
49a0: 20 61 7a 41 72 67 29 3b 0a 20 20 20 20 20 20 66 azArg);. f
49b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 or(i=0; i<nArg;
49c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e i++){. in
49d0: 74 20 63 20 3d 20 74 6f 6c 6f 77 65 72 28 61 7a t c = tolower(az
49e0: 41 72 67 5b 69 5d 5b 30 5d 29 3b 0a 20 20 20 20 Arg[i][0]);.
49f0: 20 20 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 if( c=='c' &
4a00: 26 20 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b & stricmp(azArg[
4a10: 69 5d 2c 22 63 6f 6e 74 65 6e 74 2d 64 69 73 70 i],"content-disp
4a20: 6f 73 69 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 7b osition:")==0 ){
4a30: 0a 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a . i++;.
4a40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 }else if
4a50: 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 69 ( c=='n' && stri
4a60: 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 22 6e 61 cmp(azArg[i],"na
4a70: 6d 65 3d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 me=")==0 ){.
4a80: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a zName = az
4a90: 41 72 67 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 Arg[++i];.
4aa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 }else if( c=='
4ab0: 66 27 20 26 26 20 73 74 72 69 63 6d 70 28 61 7a f' && stricmp(az
4ac0: 41 72 67 5b 69 5d 2c 22 66 69 6c 65 6e 61 6d 65 Arg[i],"filename
4ad0: 3d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 =")==0 ){.
4ae0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a char *z = az
4af0: 41 72 67 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 Arg[++i];.
4b00: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 if( zName &&
4b10: 20 7a 20 26 26 20 69 73 6c 6f 77 65 72 28 7a 4e z && islower(zN
4b20: 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 ame[0]) ){.
4b30: 20 20 20 20 20 20 20 63 67 69 5f 73 65 74 5f 70 cgi_set_p
4b40: 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 arameter_nocopy(
4b50: 6d 70 72 69 6e 74 66 28 22 25 73 3a 66 69 6c 65 mprintf("%s:file
4b60: 6e 61 6d 65 22 2c 7a 4e 61 6d 65 29 2c 20 7a 29 name",zName), z)
4b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
4b80: 20 20 20 20 20 20 20 20 73 68 6f 77 42 79 74 65 showByte
4b90: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d s = 1;. }
4ba0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 63 27 20 else if( c=='c'
4bb0: 26 26 20 73 74 72 69 63 6d 70 28 61 7a 41 72 67 && stricmp(azArg
4bc0: 5b 69 5d 2c 22 63 6f 6e 74 65 6e 74 2d 74 79 70 [i],"content-typ
4bd0: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 e:")==0 ){.
4be0: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 char *z = a
4bf0: 7a 41 72 67 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 zArg[++i];.
4c00: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 if( zName &
4c10: 26 20 7a 20 26 26 20 69 73 6c 6f 77 65 72 28 7a & z && islower(z
4c20: 4e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 Name[0]) ){.
4c30: 20 20 20 20 20 20 20 20 63 67 69 5f 73 65 74 5f cgi_set_
4c40: 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 parameter_nocopy
4c50: 28 6d 70 72 69 6e 74 66 28 22 25 73 3a 6d 69 6d (mprintf("%s:mim
4c60: 65 74 79 70 65 22 2c 7a 4e 61 6d 65 29 2c 20 7a etype",zName), z
4c70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 );. }.
4c80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
4c90: 0a 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 20 20 . }. }
4ca0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 .}../*.** Init
4cb0: 69 61 6c 69 7a 65 20 74 68 65 20 71 75 65 72 79 ialize the query
4cc0: 20 70 61 72 61 6d 65 74 65 72 20 64 61 74 61 62 parameter datab
4cd0: 61 73 65 2e 20 20 49 6e 66 6f 72 6d 61 74 69 6f ase. Informatio
4ce0: 6e 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d n is pulled from
4cf0: 0a 2a 2a 20 74 68 65 20 51 55 45 52 59 5f 53 54 .** the QUERY_ST
4d00: 52 49 4e 47 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 RING environment
4d10: 20 76 61 72 69 61 62 6c 65 20 28 69 66 20 69 74 variable (if it
4d20: 20 65 78 69 73 74 73 29 2c 20 66 72 6f 6d 20 73 exists), from s
4d30: 74 61 6e 64 61 72 64 0a 2a 2a 20 69 6e 70 75 74 tandard.** input
4d40: 20 69 66 20 74 68 65 72 65 20 69 73 20 50 4f 53 if there is POS
4d50: 54 20 64 61 74 61 2c 20 61 6e 64 20 66 72 6f 6d T data, and from
4d60: 20 48 54 54 50 5f 43 4f 4f 4b 49 45 2e 0a 2a 2f HTTP_COOKIE..*/
4d70: 0a 76 6f 69 64 20 63 67 69 5f 69 6e 69 74 28 76 .void cgi_init(v
4d80: 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b oid){. char *z;
4d90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
4da0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b Type;. int len;
4db0: 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69 . cgi_destinati
4dc0: 6f 6e 28 43 47 49 5f 42 4f 44 59 29 3b 0a 20 20 on(CGI_BODY);.
4dd0: 7a 20 3d 20 28 63 68 61 72 2a 29 50 28 22 51 55 z = (char*)P("QU
4de0: 45 52 59 5f 53 54 52 49 4e 47 22 29 3b 0a 20 20 ERY_STRING");.
4df0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 7a 20 3d if( z ){. z =
4e00: 20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 7a 29 mprintf("%s",z)
4e10: 3b 0a 20 20 20 20 61 64 64 5f 70 61 72 61 6d 5f ;. add_param_
4e20: 6c 69 73 74 28 7a 2c 20 27 26 27 29 3b 0a 20 20 list(z, '&');.
4e30: 7d 0a 0a 20 20 6c 65 6e 20 3d 20 61 74 6f 69 28 }.. len = atoi(
4e40: 50 44 28 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e 47 PD("CONTENT_LENG
4e50: 54 48 22 2c 20 22 30 22 29 29 3b 0a 20 20 67 2e TH", "0"));. g.
4e60: 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 7a zContentType = z
4e70: 54 79 70 65 20 3d 20 50 28 22 43 4f 4e 54 45 4e Type = P("CONTEN
4e80: 54 5f 54 59 50 45 22 29 3b 0a 20 20 69 66 28 20 T_TYPE");. if(
4e90: 6c 65 6e 3e 30 20 26 26 20 7a 54 79 70 65 20 29 len>0 && zType )
4ea0: 7b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 {. blob_zero(
4eb0: 26 67 2e 63 67 69 49 6e 29 3b 0a 20 20 20 20 69 &g.cgiIn);. i
4ec0: 66 28 20 73 74 72 63 6d 70 28 7a 54 79 70 65 2c f( strcmp(zType,
4ed0: 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 "application/x-w
4ee0: 77 77 2d 66 6f 72 6d 2d 75 72 6c 65 6e 63 6f 64 ww-form-urlencod
4ef0: 65 64 22 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 ed")==0 .
4f00: 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 54 79 || strncmp(zTy
4f10: 70 65 2c 22 6d 75 6c 74 69 70 61 72 74 2f 66 6f pe,"multipart/fo
4f20: 72 6d 2d 64 61 74 61 22 2c 31 39 29 3d 3d 30 20 rm-data",19)==0
4f30: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 6d 61 6c ){. z = mal
4f40: 6c 6f 63 28 20 6c 65 6e 2b 31 20 29 3b 0a 20 20 loc( len+1 );.
4f50: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 65 if( z==0 ) e
4f60: 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 6c 65 xit(1);. le
4f70: 6e 20 3d 20 66 72 65 61 64 28 7a 2c 20 31 2c 20 n = fread(z, 1,
4f80: 6c 65 6e 2c 20 67 2e 68 74 74 70 49 6e 29 3b 0a len, g.httpIn);.
4f90: 20 20 20 20 20 20 7a 5b 6c 65 6e 5d 20 3d 20 30 z[len] = 0
4fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 79 70 ;. if( zTyp
4fb0: 65 5b 30 5d 3d 3d 27 61 27 20 29 7b 0a 20 20 20 e[0]=='a' ){.
4fc0: 20 20 20 20 20 61 64 64 5f 70 61 72 61 6d 5f 6c add_param_l
4fd0: 69 73 74 28 7a 2c 20 27 26 27 29 3b 0a 20 20 20 ist(z, '&');.
4fe0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
4ff0: 20 20 70 72 6f 63 65 73 73 5f 6d 75 6c 74 69 70 process_multip
5000: 61 72 74 5f 66 6f 72 6d 5f 64 61 74 61 28 7a 2c art_form_data(z,
5010: 20 6c 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 len);. }.
5020: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 }else if( str
5030: 63 6d 70 28 7a 54 79 70 65 2c 20 22 61 70 70 6c cmp(zType, "appl
5040: 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c ication/x-fossil
5050: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 ")==0 ){. b
5060: 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 68 lob_read_from_ch
5070: 61 6e 6e 65 6c 28 26 67 2e 63 67 69 49 6e 2c 20 annel(&g.cgiIn,
5080: 67 2e 68 74 74 70 49 6e 2c 20 6c 65 6e 29 3b 0a g.httpIn, len);.
5090: 20 20 20 20 20 20 62 6c 6f 62 5f 75 6e 63 6f 6d blob_uncom
50a0: 70 72 65 73 73 28 26 67 2e 63 67 69 49 6e 2c 20 press(&g.cgiIn,
50b0: 26 67 2e 63 67 69 49 6e 29 3b 0a 20 20 20 20 20 &g.cgiIn);.
50c0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 /* If the conte
50d0: 6e 74 20 74 79 70 65 20 69 73 20 61 70 70 6c 69 nt type is appli
50e0: 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2c cation/x-fossil,
50f0: 20 74 68 65 6e 20 69 67 6e 6f 72 65 0a 20 20 20 then ignore.
5100: 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 69 ** the path i
5110: 6e 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 n the first line
5120: 20 6f 66 20 74 68 65 20 48 54 54 50 20 68 65 61 of the HTTP hea
5130: 64 65 72 20 61 6e 64 20 61 6c 77 61 79 73 0a 20 der and always.
5140: 20 20 20 20 20 2a 2a 20 75 73 65 20 74 68 65 20 ** use the
5150: 2f 78 66 65 72 20 6d 65 74 68 6f 64 20 73 69 6e /xfer method sin
5160: 63 65 20 74 68 65 20 2f 78 66 65 72 20 6d 65 74 ce the /xfer met
5170: 68 6f 64 20 69 73 20 74 68 65 20 6f 6e 6c 79 0a hod is the only.
5180: 20 20 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 ** method
5190: 74 68 61 74 20 75 6e 64 65 72 73 74 61 6e 64 73 that understands
51a0: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
51b0: 2f 78 2d 66 6f 73 73 69 6c 20 63 6f 6e 74 65 6e /x-fossil conten
51c0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 2e t. ** type.
51d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 . */.
51e0: 63 67 69 5f 72 65 70 6c 61 63 65 5f 70 61 72 61 cgi_replace_para
51f0: 6d 65 74 65 72 28 22 50 41 54 48 5f 49 4e 46 4f meter("PATH_INFO
5200: 22 2c 20 22 2f 78 66 65 72 22 29 3b 0a 20 20 20 ", "/xfer");.
5210: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d }else if( strcm
5220: 70 28 7a 54 79 70 65 2c 20 22 61 70 70 6c 69 63 p(zType, "applic
5230: 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d 64 ation/x-fossil-d
5240: 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 ebug")==0 ){.
5250: 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f blob_read_fro
5260: 6d 5f 63 68 61 6e 6e 65 6c 28 26 67 2e 63 67 69 m_channel(&g.cgi
5270: 49 6e 2c 20 67 2e 68 74 74 70 49 6e 2c 20 6c 65 In, g.httpIn, le
5280: 6e 29 3b 0a 20 20 20 20 20 20 63 67 69 5f 72 65 n);. cgi_re
5290: 70 6c 61 63 65 5f 70 61 72 61 6d 65 74 65 72 28 place_parameter(
52a0: 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20 22 2f 78 "PATH_INFO", "/x
52b0: 66 65 72 22 29 3b 20 20 2f 2a 20 53 65 65 20 63 fer"); /* See c
52c0: 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 2a 2f 0a omment above */.
52d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 7a 20 3d }. }.. z =
52e0: 20 28 63 68 61 72 2a 29 50 28 22 48 54 54 50 5f (char*)P("HTTP_
52f0: 43 4f 4f 4b 49 45 22 29 3b 0a 20 20 69 66 28 20 COOKIE");. if(
5300: 7a 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6d 70 72 z ){. z = mpr
5310: 69 6e 74 66 28 22 25 73 22 2c 7a 29 3b 0a 20 20 intf("%s",z);.
5320: 20 20 61 64 64 5f 70 61 72 61 6d 5f 6c 69 73 74 add_param_list
5330: 28 7a 2c 20 27 3b 27 29 3b 0a 20 20 7d 0a 7d 0a (z, ';');. }.}.
5340: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 ./*.** This is t
5350: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 he comparison fu
5360: 6e 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 73 nction used to s
5370: 6f 72 74 20 74 68 65 20 61 50 61 72 61 6d 51 50 ort the aParamQP
5380: 5b 5d 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 71 [] array of.** q
5390: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 uery parameters
53a0: 61 6e 64 20 63 6f 6f 6b 69 65 73 2e 0a 2a 2f 0a and cookies..*/.
53b0: 73 74 61 74 69 63 20 69 6e 74 20 71 70 61 72 61 static int qpara
53c0: 6d 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 m_compare(const
53d0: 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 void *a, const v
53e0: 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 oid *b){. struc
53f0: 74 20 51 50 61 72 61 6d 20 2a 70 41 20 3d 20 28 t QParam *pA = (
5400: 73 74 72 75 63 74 20 51 50 61 72 61 6d 2a 29 61 struct QParam*)a
5410: 3b 0a 20 20 73 74 72 75 63 74 20 51 50 61 72 61 ;. struct QPara
5420: 6d 20 2a 70 42 20 3d 20 28 73 74 72 75 63 74 20 m *pB = (struct
5430: 51 50 61 72 61 6d 2a 29 62 3b 0a 20 20 69 6e 74 QParam*)b;. int
5440: 20 63 3b 0a 20 20 63 20 3d 20 73 74 72 63 6d 70 c;. c = strcmp
5450: 28 70 41 2d 3e 7a 4e 61 6d 65 2c 20 70 42 2d 3e (pA->zName, pB->
5460: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 3d zName);. if( c=
5470: 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 41 =0 ){. c = pA
5480: 2d 3e 73 65 71 20 2d 20 70 42 2d 3e 73 65 71 3b ->seq - pB->seq;
5490: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 3b . }. return c;
54a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
54b0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 the value of a
54c0: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 query parameter
54d0: 6f 72 20 63 6f 6f 6b 69 65 20 77 68 6f 73 65 20 or cookie whose
54e0: 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 2e 0a 2a name is zName..*
54f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f * If there is no
5500: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 query parameter
5510: 20 6f 72 20 63 6f 6f 6b 69 65 20 6e 61 6d 65 64 or cookie named
5520: 20 7a 4e 61 6d 65 20 61 6e 64 20 74 68 65 20 66 zName and the f
5530: 69 72 73 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 irst.** characte
5540: 72 20 6f 66 20 7a 4e 61 6d 65 20 69 73 20 75 70 r of zName is up
5550: 70 65 72 63 61 73 65 2c 20 74 68 65 6e 20 63 68 percase, then ch
5560: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 eck to see if th
5570: 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 65 6e 76 ere is an.** env
5580: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c ironment variabl
5590: 65 20 62 79 20 74 68 61 74 20 6e 61 6d 65 20 61 e by that name a
55a0: 6e 64 20 72 65 74 75 72 6e 20 69 74 20 69 66 20 nd return it if
55b0: 74 68 65 72 65 20 69 73 2e 20 20 41 73 0a 2a 2a there is. As.**
55c0: 20 61 20 6c 61 73 74 20 72 65 73 6f 72 74 20 77 a last resort w
55d0: 68 65 6e 20 6e 6f 74 68 69 6e 67 20 65 6c 73 65 hen nothing else
55e0: 20 6d 61 74 63 68 65 73 2c 20 72 65 74 75 72 6e matches, return
55f0: 20 7a 44 65 66 61 75 6c 74 2e 0a 2a 2f 0a 63 6f zDefault..*/.co
5600: 6e 73 74 20 63 68 61 72 20 2a 63 67 69 5f 70 61 nst char *cgi_pa
5610: 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 rameter(const ch
5620: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 ar *zName, const
5630: 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 29 char *zDefault)
5640: 7b 0a 20 20 69 6e 74 20 6c 6f 2c 20 68 69 2c 20 {. int lo, hi,
5650: 6d 69 64 2c 20 63 3b 0a 0a 20 20 2f 2a 20 54 68 mid, c;.. /* Th
5660: 65 20 73 6f 72 74 51 50 20 66 6c 61 67 20 69 73 e sortQP flag is
5670: 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61 20 set whenever a
5680: 6e 65 77 20 71 75 65 72 79 20 70 61 72 61 6d 65 new query parame
5690: 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 2e ter is inserted.
56a0: 0a 20 20 2a 2a 20 49 74 20 69 6e 64 69 63 61 74 . ** It indicat
56b0: 65 73 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 es that we need
56c0: 74 6f 20 72 65 73 6f 72 74 20 74 68 65 20 71 75 to resort the qu
56d0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a ery parameters..
56e0: 20 20 2a 2f 0a 20 20 69 66 28 20 73 6f 72 74 51 */. if( sortQ
56f0: 50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 P ){. int i,
5700: 6a 3b 0a 20 20 20 20 71 73 6f 72 74 28 61 50 61 j;. qsort(aPa
5710: 72 61 6d 51 50 2c 20 6e 55 73 65 64 51 50 2c 20 ramQP, nUsedQP,
5720: 73 69 7a 65 6f 66 28 61 50 61 72 61 6d 51 50 5b sizeof(aParamQP[
5730: 30 5d 29 2c 20 71 70 61 72 61 6d 5f 63 6f 6d 70 0]), qparam_comp
5740: 61 72 65 29 3b 0a 20 20 20 20 73 6f 72 74 51 50 are);. sortQP
5750: 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 41 66 74 = 0;. /* Aft
5760: 65 72 20 73 6f 72 74 69 6e 67 2c 20 72 65 6d 6f er sorting, remo
5770: 76 65 20 64 75 70 6c 69 63 61 74 65 20 70 61 72 ve duplicate par
5780: 61 6d 65 74 65 72 73 2e 20 20 54 68 65 20 73 65 ameters. The se
5790: 63 6f 6e 64 61 72 79 20 73 6f 72 74 0a 20 20 20 condary sort.
57a0: 20 2a 2a 20 6b 65 79 20 69 73 20 61 50 61 72 61 ** key is aPara
57b0: 6d 51 50 5b 5d 2e 73 65 71 20 61 6e 64 20 77 65 mQP[].seq and we
57c0: 20 6b 65 65 70 20 74 68 65 20 66 69 72 73 74 20 keep the first
57d0: 65 6e 74 72 79 2e 20 20 54 68 61 74 20 6d 65 61 entry. That mea
57e0: 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 64 ns. ** with d
57f0: 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 73 20 74 uplicate calls t
5800: 6f 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 o cgi_set_parame
5810: 74 65 72 28 29 20 74 68 65 20 73 65 63 6f 6e 64 ter() the second
5820: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 75 62 73 and. ** subs
5830: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 65 equent calls are
5840: 20 65 66 66 65 63 74 69 76 65 6c 79 20 6e 6f 2d effectively no-
5850: 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 ops. */. for(
5860: 69 3d 6a 3d 31 3b 20 69 3c 6e 55 73 65 64 51 50 i=j=1; i<nUsedQP
5870: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 ; i++){. if
5880: 28 20 73 74 72 63 6d 70 28 61 50 61 72 61 6d 51 ( strcmp(aParamQ
5890: 50 5b 69 5d 2e 7a 4e 61 6d 65 2c 61 50 61 72 61 P[i].zName,aPara
58a0: 6d 51 50 5b 69 2d 31 5d 2e 7a 4e 61 6d 65 29 3d mQP[i-1].zName)=
58b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f =0 ){. co
58c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a ntinue;. }.
58d0: 20 20 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b if( j<i ){
58e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 . memcpy(
58f0: 26 61 50 61 72 61 6d 51 50 5b 6a 5d 2c 20 26 61 &aParamQP[j], &a
5900: 50 61 72 61 6d 51 50 5b 69 5d 2c 20 73 69 7a 65 ParamQP[i], size
5910: 6f 66 28 61 50 61 72 61 6d 51 50 5b 6a 5d 29 29 of(aParamQP[j]))
5920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
5930: 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e j++;. }. n
5940: 55 73 65 64 51 50 20 3d 20 6a 3b 0a 20 20 7d 0a UsedQP = j;. }.
5950: 0a 20 20 2f 2a 20 44 6f 20 61 20 62 69 6e 61 72 . /* Do a binar
5960: 79 20 73 65 61 72 63 68 20 66 6f 72 20 61 20 6d y search for a m
5970: 61 74 63 68 69 6e 67 20 71 75 65 72 79 20 70 61 atching query pa
5980: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 6c 6f 20 rameter */. lo
5990: 3d 20 30 3b 0a 20 20 68 69 20 3d 20 6e 55 73 65 = 0;. hi = nUse
59a0: 64 51 50 2d 31 3b 0a 20 20 77 68 69 6c 65 28 20 dQP-1;. while(
59b0: 6c 6f 3c 3d 68 69 20 29 7b 0a 20 20 20 20 6d 69 lo<=hi ){. mi
59c0: 64 20 3d 20 28 6c 6f 2b 68 69 29 2f 32 3b 0a 20 d = (lo+hi)/2;.
59d0: 20 20 20 63 20 3d 20 73 74 72 63 6d 70 28 61 50 c = strcmp(aP
59e0: 61 72 61 6d 51 50 5b 6d 69 64 5d 2e 7a 4e 61 6d aramQP[mid].zNam
59f0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 e, zName);. i
5a00: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 f( c==0 ){.
5a10: 20 43 47 49 44 45 42 55 47 28 28 22 6d 65 6d 2d CGIDEBUG(("mem-
5a20: 6d 61 74 63 68 20 5b 25 73 5d 20 3d 20 5b 25 73 match [%s] = [%s
5a30: 5d 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 61 50 61 ]\n", zName, aPa
5a40: 72 61 6d 51 50 5b 6d 69 64 5d 2e 7a 56 61 6c 75 ramQP[mid].zValu
5a50: 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 e));. retur
5a60: 6e 20 61 50 61 72 61 6d 51 50 5b 6d 69 64 5d 2e n aParamQP[mid].
5a70: 7a 56 61 6c 75 65 3b 0a 20 20 20 20 7d 65 6c 73 zValue;. }els
5a80: 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 e if( c>0 ){.
5a90: 20 20 20 68 69 20 3d 20 6d 69 64 2d 31 3b 0a 20 hi = mid-1;.
5aa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
5ab0: 6c 6f 20 3d 20 6d 69 64 2b 31 3b 0a 20 20 20 20 lo = mid+1;.
5ac0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e }. }.. /* If n
5ad0: 6f 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 o match is found
5ae0: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 62 65 and the name be
5af0: 67 69 6e 73 20 77 69 74 68 20 61 6e 20 75 70 70 gins with an upp
5b00: 65 72 2d 63 61 73 65 0a 20 20 2a 2a 20 6c 65 74 er-case. ** let
5b10: 74 65 72 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 ter, then check
5b20: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 to see if there
5b30: 69 73 20 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e is an environmen
5b40: 74 20 76 61 72 69 61 62 6c 65 0a 20 20 2a 2a 20 t variable. **
5b50: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 6e with the given n
5b60: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ame.. */. if(
5b70: 69 73 75 70 70 65 72 28 7a 4e 61 6d 65 5b 30 5d isupper(zName[0]
5b80: 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 ) ){. const c
5b90: 68 61 72 20 2a 7a 56 61 6c 75 65 20 3d 20 67 65 har *zValue = ge
5ba0: 74 65 6e 76 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 tenv(zName);.
5bb0: 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b 0a 20 if( zValue ){.
5bc0: 20 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 cgi_set_par
5bd0: 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 7a 4e ameter_nocopy(zN
5be0: 61 6d 65 2c 20 7a 56 61 6c 75 65 29 3b 0a 20 20 ame, zValue);.
5bf0: 20 20 20 20 43 47 49 44 45 42 55 47 28 28 22 65 CGIDEBUG(("e
5c00: 6e 76 2d 6d 61 74 63 68 20 5b 25 73 5d 20 3d 20 nv-match [%s] =
5c10: 5b 25 73 5d 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 [%s]\n", zName,
5c20: 7a 56 61 6c 75 65 29 29 3b 0a 20 20 20 20 20 20 zValue));.
5c30: 72 65 74 75 72 6e 20 7a 56 61 6c 75 65 3b 0a 20 return zValue;.
5c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 43 47 49 44 45 }. }. CGIDE
5c50: 42 55 47 28 28 22 6e 6f 2d 6d 61 74 63 68 20 5b BUG(("no-match [
5c60: 25 73 5d 5c 6e 22 2c 20 7a 4e 61 6d 65 29 29 3b %s]\n", zName));
5c70: 0a 20 20 72 65 74 75 72 6e 20 7a 44 65 66 61 75 . return zDefau
5c80: 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 lt;.}../*.** Ret
5c90: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 urn the name of
5ca0: 74 68 65 20 69 2d 74 68 20 43 47 49 20 70 61 72 the i-th CGI par
5cb0: 61 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 ameter. Return
5cc0: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 0a 2a 2a NULL if there.**
5cd0: 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 are fewer than
5ce0: 69 20 72 65 67 69 73 74 65 72 65 64 20 43 47 49 i registered CGI
5cf0: 20 70 61 72 6d 61 65 74 65 72 73 2e 0a 2a 2f 0a parmaeters..*/.
5d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 67 69 5f const char *cgi_
5d10: 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 69 parameter_name(i
5d20: 6e 74 20 69 29 7b 0a 20 20 69 66 28 20 69 3e 3d nt i){. if( i>=
5d30: 30 20 26 26 20 69 3c 6e 55 73 65 64 51 50 20 29 0 && i<nUsedQP )
5d40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 50 61 {. return aPa
5d50: 72 61 6d 51 50 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a ramQP[i].zName;.
5d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 }else{. ret
5d70: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a urn 0;. }.}../*
5d80: 0a 2a 2a 20 50 72 69 6e 74 20 43 47 49 20 64 65 .** Print CGI de
5d90: 62 75 67 67 69 6e 67 20 6d 65 73 73 61 67 65 73 bugging messages
5da0: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 64 65 ..*/.void cgi_de
5db0: 62 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a bug(const char *
5dc0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 zFormat, ...){.
5dd0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 va_list ap;. i
5de0: 66 28 20 67 2e 66 44 65 62 75 67 20 29 7b 0a 20 f( g.fDebug ){.
5df0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 va_start(ap,
5e00: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 66 zFormat);. vf
5e10: 70 72 69 6e 74 66 28 67 2e 66 44 65 62 75 67 2c printf(g.fDebug,
5e20: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 zFormat, ap);.
5e30: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 va_end(ap);.
5e40: 20 20 20 66 66 6c 75 73 68 28 67 2e 66 44 65 62 fflush(g.fDeb
5e50: 75 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a ug);. }.}../*.*
5e60: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
5e70: 20 61 6e 79 20 6f 66 20 74 68 65 20 71 75 65 72 any of the quer
5e80: 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 y parameters in
5e90: 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 the argument.**
5ea0: 6c 69 73 74 20 61 72 65 20 64 65 66 69 6e 65 64 list are defined
5eb0: 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f 61 6e 79 ..*/.int cgi_any
5ec0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 (const char *z,
5ed0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 ...){. va_list
5ee0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 32 3b 0a ap;. char *z2;.
5ef0: 20 20 69 66 28 20 63 67 69 5f 70 61 72 61 6d 65 if( cgi_parame
5f00: 74 65 72 28 7a 2c 30 29 21 3d 30 20 29 20 72 65 ter(z,0)!=0 ) re
5f10: 74 75 72 6e 20 31 3b 0a 20 20 76 61 5f 73 74 61 turn 1;. va_sta
5f20: 72 74 28 61 70 2c 20 7a 29 3b 0a 20 20 77 68 69 rt(ap, z);. whi
5f30: 6c 65 28 20 28 7a 32 20 3d 20 76 61 5f 61 72 67 le( (z2 = va_arg
5f40: 28 61 70 2c 20 63 68 61 72 2a 29 29 21 3d 30 20 (ap, char*))!=0
5f50: 29 7b 0a 20 20 20 20 69 66 28 20 63 67 69 5f 70 ){. if( cgi_p
5f60: 61 72 61 6d 65 74 65 72 28 7a 32 2c 30 29 21 3d arameter(z2,0)!=
5f70: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 0 ) return 1;.
5f80: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a }. va_end(ap);.
5f90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
5fa0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 *.** Return true
5fb0: 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 71 if all of the q
5fc0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 uery parameters
5fd0: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 in the argument
5fe0: 6c 69 73 74 0a 2a 2a 20 61 72 65 20 64 65 66 69 list.** are defi
5ff0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f ned..*/.int cgi_
6000: 61 6c 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a all(const char *
6010: 7a 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 z, ...){. va_li
6020: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a st ap;. char *z
6030: 32 3b 0a 20 20 69 66 28 20 63 67 69 5f 70 61 72 2;. if( cgi_par
6040: 61 6d 65 74 65 72 28 7a 2c 30 29 3d 3d 30 20 29 ameter(z,0)==0 )
6050: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 61 5f return 0;. va_
6060: 73 74 61 72 74 28 61 70 2c 20 7a 29 3b 0a 20 20 start(ap, z);.
6070: 77 68 69 6c 65 28 20 28 7a 32 20 3d 20 76 61 5f while( (z2 = va_
6080: 61 72 67 28 61 70 2c 20 63 68 61 72 2a 29 29 3d arg(ap, char*))=
6090: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 67 =0 ){. if( cg
60a0: 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 32 2c 30 i_parameter(z2,0
60b0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b )==0 ) return 0;
60c0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 . }. va_end(ap
60d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d );. return 1;.}
60e0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6c ../*.** Print al
60f0: 6c 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 l query paramete
6100: 72 73 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f rs on standard o
6110: 75 74 70 75 74 2e 20 20 46 6f 72 6d 61 74 20 74 utput. Format t
6120: 68 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 he.** parameters
6130: 20 61 73 20 48 54 4d 4c 2e 20 20 54 68 69 73 20 as HTML. This
6140: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 is used for test
6150: 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e ing and debuggin
6160: 67 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 70 g..*/.void cgi_p
6170: 72 69 6e 74 5f 61 6c 6c 28 76 6f 69 64 29 7b 0a rint_all(void){.
6180: 20 20 69 6e 74 20 69 3b 0a 20 20 63 67 69 5f 70 int i;. cgi_p
6190: 61 72 61 6d 65 74 65 72 28 22 22 2c 22 22 29 3b arameter("","");
61a0: 20 20 2f 2a 20 46 6f 72 63 65 20 74 68 65 20 70 /* Force the p
61b0: 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 73 arameters into s
61c0: 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 orted order */.
61d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 55 73 65 for(i=0; i<nUse
61e0: 64 51 50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 dQP; i++){. c
61f0: 67 69 5f 70 72 69 6e 74 66 28 22 25 73 20 3d 20 gi_printf("%s =
6200: 25 73 20 20 3c 62 72 20 2f 3e 5c 6e 22 2c 0a 20 %s <br />\n",.
6210: 20 20 20 20 20 20 68 74 6d 6c 69 7a 65 28 61 50 htmlize(aP
6220: 61 72 61 6d 51 50 5b 69 5d 2e 7a 4e 61 6d 65 2c aramQP[i].zName,
6230: 20 2d 31 29 2c 20 68 74 6d 6c 69 7a 65 28 61 50 -1), htmlize(aP
6240: 61 72 61 6d 51 50 5b 69 5d 2e 7a 56 61 6c 75 65 aramQP[i].zValue
6250: 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f , -1));. }.}../
6260: 2a 0a 2a 2a 20 57 72 69 74 65 20 48 54 4d 4c 20 *.** Write HTML
6270: 74 65 78 74 20 66 6f 72 20 61 6e 20 6f 70 74 69 text for an opti
6280: 6f 6e 20 6d 65 6e 75 20 74 6f 20 73 74 61 6e 64 on menu to stand
6290: 61 72 64 20 6f 75 74 70 75 74 2e 20 20 7a 50 61 ard output. zPa
62a0: 72 61 6d 0a 2a 2a 20 69 73 20 74 68 65 20 71 75 ram.** is the qu
62b0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 74 68 ery parameter th
62c0: 61 74 20 74 68 65 20 6f 70 74 69 6f 6e 20 6d 65 at the option me
62d0: 6e 75 20 73 65 74 73 2e 20 20 7a 44 66 6c 74 20 nu sets. zDflt
62e0: 69 73 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 is the.** initia
62f0: 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f l value of the o
6300: 70 74 69 6f 6e 20 6d 65 6e 75 2e 20 20 41 64 64 ption menu. Add
6310: 69 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 ition arguments
6320: 61 72 65 20 6e 61 6d 65 2f 76 61 6c 75 65 0a 2a are name/value.*
6330: 2a 20 70 61 69 72 73 20 74 68 61 74 20 64 65 66 * pairs that def
6340: 69 6e 65 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 ine values on th
6350: 65 20 6d 65 6e 75 2e 20 20 54 68 65 20 6c 69 73 e menu. The lis
6360: 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 t is terminated
6370: 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 with.** a single
6380: 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a NULL argument..
6390: 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 6f 70 74 69 */.void cgi_opti
63a0: 6f 6e 6d 65 6e 75 28 69 6e 74 20 69 6e 2c 20 63 onmenu(int in, c
63b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 2c 20 63 onst char *zP, c
63c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 2c 20 2e onst char *zD, .
63d0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 ..){. va_list a
63e0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 p;. char *zName
63f0: 2c 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 64 , *zVal;. int d
6400: 66 6c 74 53 65 65 6e 20 3d 20 30 3b 0a 20 20 63 fltSeen = 0;. c
6410: 67 69 5f 70 72 69 6e 74 66 28 22 25 2a 73 3c 73 gi_printf("%*s<s
6420: 65 6c 65 63 74 20 73 69 7a 65 3d 31 20 6e 61 6d elect size=1 nam
6430: 65 3d 5c 22 25 73 5c 22 3e 5c 6e 22 2c 20 69 6e e=\"%s\">\n", in
6440: 2c 20 22 22 2c 20 7a 50 29 3b 0a 20 20 76 61 5f , "", zP);. va_
6450: 73 74 61 72 74 28 61 70 2c 20 7a 44 29 3b 0a 20 start(ap, zD);.
6460: 20 77 68 69 6c 65 28 20 28 7a 4e 61 6d 65 20 3d while( (zName =
6470: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 68 61 72 va_arg(ap, char
6480: 2a 29 29 21 3d 30 20 26 26 20 28 7a 56 61 6c 20 *))!=0 && (zVal
6490: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 68 61 = va_arg(ap, cha
64a0: 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 r*))!=0 ){. i
64b0: 66 28 20 73 74 72 63 6d 70 28 7a 56 61 6c 2c 7a f( strcmp(zVal,z
64c0: 44 29 3d 3d 30 20 29 7b 20 64 66 6c 74 53 65 65 D)==0 ){ dfltSee
64d0: 6e 20 3d 20 31 3b 20 62 72 65 61 6b 3b 20 7d 0a n = 1; break; }.
64e0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 }. va_end(ap)
64f0: 3b 0a 20 20 69 66 28 20 21 64 66 6c 74 53 65 65 ;. if( !dfltSee
6500: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 5b n ){. if( zD[
6510: 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 0] ){. cgi_
6520: 70 72 69 6e 74 66 28 22 25 2a 73 3c 6f 70 74 69 printf("%*s<opti
6530: 6f 6e 20 76 61 6c 75 65 3d 5c 22 25 68 5c 22 20 on value=\"%h\"
6540: 73 65 6c 65 63 74 65 64 3e 25 68 3c 2f 6f 70 74 selected>%h</opt
6550: 69 6f 6e 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 ion>\n",.
6560: 20 69 6e 2b 32 2c 20 22 22 2c 20 7a 44 2c 20 7a in+2, "", zD, z
6570: 44 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 D);. }else{.
6580: 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 cgi_printf(
6590: 22 25 2a 73 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 "%*s<option valu
65a0: 65 3d 5c 22 5c 22 20 73 65 6c 65 63 74 65 64 3e e=\"\" selected>
65b0: 26 6e 62 73 70 3b 3c 2f 6f 70 74 69 6f 6e 3e 5c </option>\
65c0: 6e 22 2c 20 69 6e 2b 32 2c 20 22 22 29 3b 0a 20 n", in+2, "");.
65d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 73 74 }. }. va_st
65e0: 61 72 74 28 61 70 2c 20 7a 44 29 3b 0a 20 20 77 art(ap, zD);. w
65f0: 68 69 6c 65 28 20 28 7a 4e 61 6d 65 20 3d 20 76 hile( (zName = v
6600: 61 5f 61 72 67 28 61 70 2c 20 63 68 61 72 2a 29 a_arg(ap, char*)
6610: 29 21 3d 30 20 26 26 20 28 7a 56 61 6c 20 3d 20 )!=0 && (zVal =
6620: 76 61 5f 61 72 67 28 61 70 2c 20 63 68 61 72 2a va_arg(ap, char*
6630: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 ))!=0 ){. if(
6640: 20 7a 4e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 zName[0] ){.
6650: 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 cgi_printf("%
6660: 2a 73 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d *s<option value=
6670: 5c 22 25 68 5c 22 25 73 3e 25 68 3c 2f 6f 70 74 \"%h\"%s>%h</opt
6680: 69 6f 6e 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 ion>\n",.
6690: 20 69 6e 2b 32 2c 20 22 22 2c 0a 20 20 20 20 20 in+2, "",.
66a0: 20 20 20 7a 56 61 6c 2c 0a 20 20 20 20 20 20 20 zVal,.
66b0: 20 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a 44 strcmp(zVal, zD
66c0: 29 20 3f 20 22 22 20 3a 20 22 20 73 65 6c 65 63 ) ? "" : " selec
66d0: 74 65 64 22 2c 0a 20 20 20 20 20 20 20 20 7a 4e ted",. zN
66e0: 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 ame. );.
66f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 67 }else{. cg
6700: 69 5f 70 72 69 6e 74 66 28 22 25 2a 73 3c 6f 70 i_printf("%*s<op
6710: 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 5c 22 25 tion value=\"\"%
6720: 73 3e 26 6e 62 73 70 3b 3c 2f 6f 70 74 69 6f 6e s> </option
6730: 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 69 6e >\n",. in
6740: 2b 32 2c 20 22 22 2c 0a 20 20 20 20 20 20 20 20 +2, "",.
6750: 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 7a 44 29 strcmp(zVal, zD)
6760: 20 3f 20 22 22 20 3a 20 22 20 73 65 6c 65 63 74 ? "" : " select
6770: 65 64 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 ed". );.
6780: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 }. }. va_end(
6790: 61 70 29 3b 0a 20 20 63 67 69 5f 70 72 69 6e 74 ap);. cgi_print
67a0: 66 28 22 25 2a 73 3c 2f 73 65 6c 65 63 74 3e 5c f("%*s</select>\
67b0: 6e 22 2c 20 69 6e 2c 20 22 22 29 3b 0a 7d 0a 0a n", in, "");.}..
67c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
67d0: 6e 65 20 77 6f 72 6b 73 20 61 20 6c 6f 74 20 6c ne works a lot l
67e0: 69 6b 65 20 63 67 69 5f 6f 70 74 69 6f 6e 6d 65 ike cgi_optionme
67f0: 6e 75 28 29 20 65 78 63 65 70 74 20 74 68 61 74 nu() except that
6800: 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 2a 2a 20 the list of.**
6810: 76 61 6c 75 65 73 20 69 73 20 63 6f 6e 74 61 69 values is contai
6820: 6e 65 64 20 69 6e 20 61 6e 20 61 72 72 61 79 2e ned in an array.
6830: 20 20 41 6c 73 6f 2c 20 74 68 65 20 76 61 6c 75 Also, the valu
6840: 65 73 20 61 72 65 20 6a 75 73 74 20 76 61 6c 75 es are just valu
6850: 65 73 2c 20 6e 6f 74 0a 2a 2a 20 6e 61 6d 65 2f es, not.** name/
6860: 76 61 6c 75 65 20 70 61 69 72 73 20 61 73 20 69 value pairs as i
6870: 6e 20 63 67 69 5f 6f 70 74 69 6f 6e 6d 65 6e 75 n cgi_optionmenu
6880: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 76 5f ..*/.void cgi_v_
6890: 6f 70 74 69 6f 6e 6d 65 6e 75 28 0a 20 20 69 6e optionmenu(. in
68a0: 74 20 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 t in,
68b0: 20 20 20 2f 2a 20 49 6e 64 65 6e 74 20 62 79 20 /* Indent by
68c0: 74 68 69 73 20 61 6d 6f 75 6e 74 20 2a 2f 0a 20 this amount */.
68d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 2c const char *zP,
68e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 /* The que
68f0: 72 79 20 70 61 72 61 6d 65 74 65 72 20 6e 61 6d ry parameter nam
6900: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 e */. const cha
6910: 72 20 2a 7a 44 2c 20 20 20 20 20 20 2f 2a 20 44 r *zD, /* D
6920: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a efault value */.
6930: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 const char **a
6940: 7a 20 20 20 20 20 20 2f 2a 20 4e 55 4c 4c 2d 74 z /* NULL-t
6950: 65 72 6d 69 6e 61 74 65 64 20 6c 69 73 74 20 6f erminated list o
6960: 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 f allowed values
6970: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 */.){. const c
6980: 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 har *zVal;. int
6990: 20 69 3b 0a 20 20 63 67 69 5f 70 72 69 6e 74 66 i;. cgi_printf
69a0: 28 22 25 2a 73 3c 73 65 6c 65 63 74 20 73 69 7a ("%*s<select siz
69b0: 65 3d 31 20 6e 61 6d 65 3d 5c 22 25 73 5c 22 3e e=1 name=\"%s\">
69c0: 5c 6e 22 2c 20 69 6e 2c 20 22 22 2c 20 7a 50 29 \n", in, "", zP)
69d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61 7a 5b ;. for(i=0; az[
69e0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 i]; i++){. if
69f0: 28 20 73 74 72 63 6d 70 28 61 7a 5b 69 5d 2c 7a ( strcmp(az[i],z
6a00: 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 D)==0 ) break;.
6a10: 20 7d 0a 20 20 69 66 28 20 61 7a 5b 69 5d 3d 3d }. if( az[i]==
6a20: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 5b 0 ){. if( zD[
6a30: 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 0]==0 ){. c
6a40: 67 69 5f 70 72 69 6e 74 66 28 22 25 2a 73 3c 6f gi_printf("%*s<o
6a50: 70 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 5c 22 ption value=\"\"
6a60: 20 73 65 6c 65 63 74 65 64 3e 26 6e 62 73 70 3b selected>
6a70: 3c 2f 6f 70 74 69 6f 6e 3e 5c 6e 22 2c 0a 20 20 </option>\n",.
6a80: 20 20 20 20 20 69 6e 2b 32 2c 20 22 22 29 3b 0a in+2, "");.
6a90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
6aa0: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 2a 73 cgi_printf("%*s
6ab0: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 <option value=\"
6ac0: 25 68 5c 22 20 73 65 6c 65 63 74 65 64 3e 25 68 %h\" selected>%h
6ad0: 3c 2f 6f 70 74 69 6f 6e 3e 5c 6e 22 2c 0a 20 20 </option>\n",.
6ae0: 20 20 20 20 20 69 6e 2b 32 2c 20 22 22 2c 20 7a in+2, "", z
6af0: 44 2c 20 7a 44 29 3b 0a 20 20 20 20 7d 0a 20 20 D, zD);. }.
6b00: 7d 0a 20 20 77 68 69 6c 65 28 20 28 7a 56 61 6c }. while( (zVal
6b10: 20 3d 20 2a 28 61 7a 2b 2b 29 29 21 3d 30 20 20 = *(az++))!=0
6b20: 29 7b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 5b ){. if( zVal[
6b30: 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 0] ){. cgi_
6b40: 70 72 69 6e 74 66 28 22 25 2a 73 3c 6f 70 74 69 printf("%*s<opti
6b50: 6f 6e 20 76 61 6c 75 65 3d 5c 22 25 68 5c 22 25 on value=\"%h\"%
6b60: 73 3e 25 68 3c 2f 6f 70 74 69 6f 6e 3e 5c 6e 22 s>%h</option>\n"
6b70: 2c 0a 20 20 20 20 20 20 20 20 69 6e 2b 32 2c 20 ,. in+2,
6b80: 22 22 2c 0a 20 20 20 20 20 20 20 20 7a 56 61 6c "",. zVal
6b90: 2c 0a 20 20 20 20 20 20 20 20 73 74 72 63 6d 70 ,. strcmp
6ba0: 28 7a 56 61 6c 2c 20 7a 44 29 20 3f 20 22 22 20 (zVal, zD) ? ""
6bb0: 3a 20 22 20 73 65 6c 65 63 74 65 64 22 2c 0a 20 : " selected",.
6bc0: 20 20 20 20 20 20 20 7a 56 61 6c 0a 20 20 20 20 zVal.
6bd0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a );. }else{.
6be0: 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 cgi_printf
6bf0: 28 22 25 2a 73 3c 6f 70 74 69 6f 6e 20 76 61 6c ("%*s<option val
6c00: 75 65 3d 5c 22 5c 22 25 73 3e 26 6e 62 73 70 3b ue=\"\"%s>
6c10: 3c 2f 6f 70 74 69 6f 6e 3e 5c 6e 22 2c 0a 20 20 </option>\n",.
6c20: 20 20 20 20 20 20 69 6e 2b 32 2c 20 22 22 2c 0a in+2, "",.
6c30: 20 20 20 20 20 20 20 20 73 74 72 63 6d 70 28 7a strcmp(z
6c40: 56 61 6c 2c 20 7a 44 29 20 3f 20 22 22 20 3a 20 Val, zD) ? "" :
6c50: 22 20 73 65 6c 65 63 74 65 64 22 0a 20 20 20 20 " selected".
6c60: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 );. }. }.
6c70: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 2a 73 cgi_printf("%*s
6c80: 3c 2f 73 65 6c 65 63 74 3e 5c 6e 22 2c 20 69 6e </select>\n", in
6c90: 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 , "");.}../*.**
6ca0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 This routine wor
6cb0: 6b 73 20 61 20 6c 6f 74 20 6c 69 6b 65 20 63 67 ks a lot like cg
6cc0: 69 5f 76 5f 6f 70 74 69 6f 6e 6d 65 6e 75 28 29 i_v_optionmenu()
6cd0: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 except that the
6ce0: 20 6c 69 73 74 0a 2a 2a 20 69 73 20 61 20 6c 69 list.** is a li
6cf0: 73 74 20 6f 66 20 70 61 69 72 73 2e 20 20 54 68 st of pairs. Th
6d00: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 e first element
6d10: 6f 66 20 65 61 63 68 20 70 61 69 72 20 69 73 20 of each pair is
6d20: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 0a 2a the value used.*
6d30: 2a 20 69 6e 74 65 72 6e 61 6c 6c 79 20 61 6e 64 * internally and
6d40: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d the second elem
6d50: 65 6e 74 20 69 73 20 74 68 65 20 76 61 6c 75 65 ent is the value
6d60: 20 64 69 73 70 6c 61 79 65 64 20 74 6f 20 74 68 displayed to th
6d70: 65 20 75 73 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 e user..*/.void
6d80: 63 67 69 5f 76 5f 6f 70 74 69 6f 6e 6d 65 6e 75 cgi_v_optionmenu
6d90: 32 28 0a 20 20 69 6e 74 20 69 6e 2c 20 20 20 20 2(. int in,
6da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 /* Ind
6db0: 65 6e 74 20 62 79 20 74 68 69 73 20 61 6d 6f 75 ent by this amou
6dc0: 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 nt */. const ch
6dd0: 61 72 20 2a 7a 50 2c 20 20 20 20 20 20 2f 2a 20 ar *zP, /*
6de0: 54 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 The query parame
6df0: 74 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f ter name */. co
6e00: 6e 73 74 20 63 68 61 72 20 2a 7a 44 2c 20 20 20 nst char *zD,
6e10: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 /* Default va
6e20: 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 lue */. const c
6e30: 68 61 72 20 2a 2a 61 7a 20 20 20 20 20 20 2f 2a har **az /*
6e40: 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 NULL-terminated
6e50: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 6f 77 65 64 list of allowed
6e60: 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 values */.){.
6e70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c const char *zVal
6e80: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 67 69 ;. int i;. cgi
6e90: 5f 70 72 69 6e 74 66 28 22 25 2a 73 3c 73 65 6c _printf("%*s<sel
6ea0: 65 63 74 20 73 69 7a 65 3d 31 20 6e 61 6d 65 3d ect size=1 name=
6eb0: 5c 22 25 73 5c 22 3e 5c 6e 22 2c 20 69 6e 2c 20 \"%s\">\n", in,
6ec0: 22 22 2c 20 7a 50 29 3b 0a 20 20 66 6f 72 28 69 "", zP);. for(i
6ed0: 3d 30 3b 20 61 7a 5b 69 5d 3b 20 69 2b 3d 32 29 =0; az[i]; i+=2)
6ee0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 {. if( strcmp
6ef0: 28 61 7a 5b 69 5d 2c 7a 44 29 3d 3d 30 20 29 20 (az[i],zD)==0 )
6f00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 break;. }. if(
6f10: 20 61 7a 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 az[i]==0 ){.
6f20: 20 69 66 28 20 7a 44 5b 30 5d 3d 3d 30 20 29 7b if( zD[0]==0 ){
6f30: 0a 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 . cgi_print
6f40: 66 28 22 25 2a 73 3c 6f 70 74 69 6f 6e 20 76 61 f("%*s<option va
6f50: 6c 75 65 3d 5c 22 5c 22 20 73 65 6c 65 63 74 65 lue=\"\" selecte
6f60: 64 3e 26 6e 62 73 70 3b 3c 2f 6f 70 74 69 6f 6e d> </option
6f70: 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 6e 2b >\n",. in+
6f80: 32 2c 20 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 2, "");. }els
6f90: 65 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 72 69 e{. cgi_pri
6fa0: 6e 74 66 28 22 25 2a 73 3c 6f 70 74 69 6f 6e 20 ntf("%*s<option
6fb0: 76 61 6c 75 65 3d 5c 22 25 68 5c 22 20 73 65 6c value=\"%h\" sel
6fc0: 65 63 74 65 64 3e 25 68 3c 2f 6f 70 74 69 6f 6e ected>%h</option
6fd0: 3e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 6e 2b >\n",. in+
6fe0: 32 2c 20 22 22 2c 20 7a 44 2c 20 7a 44 29 3b 0a 2, "", zD, zD);.
6ff0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c }. }. whil
7000: 65 28 20 28 7a 56 61 6c 20 3d 20 2a 28 61 7a 2b e( (zVal = *(az+
7010: 2b 29 29 21 3d 30 20 20 29 7b 0a 20 20 20 20 63 +))!=0 ){. c
7020: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
7030: 20 3d 20 2a 28 61 7a 2b 2b 29 3b 0a 20 20 20 20 = *(az++);.
7040: 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 20 29 7b 0a if( zName[0] ){.
7050: 20 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 cgi_printf
7060: 28 22 25 2a 73 3c 6f 70 74 69 6f 6e 20 76 61 6c ("%*s<option val
7070: 75 65 3d 5c 22 25 68 5c 22 25 73 3e 25 68 3c 2f ue=\"%h\"%s>%h</
7080: 6f 70 74 69 6f 6e 3e 5c 6e 22 2c 0a 20 20 20 20 option>\n",.
7090: 20 20 20 20 69 6e 2b 32 2c 20 22 22 2c 0a 20 20 in+2, "",.
70a0: 20 20 20 20 20 20 7a 56 61 6c 2c 0a 20 20 20 20 zVal,.
70b0: 20 20 20 20 73 74 72 63 6d 70 28 7a 56 61 6c 2c strcmp(zVal,
70c0: 20 7a 44 29 20 3f 20 22 22 20 3a 20 22 20 73 65 zD) ? "" : " se
70d0: 6c 65 63 74 65 64 22 2c 0a 20 20 20 20 20 20 20 lected",.
70e0: 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a zName. );.
70f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
7100: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 25 2a 73 cgi_printf("%*s
7110: 3c 6f 70 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 <option value=\"
7120: 25 68 5c 22 25 73 3e 26 6e 62 73 70 3b 3c 2f 6f %h\"%s> </o
7130: 70 74 69 6f 6e 3e 5c 6e 22 2c 0a 20 20 20 20 20 ption>\n",.
7140: 20 20 20 69 6e 2b 32 2c 20 22 22 2c 0a 20 20 20 in+2, "",.
7150: 20 20 20 20 20 7a 56 61 6c 2c 0a 20 20 20 20 20 zVal,.
7160: 20 20 20 73 74 72 63 6d 70 28 7a 56 61 6c 2c 20 strcmp(zVal,
7170: 7a 44 29 20 3f 20 22 22 20 3a 20 22 20 73 65 6c zD) ? "" : " sel
7180: 65 63 74 65 64 22 0a 20 20 20 20 20 20 29 3b 0a ected". );.
7190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 67 69 5f }. }. cgi_
71a0: 70 72 69 6e 74 66 28 22 25 2a 73 3c 2f 73 65 6c printf("%*s</sel
71b0: 65 63 74 3e 5c 6e 22 2c 20 69 6e 2c 20 22 22 29 ect>\n", in, "")
71c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
71d0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 routine works li
71e0: 6b 65 20 22 70 72 69 6e 74 66 22 20 65 78 63 65 ke "printf" exce
71f0: 70 74 20 74 68 61 74 20 69 74 20 68 61 73 20 74 pt that it has t
7200: 68 65 0a 2a 2a 20 65 78 74 72 61 20 66 6f 72 6d he.** extra form
7210: 61 74 74 69 6e 67 20 63 61 70 61 62 69 6c 69 74 atting capabilit
7220: 69 65 73 20 73 75 63 68 20 61 73 20 25 68 20 61 ies such as %h a
7230: 6e 64 20 25 74 2e 0a 2a 2f 0a 76 6f 69 64 20 63 nd %t..*/.void c
7240: 67 69 5f 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 gi_printf(const
7250: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e char *zFormat, .
7260: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 ..){. va_list a
7270: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 p;. va_start(ap
7280: 2c 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76 78 70 ,zFormat);. vxp
7290: 72 69 6e 74 66 28 70 43 6f 6e 74 65 6e 74 2c 7a rintf(pContent,z
72a0: 46 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 Format,ap);. va
72b0: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a _end(ap);.}../*.
72c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
72d0: 77 6f 72 6b 73 20 6c 69 6b 65 20 22 76 70 72 69 works like "vpri
72e0: 6e 74 66 22 20 65 78 63 65 70 74 20 74 68 61 74 ntf" except that
72f0: 20 69 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 65 it has the.** e
7300: 78 74 72 61 20 66 6f 72 6d 61 74 74 69 6e 67 20 xtra formatting
7310: 63 61 70 61 62 69 6c 69 74 69 65 73 20 73 75 63 capabilities suc
7320: 68 20 61 73 20 25 68 20 61 6e 64 20 25 74 2e 0a h as %h and %t..
7330: 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 76 70 72 69 */.void cgi_vpri
7340: 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ntf(const char *
7350: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 zFormat, va_list
7360: 20 61 70 29 7b 0a 20 20 76 78 70 72 69 6e 74 66 ap){. vxprintf
7370: 28 70 43 6f 6e 74 65 6e 74 2c 7a 46 6f 72 6d 61 (pContent,zForma
7380: 74 2c 61 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a t,ap);.}.../*.**
7390: 20 53 65 6e 64 20 61 20 72 65 70 6c 79 20 69 6e Send a reply in
73a0: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 dicating that th
73b0: 65 20 48 54 54 50 20 72 65 71 75 65 73 74 20 77 e HTTP request w
73c0: 61 73 20 6d 61 6c 66 6f 72 6d 65 64 0a 2a 2f 0a as malformed.*/.
73d0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6c 66 static void malf
73e0: 6f 72 6d 65 64 5f 72 65 71 75 65 73 74 28 76 6f ormed_request(vo
73f0: 69 64 29 7b 0a 20 20 63 67 69 5f 73 65 74 5f 73 id){. cgi_set_s
7400: 74 61 74 75 73 28 35 30 31 2c 20 22 4e 6f 74 20 tatus(501, "Not
7410: 49 6d 70 6c 65 6d 65 6e 74 65 64 22 29 3b 0a 20 Implemented");.
7420: 20 63 67 69 5f 70 72 69 6e 74 66 28 0a 20 20 20 cgi_printf(.
7430: 20 22 3c 68 74 6d 6c 3e 3c 62 6f 64 79 3e 55 6e "<html><body>Un
7440: 72 65 63 6f 67 6e 69 7a 65 64 20 48 54 54 50 20 recognized HTTP
7450: 52 65 71 75 65 73 74 3c 2f 62 6f 64 79 3e 3c 2f Request</body></
7460: 68 74 6d 6c 3e 5c 6e 22 0a 20 20 29 3b 0a 20 20 html>\n". );.
7470: 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20 65 cgi_reply();. e
7480: 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a xit(0);.}../*.**
7490: 20 50 61 6e 69 63 20 61 6e 64 20 64 69 65 20 77 Panic and die w
74a0: 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 hile processing
74b0: 61 20 77 65 62 70 61 67 65 2e 0a 2a 2f 0a 76 6f a webpage..*/.vo
74c0: 69 64 20 63 67 69 5f 70 61 6e 69 63 28 63 6f 6e id cgi_panic(con
74d0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 st char *zFormat
74e0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 , ...){. va_lis
74f0: 74 20 61 70 3b 0a 20 20 63 67 69 5f 72 65 73 65 t ap;. cgi_rese
7500: 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 63 t_content();. c
7510: 67 69 5f 73 65 74 5f 73 74 61 74 75 73 28 35 30 gi_set_status(50
7520: 30 2c 20 22 49 6e 74 65 72 6e 61 6c 20 53 65 72 0, "Internal Ser
7530: 76 65 72 20 45 72 72 6f 72 22 29 3b 0a 20 20 63 ver Error");. c
7540: 67 69 5f 70 72 69 6e 74 66 28 0a 20 20 20 20 22 gi_printf(. "
7550: 3c 68 74 6d 6c 3e 3c 62 6f 64 79 3e 3c 68 31 3e <html><body><h1>
7560: 49 6e 74 65 72 6e 61 6c 20 53 65 72 76 65 72 20 Internal Server
7570: 45 72 72 6f 72 3c 2f 68 31 3e 5c 6e 22 0a 20 20 Error</h1>\n".
7580: 20 20 22 3c 70 6c 61 69 6e 74 65 78 74 3e 22 0a "<plaintext>".
7590: 20 20 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 );. va_start(
75a0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 ap, zFormat);.
75b0: 76 78 70 72 69 6e 74 66 28 70 43 6f 6e 74 65 6e vxprintf(pConten
75c0: 74 2c 7a 46 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 t,zFormat,ap);.
75d0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 63 va_end(ap);. c
75e0: 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20 65 78 gi_reply();. ex
75f0: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 it(1);.}../*.**
7600: 52 65 6d 6f 76 65 20 74 68 65 20 66 69 72 73 74 Remove the first
7610: 20 73 70 61 63 65 2d 64 65 6c 69 6d 69 74 65 64 space-delimited
7620: 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 61 20 73 74 token from a st
7630: 72 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 0a ring and return.
7640: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ** a pointer to
7650: 69 74 2e 20 20 41 64 64 20 61 20 4e 55 4c 4c 20 it. Add a NULL
7660: 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f to the string to
7670: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 terminate the t
7680: 6f 6b 65 6e 2e 0a 2a 2a 20 4d 61 6b 65 20 2a 7a oken..** Make *z
7690: 4c 65 66 74 4f 76 65 72 20 70 6f 69 6e 74 20 74 LeftOver point t
76a0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 o the start of t
76b0: 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a he next token..*
76c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65 /.static char *e
76d0: 78 74 72 61 63 74 5f 74 6f 6b 65 6e 28 63 68 61 xtract_token(cha
76e0: 72 20 2a 7a 49 6e 70 75 74 2c 20 63 68 61 72 20 r *zInput, char
76f0: 2a 2a 7a 4c 65 66 74 4f 76 65 72 29 7b 0a 20 20 **zLeftOver){.
7700: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 char *zResult =
7710: 30 3b 0a 20 20 69 66 28 20 7a 49 6e 70 75 74 3d 0;. if( zInput=
7720: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 4c =0 ){. if( zL
7730: 65 66 74 4f 76 65 72 20 29 20 2a 7a 4c 65 66 74 eftOver ) *zLeft
7740: 4f 76 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 Over = 0;. re
7750: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 77 68 turn 0;. }. wh
7760: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 49 ile( isspace(*zI
7770: 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b nput) ){ zInput+
7780: 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d +; }. zResult =
7790: 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69 6c 65 zInput;. while
77a0: 28 20 2a 7a 49 6e 70 75 74 20 26 26 20 21 69 73 ( *zInput && !is
77b0: 73 70 61 63 65 28 2a 7a 49 6e 70 75 74 29 20 29 space(*zInput) )
77c0: 7b 20 7a 49 6e 70 75 74 2b 2b 3b 20 7d 0a 20 20 { zInput++; }.
77d0: 69 66 28 20 2a 7a 49 6e 70 75 74 20 29 7b 0a 20 if( *zInput ){.
77e0: 20 20 20 2a 7a 49 6e 70 75 74 20 3d 20 30 3b 0a *zInput = 0;.
77f0: 20 20 20 20 7a 49 6e 70 75 74 2b 2b 3b 0a 20 20 zInput++;.
7800: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 while( isspace
7810: 28 2a 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e (*zInput) ){ zIn
7820: 70 75 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 put++; }. }. i
7830: 66 28 20 7a 4c 65 66 74 4f 76 65 72 20 29 7b 20 f( zLeftOver ){
7840: 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 7a 49 6e *zLeftOver = zIn
7850: 70 75 74 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 put; }. return
7860: 7a 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a zResult;.}../*.*
7870: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 * This routine h
7880: 61 6e 64 6c 65 73 20 61 20 73 69 6e 67 6c 65 20 andles a single
7890: 48 54 54 50 20 72 65 71 75 65 73 74 20 77 68 69 HTTP request whi
78a0: 63 68 20 69 73 20 63 6f 6d 69 6e 67 20 69 6e 20 ch is coming in
78b0: 6f 6e 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 on.** standard i
78c0: 6e 70 75 74 20 61 6e 64 20 77 68 69 63 68 20 72 nput and which r
78d0: 65 70 6c 69 65 73 20 6f 6e 20 73 74 61 6e 64 61 eplies on standa
78e0: 72 64 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a rd output..**.**
78f0: 20 54 68 65 20 48 54 54 50 20 72 65 71 75 65 73 The HTTP reques
7900: 74 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 73 t is read from s
7910: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20 61 6e tandard input an
7920: 64 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e 69 d is used to ini
7930: 74 69 61 6c 69 7a 65 0a 2a 2a 20 65 6e 76 69 72 tialize.** envir
7940: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 onment variables
7950: 20 61 73 20 70 65 72 20 43 47 49 2e 20 20 54 68 as per CGI. Th
7960: 65 20 63 67 69 5f 69 6e 69 74 28 29 20 72 6f 75 e cgi_init() rou
7970: 74 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 tine to complete
7980: 0a 2a 2a 20 74 68 65 20 73 65 74 75 70 2e 20 20 .** the setup.
7990: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 73 65 74 Once all the set
79a0: 75 70 20 69 73 20 66 69 6e 69 73 68 65 64 2c 20 up is finished,
79b0: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 this procedure r
79c0: 65 74 75 72 6e 73 0a 2a 2a 20 61 6e 64 20 73 75 eturns.** and su
79d0: 62 73 65 71 75 65 6e 74 20 63 6f 64 65 20 68 61 bsequent code ha
79e0: 6e 64 6c 65 73 20 74 68 65 20 61 63 74 75 61 6c ndles the actual
79f0: 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 generation of t
7a00: 68 65 20 77 65 62 70 61 67 65 2e 0a 2a 2f 0a 76 he webpage..*/.v
7a10: 6f 69 64 20 63 67 69 5f 68 61 6e 64 6c 65 5f 68 oid cgi_handle_h
7a20: 74 74 70 5f 72 65 71 75 65 73 74 28 63 6f 6e 73 ttp_request(cons
7a30: 74 20 63 68 61 72 20 2a 7a 49 70 41 64 64 72 29 t char *zIpAddr)
7a40: 7b 0a 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 54 {. char *z, *zT
7a50: 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 oken;. int i;.
7a60: 20 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 struct sockaddr
7a70: 5f 69 6e 20 72 65 6d 6f 74 65 4e 61 6d 65 3b 0a _in remoteName;.
7a80: 20 20 73 69 7a 65 5f 74 20 73 69 7a 65 20 3d 20 size_t size =
7a90: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 6f sizeof(struct so
7aa0: 63 6b 61 64 64 72 5f 69 6e 29 3b 0a 20 20 63 68 ckaddr_in);. ch
7ab0: 61 72 20 7a 4c 69 6e 65 5b 32 30 30 30 5d 3b 20 ar zLine[2000];
7ac0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 /* A single
7ad0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 2e 20 2a line of input. *
7ae0: 2f 0a 0a 20 20 67 2e 66 75 6c 6c 48 74 74 70 52 /.. g.fullHttpR
7af0: 65 70 6c 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 eply = 1;. if(
7b00: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a fgets(zLine, siz
7b10: 65 6f 66 28 7a 4c 69 6e 65 29 2c 67 2e 68 74 74 eof(zLine),g.htt
7b20: 70 49 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d pIn)==0 ){. m
7b30: 61 6c 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 74 alformed_request
7b40: 28 29 3b 0a 20 20 7d 0a 20 20 7a 54 6f 6b 65 6e ();. }. zToken
7b50: 20 3d 20 65 78 74 72 61 63 74 5f 74 6f 6b 65 6e = extract_token
7b60: 28 7a 4c 69 6e 65 2c 20 26 7a 29 3b 0a 20 20 69 (zLine, &z);. i
7b70: 66 28 20 7a 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a f( zToken==0 ){.
7b80: 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 malformed_re
7b90: 71 75 65 73 74 28 29 3b 0a 20 20 7d 0a 20 20 69 quest();. }. i
7ba0: 66 28 20 73 74 72 63 6d 70 28 7a 54 6f 6b 65 6e f( strcmp(zToken
7bb0: 2c 22 47 45 54 22 29 21 3d 30 20 26 26 20 73 74 ,"GET")!=0 && st
7bc0: 72 63 6d 70 28 7a 54 6f 6b 65 6e 2c 22 50 4f 53 rcmp(zToken,"POS
7bd0: 54 22 29 21 3d 30 0a 20 20 20 20 20 20 26 26 20 T")!=0. &&
7be0: 73 74 72 63 6d 70 28 7a 54 6f 6b 65 6e 2c 22 48 strcmp(zToken,"H
7bf0: 45 41 44 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 EAD")!=0 ){.
7c00: 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 malformed_reques
7c10: 74 28 29 3b 0a 20 20 7d 0a 20 20 63 67 69 5f 73 t();. }. cgi_s
7c20: 65 74 65 6e 76 28 22 47 41 54 45 57 41 59 5f 49 etenv("GATEWAY_I
7c30: 4e 54 45 52 46 41 43 45 22 2c 22 43 47 49 2f 31 NTERFACE","CGI/1
7c40: 2e 30 22 29 3b 0a 20 20 63 67 69 5f 73 65 74 65 .0");. cgi_sete
7c50: 6e 76 28 22 52 45 51 55 45 53 54 5f 4d 45 54 48 nv("REQUEST_METH
7c60: 4f 44 22 2c 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7a OD",zToken);. z
7c70: 54 6f 6b 65 6e 20 3d 20 65 78 74 72 61 63 74 5f Token = extract_
7c80: 74 6f 6b 65 6e 28 7a 2c 20 26 7a 29 3b 0a 20 20 token(z, &z);.
7c90: 69 66 28 20 7a 54 6f 6b 65 6e 3d 3d 30 20 29 7b if( zToken==0 ){
7ca0: 0a 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 . malformed_r
7cb0: 65 71 75 65 73 74 28 29 3b 0a 20 20 7d 0a 20 20 equest();. }.
7cc0: 63 67 69 5f 73 65 74 65 6e 76 28 22 52 45 51 55 cgi_setenv("REQU
7cd0: 45 53 54 5f 55 52 49 22 2c 20 7a 54 6f 6b 65 6e EST_URI", zToken
7ce0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 );. for(i=0; zT
7cf0: 6f 6b 65 6e 5b 69 5d 20 26 26 20 7a 54 6f 6b 65 oken[i] && zToke
7d00: 6e 5b 69 5d 21 3d 27 3f 27 3b 20 69 2b 2b 29 7b n[i]!='?'; i++){
7d10: 7d 0a 20 20 69 66 28 20 7a 54 6f 6b 65 6e 5b 69 }. if( zToken[i
7d20: 5d 20 29 20 7a 54 6f 6b 65 6e 5b 69 2b 2b 5d 20 ] ) zToken[i++]
7d30: 3d 20 30 3b 0a 20 20 63 67 69 5f 73 65 74 65 6e = 0;. cgi_seten
7d40: 76 28 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20 7a v("PATH_INFO", z
7d50: 54 6f 6b 65 6e 29 3b 0a 20 20 63 67 69 5f 73 65 Token);. cgi_se
7d60: 74 65 6e 76 28 22 51 55 45 52 59 5f 53 54 52 49 tenv("QUERY_STRI
7d70: 4e 47 22 2c 20 26 7a 54 6f 6b 65 6e 5b 69 5d 29 NG", &zToken[i])
7d80: 3b 0a 20 20 69 66 28 20 7a 49 70 41 64 64 72 3d ;. if( zIpAddr=
7d90: 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 67 65 =0 &&. ge
7da0: 74 70 65 65 72 6e 61 6d 65 28 66 69 6c 65 6e 6f tpeername(fileno
7db0: 28 67 2e 68 74 74 70 49 6e 29 2c 20 28 73 74 72 (g.httpIn), (str
7dc0: 75 63 74 20 73 6f 63 6b 61 64 64 72 2a 29 26 72 uct sockaddr*)&r
7dd0: 65 6d 6f 74 65 4e 61 6d 65 2c 20 0a 20 20 20 20 emoteName, .
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 6f 63 (soc
7e00: 6b 6c 65 6e 5f 74 2a 29 26 73 69 7a 65 29 3e 3d klen_t*)&size)>=
7e10: 30 0a 20 20 29 7b 0a 20 20 20 20 7a 49 70 41 64 0. ){. zIpAd
7e20: 64 72 20 3d 20 69 6e 65 74 5f 6e 74 6f 61 28 72 dr = inet_ntoa(r
7e30: 65 6d 6f 74 65 4e 61 6d 65 2e 73 69 6e 5f 61 64 emoteName.sin_ad
7e40: 64 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a dr);. }. if( z
7e50: 49 70 41 64 64 72 20 29 7b 20 20 20 0a 20 20 20 IpAddr ){ .
7e60: 20 63 67 69 5f 73 65 74 65 6e 76 28 22 52 45 4d cgi_setenv("REM
7e70: 4f 54 45 5f 41 44 44 52 22 2c 20 7a 49 70 41 64 OTE_ADDR", zIpAd
7e80: 64 72 29 3b 0a 20 20 20 20 67 2e 7a 49 70 41 64 dr);. g.zIpAd
7e90: 64 72 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 dr = mprintf("%s
7ea0: 22 2c 20 7a 49 70 41 64 64 72 29 3b 0a 20 20 7d ", zIpAddr);. }
7eb0: 0a 20 0a 20 20 2f 2a 20 47 65 74 20 61 6c 6c 20 . . /* Get all
7ec0: 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 66 69 65 the optional fie
7ed0: 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 lds that follow
7ee0: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 2e 0a the first line..
7ef0: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 66 67 */. while( fg
7f00: 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 ets(zLine,sizeof
7f10: 28 7a 4c 69 6e 65 29 2c 67 2e 68 74 74 70 49 6e (zLine),g.httpIn
7f20: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a ) ){. char *z
7f30: 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 20 20 63 FieldName;. c
7f40: 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 20 20 20 har *zVal;..
7f50: 7a 46 69 65 6c 64 4e 61 6d 65 20 3d 20 65 78 74 zFieldName = ext
7f60: 72 61 63 74 5f 74 6f 6b 65 6e 28 7a 4c 69 6e 65 ract_token(zLine
7f70: 2c 26 7a 56 61 6c 29 3b 0a 20 20 20 20 69 66 28 ,&zVal);. if(
7f80: 20 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 20 7c zFieldName==0 |
7f90: 7c 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3d 3d 30 | *zFieldName==0
7fa0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 77 68 ) break;. wh
7fb0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 7a 56 ile( isspace(*zV
7fc0: 61 6c 29 20 29 7b 20 7a 56 61 6c 2b 2b 3b 20 7d al) ){ zVal++; }
7fd0: 0a 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 . i = strlen(
7fe0: 7a 56 61 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 zVal);. while
7ff0: 28 20 69 3e 30 20 26 26 20 69 73 73 70 61 63 65 ( i>0 && isspace
8000: 28 7a 56 61 6c 5b 69 2d 31 5d 29 20 29 7b 20 69 (zVal[i-1]) ){ i
8010: 2d 2d 3b 20 7d 0a 20 20 20 20 7a 56 61 6c 5b 69 --; }. zVal[i
8020: 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 ] = 0;. for(i
8030: 3d 30 3b 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 69 =0; zFieldName[i
8040: 5d 3b 20 69 2b 2b 29 7b 20 7a 46 69 65 6c 64 4e ]; i++){ zFieldN
8050: 61 6d 65 5b 69 5d 20 3d 20 74 6f 6c 6f 77 65 72 ame[i] = tolower
8060: 28 7a 46 69 65 6c 64 4e 61 6d 65 5b 69 5d 29 3b (zFieldName[i]);
8070: 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d }. if( strcm
8080: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 73 p(zFieldName,"us
8090: 65 72 2d 61 67 65 6e 74 3a 22 29 3d 3d 30 20 29 er-agent:")==0 )
80a0: 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74 65 {. cgi_sete
80b0: 6e 76 28 22 48 54 54 50 5f 55 53 45 52 5f 41 47 nv("HTTP_USER_AG
80c0: 45 4e 54 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 ENT", zVal);.
80d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d }else if( strcm
80e0: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 63 6f p(zFieldName,"co
80f0: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d ntent-length:")=
8100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f =0 ){. cgi_
8110: 73 65 74 65 6e 76 28 22 43 4f 4e 54 45 4e 54 5f setenv("CONTENT_
8120: 4c 45 4e 47 54 48 22 2c 20 7a 56 61 6c 29 3b 0a LENGTH", zVal);.
8130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 }else if( st
8140: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c rcmp(zFieldName,
8150: 22 72 65 66 65 72 65 72 3a 22 29 3d 3d 30 20 29 "referer:")==0 )
8160: 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74 65 {. cgi_sete
8170: 6e 76 28 22 48 54 54 50 5f 52 45 46 45 52 45 52 nv("HTTP_REFERER
8180: 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 ", zVal);. }e
8190: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a lse if( strcmp(z
81a0: 46 69 65 6c 64 4e 61 6d 65 2c 22 68 6f 73 74 3a FieldName,"host:
81b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 ")==0 ){. c
81c0: 67 69 5f 73 65 74 65 6e 76 28 22 48 54 54 50 5f gi_setenv("HTTP_
81d0: 48 4f 53 54 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 HOST", zVal);.
81e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 }else if( strc
81f0: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 63 mp(zFieldName,"c
8200: 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 22 29 3d 3d ontent-type:")==
8210: 30 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 0 ){. cgi_s
8220: 65 74 65 6e 76 28 22 43 4f 4e 54 45 4e 54 5f 54 etenv("CONTENT_T
8230: 59 50 45 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 YPE", zVal);.
8240: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d }else if( strcm
8250: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 63 6f p(zFieldName,"co
8260: 6f 6b 69 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 okie:")==0 ){.
8270: 20 20 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 cgi_setenv("
8280: 48 54 54 50 5f 43 4f 4f 4b 49 45 22 2c 20 7a 56 HTTP_COOKIE", zV
8290: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 al);. }else i
82a0: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 f( strcmp(zField
82b0: 4e 61 6d 65 2c 22 69 66 2d 6e 6f 6e 65 2d 6d 61 Name,"if-none-ma
82c0: 74 63 68 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 tch:")==0 ){.
82d0: 20 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 48 cgi_setenv("H
82e0: 54 54 50 5f 49 46 5f 4e 4f 4e 45 5f 4d 41 54 43 TTP_IF_NONE_MATC
82f0: 48 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 7d H", zVal);. }
8300: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 else if( strcmp(
8310: 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 69 66 2d 6d zFieldName,"if-m
8320: 6f 64 69 66 69 65 64 2d 73 69 6e 63 65 3a 22 29 odified-since:")
8330: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 67 69 ==0 ){. cgi
8340: 5f 73 65 74 65 6e 76 28 22 48 54 54 50 5f 49 46 _setenv("HTTP_IF
8350: 5f 4d 4f 44 49 46 49 45 44 5f 53 49 4e 43 45 22 _MODIFIED_SINCE"
8360: 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 , zVal);. }.
8370: 20 7d 0a 0a 20 20 63 67 69 5f 69 6e 69 74 28 29 }.. cgi_init()
8380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d ;.}../*.** Maxim
8390: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 69 um number of chi
83a0: 6c 64 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 ld processes tha
83b0: 74 20 77 65 20 63 61 6e 20 68 61 76 65 20 72 75 t we can have ru
83c0: 6e 6e 69 6e 67 0a 2a 2a 20 61 74 20 6f 6e 65 20 nning.** at one
83d0: 74 69 6d 65 20 62 65 66 6f 72 65 20 77 65 20 73 time before we s
83e0: 74 61 72 74 20 73 6c 6f 77 69 6e 67 20 74 68 69 tart slowing thi
83f0: 6e 67 73 20 64 6f 77 6e 2e 0a 2a 2f 0a 23 64 65 ngs down..*/.#de
8400: 66 69 6e 65 20 4d 41 58 5f 50 41 52 41 4c 4c 45 fine MAX_PARALLE
8410: 4c 20 32 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 L 2../*.** Imple
8420: 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 ment an HTTP ser
8430: 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65 ver daemon liste
8440: 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f ning on port iPo
8450: 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 rt..**.** As new
8460: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72 connections arr
8470: 69 76 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c ive, fork a chil
8480: 64 20 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20 d and let child
8490: 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 return.** out of
84a0: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 this procedure
84b0: 63 61 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64 call. The child
84c0: 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 will handle the
84d0: 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65 request..** The
84e0: 20 70 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65 parent never re
84f0: 74 75 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 turns from this
8500: 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a procedure..**.**
8510: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63 Return 0 to eac
8520: 68 20 63 68 69 6c 64 20 61 73 20 69 74 20 72 75 h child as it ru
8530: 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 ns. If unable t
8540: 6f 20 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a o establish a.**
8550: 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 listening socke
8560: 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 t, return non-ze
8570: 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f 68 ro..*/.int cgi_h
8580: 74 74 70 5f 73 65 72 76 65 72 28 69 6e 74 20 6d ttp_server(int m
8590: 6e 50 6f 72 74 2c 20 69 6e 74 20 6d 78 50 6f 72 nPort, int mxPor
85a0: 74 2c 20 63 68 61 72 20 2a 7a 42 72 6f 77 73 65 t, char *zBrowse
85b0: 72 29 7b 0a 23 69 66 64 65 66 20 5f 5f 4d 49 4e r){.#ifdef __MIN
85c0: 47 57 33 32 5f 5f 0a 20 20 2f 2a 20 55 73 65 20 GW32__. /* Use
85d0: 77 69 6e 33 32 5f 68 74 74 70 5f 73 65 72 76 65 win32_http_serve
85e0: 72 28 29 20 69 6e 73 74 65 61 64 20 2a 2f 0a 20 r() instead */.
85f0: 20 65 78 69 74 28 31 29 3b 0a 23 65 6c 73 65 0a exit(1);.#else.
8600: 20 20 69 6e 74 20 6c 69 73 74 65 6e 65 72 3b 20 int listener;
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
8620: 2a 20 54 68 65 20 73 65 72 76 65 72 20 73 6f 63 * The server soc
8630: 6b 65 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e ket */. int con
8640: 6e 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 nection;
8650: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 63 6b 65 /* A socke
8660: 74 20 66 6f 72 20 65 61 63 68 20 69 6e 64 69 76 t for each indiv
8670: 69 64 75 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e idual connection
8680: 20 2a 2f 0a 20 20 66 64 5f 73 65 74 20 72 65 61 */. fd_set rea
8690: 64 66 64 73 3b 20 20 20 20 20 20 20 20 20 20 20 dfds;
86a0: 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 66 69 6c /* Set of fil
86b0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f e descriptors fo
86c0: 72 20 73 65 6c 65 63 74 28 29 20 2a 2f 0a 20 20 r select() */.
86d0: 73 69 7a 65 5f 74 20 6c 65 6e 61 64 64 72 3b 20 size_t lenaddr;
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
86f0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 69 6e Length of the in
8700: 61 64 64 72 20 73 74 72 75 63 74 75 72 65 20 2a addr structure *
8710: 2f 0a 20 20 69 6e 74 20 63 68 69 6c 64 3b 20 20 /. int child;
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8730: 20 2f 2a 20 50 49 44 20 6f 66 20 74 68 65 20 63 /* PID of the c
8740: 68 69 6c 64 20 70 72 6f 63 65 73 73 20 2a 2f 0a hild process */.
8750: 20 20 69 6e 74 20 6e 63 68 69 6c 64 72 65 6e 20 int nchildren
8760: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f = 0; /
8770: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c * Number of chil
8780: 64 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20 d processes */.
8790: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 struct timeval
87a0: 64 65 6c 61 79 3b 20 20 20 20 20 20 20 20 2f 2a delay; /*
87b0: 20 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 77 61 69 How long to wai
87c0: 74 20 69 6e 73 69 64 65 20 73 65 6c 65 63 74 28 t inside select(
87d0: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 6f ) */. struct so
87e0: 63 6b 61 64 64 72 5f 69 6e 20 69 6e 61 64 64 72 ckaddr_in inaddr
87f0: 3b 20 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 ; /* The socke
8800: 74 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 69 t address */. i
8810: 6e 74 20 6f 70 74 20 3d 20 31 3b 20 20 20 20 20 nt opt = 1;
8820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 /* s
8830: 65 74 73 6f 63 6b 6f 70 74 20 66 6c 61 67 20 2a etsockopt flag *
8840: 2f 0a 20 20 69 6e 74 20 69 50 6f 72 74 20 3d 20 /. int iPort =
8850: 6d 6e 50 6f 72 74 3b 0a 0a 20 20 77 68 69 6c 65 mnPort;.. while
8860: 28 20 69 50 6f 72 74 3c 3d 6d 78 50 6f 72 74 20 ( iPort<=mxPort
8870: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 ){. memset(&i
8880: 6e 61 64 64 72 2c 20 30 2c 20 73 69 7a 65 6f 66 naddr, 0, sizeof
8890: 28 69 6e 61 64 64 72 29 29 3b 0a 20 20 20 20 69 (inaddr));. i
88a0: 6e 61 64 64 72 2e 73 69 6e 5f 66 61 6d 69 6c 79 naddr.sin_family
88b0: 20 3d 20 41 46 5f 49 4e 45 54 3b 0a 20 20 20 20 = AF_INET;.
88c0: 69 6e 61 64 64 72 2e 73 69 6e 5f 61 64 64 72 2e inaddr.sin_addr.
88d0: 73 5f 61 64 64 72 20 3d 20 49 4e 41 44 44 52 5f s_addr = INADDR_
88e0: 41 4e 59 3b 0a 20 20 20 20 69 6e 61 64 64 72 2e ANY;. inaddr.
88f0: 73 69 6e 5f 70 6f 72 74 20 3d 20 68 74 6f 6e 73 sin_port = htons
8900: 28 69 50 6f 72 74 29 3b 0a 20 20 20 20 6c 69 73 (iPort);. lis
8910: 74 65 6e 65 72 20 3d 20 73 6f 63 6b 65 74 28 41 tener = socket(A
8920: 46 5f 49 4e 45 54 2c 20 53 4f 43 4b 5f 53 54 52 F_INET, SOCK_STR
8930: 45 41 4d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 EAM, 0);. if(
8940: 20 6c 69 73 74 65 6e 65 72 3c 30 20 29 7b 0a 20 listener<0 ){.
8950: 20 20 20 20 20 69 50 6f 72 74 2b 2b 3b 0a 20 20 iPort++;.
8960: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 continue;.
8970: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 69 66 20 77 }.. /* if w
8980: 65 20 63 61 6e 27 74 20 74 65 72 6d 69 6e 61 74 e can't terminat
8990: 65 20 6e 69 63 65 6c 79 2c 20 61 74 20 6c 65 61 e nicely, at lea
89a0: 73 74 20 61 6c 6c 6f 77 20 74 68 65 20 73 6f 63 st allow the soc
89b0: 6b 65 74 20 74 6f 20 62 65 20 72 65 75 73 65 64 ket to be reused
89c0: 20 2a 2f 0a 20 20 20 20 73 65 74 73 6f 63 6b 6f */. setsocko
89d0: 70 74 28 6c 69 73 74 65 6e 65 72 2c 53 4f 4c 5f pt(listener,SOL_
89e0: 53 4f 43 4b 45 54 2c 53 4f 5f 52 45 55 53 45 41 SOCKET,SO_REUSEA
89f0: 44 44 52 2c 26 6f 70 74 2c 73 69 7a 65 6f 66 28 DDR,&opt,sizeof(
8a00: 6f 70 74 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 opt));.. if(
8a10: 62 69 6e 64 28 6c 69 73 74 65 6e 65 72 2c 20 28 bind(listener, (
8a20: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 2a struct sockaddr*
8a30: 29 26 69 6e 61 64 64 72 2c 20 73 69 7a 65 6f 66 )&inaddr, sizeof
8a40: 28 69 6e 61 64 64 72 29 29 3c 30 20 29 7b 0a 20 (inaddr))<0 ){.
8a50: 20 20 20 20 20 63 6c 6f 73 65 28 6c 69 73 74 65 close(liste
8a60: 6e 65 72 29 3b 0a 20 20 20 20 20 20 69 50 6f 72 ner);. iPor
8a70: 74 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 t++;. conti
8a80: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 nue;. }. b
8a90: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 reak;. }. if(
8aa0: 69 50 6f 72 74 3e 6d 78 50 6f 72 74 20 29 7b 0a iPort>mxPort ){.
8ab0: 20 20 20 20 69 66 28 20 6d 6e 50 6f 72 74 3d 3d if( mnPort==
8ac0: 6d 78 50 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 mxPort ){.
8ad0: 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 6e fossil_fatal("un
8ae0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 6c 69 73 able to open lis
8af0: 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 20 6f 6e tening socket on
8b00: 20 70 6f 72 74 73 20 25 64 22 2c 20 6d 6e 50 6f ports %d", mnPo
8b10: 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a rt);. }else{.
8b20: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 fossil_fat
8b30: 61 6c 28 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 al("unable to op
8b40: 65 6e 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 en listening soc
8b50: 6b 65 74 20 6f 6e 20 61 6e 79 22 0a 20 20 20 20 ket on any".
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
8b70: 20 70 6f 72 74 20 69 6e 20 74 68 65 20 72 61 6e port in the ran
8b80: 67 65 20 25 64 2e 2e 25 64 22 2c 20 6d 6e 50 6f ge %d..%d", mnPo
8b90: 72 74 2c 20 6d 78 50 6f 72 74 29 3b 0a 20 20 20 rt, mxPort);.
8ba0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 50 6f }. }. if( iPo
8bb0: 72 74 3e 6d 78 50 6f 72 74 20 29 20 72 65 74 75 rt>mxPort ) retu
8bc0: 72 6e 20 31 3b 0a 20 20 6c 69 73 74 65 6e 28 6c rn 1;. listen(l
8bd0: 69 73 74 65 6e 65 72 2c 31 30 29 3b 0a 20 20 69 istener,10);. i
8be0: 66 28 20 69 50 6f 72 74 3e 6d 6e 50 6f 72 74 20 f( iPort>mnPort
8bf0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 4c ){. printf("L
8c00: 69 73 74 65 6e 69 6e 67 20 66 6f 72 20 48 54 54 istening for HTT
8c10: 50 20 72 65 71 75 65 73 74 73 20 6f 6e 20 54 43 P requests on TC
8c20: 50 20 70 6f 72 74 20 25 64 5c 6e 22 2c 20 69 50 P port %d\n", iP
8c30: 6f 72 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 ort);. fflush
8c40: 28 73 74 64 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 (stdout);. }.
8c50: 69 66 28 20 7a 42 72 6f 77 73 65 72 20 29 7b 0a if( zBrowser ){.
8c60: 20 20 20 20 7a 42 72 6f 77 73 65 72 20 3d 20 6d zBrowser = m
8c70: 70 72 69 6e 74 66 28 7a 42 72 6f 77 73 65 72 2c printf(zBrowser,
8c80: 20 69 50 6f 72 74 29 3b 0a 20 20 20 20 73 79 73 iPort);. sys
8c90: 74 65 6d 28 7a 42 72 6f 77 73 65 72 29 3b 0a 20 tem(zBrowser);.
8ca0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b }. while( 1 ){
8cb0: 0a 20 20 20 20 69 66 28 20 6e 63 68 69 6c 64 72 . if( nchildr
8cc0: 65 6e 3e 4d 41 58 5f 50 41 52 41 4c 4c 45 4c 20 en>MAX_PARALLEL
8cd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6c 6f 77 ){. /* Slow
8ce0: 20 64 6f 77 6e 20 69 66 20 63 6f 6e 6e 65 63 74 down if connect
8cf0: 69 6f 6e 73 20 61 72 65 20 61 72 72 69 76 69 6e ions are arrivin
8d00: 67 20 74 6f 6f 20 66 61 73 74 20 2a 2f 0a 20 20 g too fast */.
8d10: 20 20 20 20 73 6c 65 65 70 28 20 6e 63 68 69 6c sleep( nchil
8d20: 64 72 65 6e 2d 4d 41 58 5f 50 41 52 41 4c 4c 45 dren-MAX_PARALLE
8d30: 4c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 L );. }. d
8d40: 65 6c 61 79 2e 74 76 5f 73 65 63 20 3d 20 36 30 elay.tv_sec = 60
8d50: 3b 0a 20 20 20 20 64 65 6c 61 79 2e 74 76 5f 75 ;. delay.tv_u
8d60: 73 65 63 20 3d 20 30 3b 0a 20 20 20 20 46 44 5f sec = 0;. FD_
8d70: 5a 45 52 4f 28 26 72 65 61 64 66 64 73 29 3b 0a ZERO(&readfds);.
8d80: 20 20 20 20 46 44 5f 53 45 54 28 20 6c 69 73 74 FD_SET( list
8d90: 65 6e 65 72 2c 20 26 72 65 61 64 66 64 73 29 3b ener, &readfds);
8da0: 0a 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 28 . if( select(
8db0: 20 6c 69 73 74 65 6e 65 72 2b 31 2c 20 26 72 65 listener+1, &re
8dc0: 61 64 66 64 73 2c 20 30 2c 20 30 2c 20 26 64 65 adfds, 0, 0, &de
8dd0: 6c 61 79 29 20 29 7b 0a 20 20 20 20 20 20 6c 65 lay) ){. le
8de0: 6e 61 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 naddr = sizeof(i
8df0: 6e 61 64 64 72 29 3b 0a 20 20 20 20 20 20 63 6f naddr);. co
8e00: 6e 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70 nnection = accep
8e10: 74 28 6c 69 73 74 65 6e 65 72 2c 20 28 73 74 72 t(listener, (str
8e20: 75 63 74 20 73 6f 63 6b 61 64 64 72 2a 29 26 69 uct sockaddr*)&i
8e30: 6e 61 64 64 72 2c 0a 20 20 20 20 20 20 20 20 20 naddr,.
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e50: 20 20 20 20 20 20 20 20 20 20 20 28 73 6f 63 6b (sock
8e60: 6c 65 6e 5f 74 2a 29 20 26 6c 65 6e 61 64 64 72 len_t*) &lenaddr
8e70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e );. if( con
8e80: 6e 65 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 nection>=0 ){.
8e90: 20 20 20 20 20 20 63 68 69 6c 64 20 3d 20 66 6f child = fo
8ea0: 72 6b 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 rk();. if
8eb0: 28 20 63 68 69 6c 64 21 3d 30 20 29 7b 0a 20 20 ( child!=0 ){.
8ec0: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 69 6c if( chil
8ed0: 64 3e 30 20 29 20 6e 63 68 69 6c 64 72 65 6e 2b d>0 ) nchildren+
8ee0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f +;. clo
8ef0: 73 65 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a se(connection);.
8f00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
8f10: 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 30 close(0
8f20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 75 70 );. dup
8f30: 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 (connection);.
8f40: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 31 29 close(1)
8f50: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 75 70 28 ;. dup(
8f60: 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 connection);.
8f70: 20 20 20 20 20 20 20 69 66 28 20 21 67 2e 66 48 if( !g.fH
8f80: 74 74 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 ttpTrace ){.
8f90: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 32 29 close(2)
8fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 75 ;. du
8fb0: 70 28 63 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 p(connection);.
8fc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
8fd0: 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e 65 close(conne
8fe0: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 ction);.
8ff0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 return 0;.
9000: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
9010: 20 20 7d 0a 20 20 20 20 2f 2a 20 42 75 72 79 20 }. /* Bury
9020: 64 65 61 64 20 63 68 69 6c 64 72 65 6e 20 2a 2f dead children */
9030: 0a 20 20 20 20 77 68 69 6c 65 28 20 77 61 69 74 . while( wait
9040: 70 69 64 28 30 2c 20 30 2c 20 57 4e 4f 48 41 4e pid(0, 0, WNOHAN
9050: 47 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 63 G)>0 ){. nc
9060: 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 7d hildren--;. }
9070: 0a 20 20 7d 0a 20 20 2f 2a 20 4e 4f 54 20 52 45 . }. /* NOT RE
9080: 41 43 48 45 44 20 2a 2f 20 20 0a 20 20 65 78 69 ACHED */ . exi
9090: 74 28 31 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a t(1);.#endif.}..
90a0: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 64 ./*.** Name of d
90b0: 61 79 73 20 61 6e 64 20 6d 6f 6e 74 68 73 2e 0a ays and months..
90c0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 */.static const
90d0: 63 68 61 72 20 2a 61 7a 44 61 79 73 5b 5d 20 3d char *azDays[] =
90e0: 0a 20 20 20 20 7b 22 53 75 6e 22 2c 20 22 4d 6f . {"Sun", "Mo
90f0: 6e 22 2c 20 22 54 75 65 22 2c 20 22 57 65 64 22 n", "Tue", "Wed"
9100: 2c 20 22 54 68 75 22 2c 20 22 46 72 69 22 2c 20 , "Thu", "Fri",
9110: 22 53 61 74 22 2c 20 30 7d 3b 0a 73 74 61 74 69 "Sat", 0};.stati
9120: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a c const char *az
9130: 4d 6f 6e 74 68 73 5b 5d 20 3d 0a 20 20 20 20 7b Months[] =. {
9140: 22 4a 61 6e 22 2c 20 22 46 65 62 22 2c 20 22 4d "Jan", "Feb", "M
9150: 61 72 22 2c 20 22 41 70 72 22 2c 20 22 4d 61 79 ar", "Apr", "May
9160: 22 2c 20 22 4a 75 6e 22 2c 0a 20 20 20 20 20 22 ", "Jun",. "
9170: 4a 75 6c 22 2c 20 22 41 75 67 22 2c 20 22 53 65 Jul", "Aug", "Se
9180: 70 22 2c 20 22 4f 63 74 22 2c 20 22 4e 6f 76 22 p", "Oct", "Nov"
9190: 2c 20 22 44 65 63 22 2c 20 30 7d 3b 0a 0a 0a 2f , "Dec", 0};.../
91a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 6e 20 *.** Returns an
91b0: 52 46 43 38 32 32 2d 66 6f 72 6d 61 74 74 65 64 RFC822-formatted
91c0: 20 74 69 6d 65 20 73 74 72 69 6e 67 20 73 75 69 time string sui
91d0: 74 61 62 6c 65 20 66 6f 72 20 48 54 54 50 20 68 table for HTTP h
91e0: 65 61 64 65 72 73 2c 20 61 6d 6f 6e 67 0a 2a 2a eaders, among.**
91f0: 20 6f 74 68 65 72 20 74 68 69 6e 67 73 2e 0a 2a other things..*
9200: 2a 20 52 65 74 75 72 6e 65 64 20 74 69 6d 65 7a * Returned timez
9210: 6f 6e 65 20 69 73 20 61 6c 77 61 79 73 20 47 4d one is always GM
9220: 54 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 T as required by
9230: 20 48 54 54 50 2f 31 2e 31 20 73 70 65 63 69 66 HTTP/1.1 specif
9240: 69 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 ication..** The
9250: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 returned string
9260: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 74 is allocated wit
9270: 68 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d h malloc() and m
9280: 75 73 74 20 62 65 20 66 72 65 65 64 0a 2a 2a 20 ust be freed.**
9290: 77 69 74 68 20 66 72 65 65 28 29 2e 0a 2a 2a 0a with free()..**.
92a0: 2a 2a 20 53 65 65 20 68 74 74 70 3a 2f 2f 77 77 ** See http://ww
92b0: 77 2e 66 61 71 73 2e 6f 72 67 2f 72 66 63 73 2f w.faqs.org/rfcs/
92c0: 72 66 63 38 32 32 2e 68 74 6d 6c 2c 20 73 65 63 rfc822.html, sec
92d0: 74 69 6f 6e 20 35 0a 2a 2a 20 61 6e 64 20 68 74 tion 5.** and ht
92e0: 74 70 3a 2f 2f 77 77 77 2e 66 61 71 73 2e 6f 72 tp://www.faqs.or
92f0: 67 2f 72 66 63 73 2f 72 66 63 32 36 31 36 2e 68 g/rfcs/rfc2616.h
9300: 74 6d 6c 2c 20 73 65 63 74 69 6f 6e 20 33 2e 33 tml, section 3.3
9310: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 63 67 69 5f 72 ..*/.char *cgi_r
9320: 66 63 38 32 32 5f 64 61 74 65 73 74 61 6d 70 28 fc822_datestamp(
9330: 74 69 6d 65 5f 74 20 6e 6f 77 29 7b 0a 20 20 73 time_t now){. s
9340: 74 72 75 63 74 20 74 6d 20 2a 70 54 6d 3b 0a 20 truct tm *pTm;.
9350: 20 70 54 6d 20 3d 20 67 6d 74 69 6d 65 28 26 6e pTm = gmtime(&n
9360: 6f 77 29 3b 0a 20 20 69 66 28 20 70 54 6d 3d 3d ow);. if( pTm==
9370: 30 20 29 20 72 65 74 75 72 6e 20 22 22 3b 0a 20 0 ) return "";.
9380: 20 72 65 74 75 72 6e 20 6d 70 72 69 6e 74 66 28 return mprintf(
9390: 22 25 73 2c 20 25 64 20 25 73 20 25 30 32 64 20 "%s, %d %s %02d
93a0: 25 30 32 64 3a 25 30 32 64 3a 25 30 32 64 20 47 %02d:%02d:%02d G
93b0: 4d 54 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 MT",.
93c0: 20 20 20 20 20 20 61 7a 44 61 79 73 5b 70 54 6d azDays[pTm
93d0: 2d 3e 74 6d 5f 77 64 61 79 5d 2c 20 70 54 6d 2d ->tm_wday], pTm-
93e0: 3e 74 6d 5f 6d 64 61 79 2c 20 61 7a 4d 6f 6e 74 >tm_mday, azMont
93f0: 68 73 5b 70 54 6d 2d 3e 74 6d 5f 6d 6f 6e 5d 2c hs[pTm->tm_mon],
9400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
9410: 20 20 70 54 6d 2d 3e 74 6d 5f 79 65 61 72 2b 31 pTm->tm_year+1
9420: 39 30 30 2c 20 70 54 6d 2d 3e 74 6d 5f 68 6f 75 900, pTm->tm_hou
9430: 72 2c 20 70 54 6d 2d 3e 74 6d 5f 6d 69 6e 2c 20 r, pTm->tm_min,
9440: 70 54 6d 2d 3e 74 6d 5f 73 65 63 29 3b 0a 7d 0a pTm->tm_sec);.}.
9450: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 6e 20 ./*.** Parse an
9460: 52 46 43 38 32 32 2d 66 6f 72 6d 61 74 74 65 64 RFC822-formatted
9470: 20 74 69 6d 65 73 74 61 6d 70 20 61 73 20 77 65 timestamp as we
9480: 27 64 20 65 78 70 65 63 74 20 66 72 6f 6d 20 48 'd expect from H
9490: 54 54 50 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a TTP and return.*
94a0: 2a 20 61 20 55 6e 69 78 20 65 70 6f 63 68 20 74 * a Unix epoch t
94b0: 69 6d 65 2e 20 3c 3d 20 7a 65 72 6f 20 69 73 20 ime. <= zero is
94c0: 72 65 74 75 72 6e 65 64 20 6f 6e 20 66 61 69 6c returned on fail
94d0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 ure..**.** Note
94e0: 74 68 61 74 20 74 68 69 73 20 77 6f 6e 27 74 20 that this won't
94f0: 68 61 6e 64 6c 65 20 61 6c 6c 20 74 68 65 20 5f handle all the _
9500: 61 6c 6c 6f 77 65 64 5f 20 48 54 54 50 20 66 6f allowed_ HTTP fo
9510: 72 6d 61 74 73 2c 20 6a 75 73 74 20 74 68 65 0a rmats, just the.
9520: 2a 2a 20 6d 6f 73 74 20 70 6f 70 75 6c 61 72 20 ** most popular
9530: 6f 6e 65 20 28 74 68 65 20 6f 6e 65 20 67 65 6e one (the one gen
9540: 65 72 61 74 65 64 20 62 79 20 63 67 69 5f 72 66 erated by cgi_rf
9550: 63 38 32 32 5f 64 61 74 65 73 74 61 6d 70 28 29 c822_datestamp()
9560: 2c 20 61 63 74 75 61 6c 6c 79 29 2e 0a 2a 2f 0a , actually)..*/.
9570: 74 69 6d 65 5f 74 20 63 67 69 5f 72 66 63 38 32 time_t cgi_rfc82
9580: 32 5f 70 61 72 73 65 64 61 74 65 28 63 6f 6e 73 2_parsedate(cons
9590: 74 20 63 68 61 72 20 2a 7a 44 61 74 65 29 7b 0a t char *zDate){.
95a0: 20 20 73 74 72 75 63 74 20 74 6d 20 74 3b 0a 20 struct tm t;.
95b0: 20 63 68 61 72 20 7a 49 67 6e 6f 72 65 5b 31 36 char zIgnore[16
95c0: 5d 3b 0a 20 20 63 68 61 72 20 7a 4d 6f 6e 74 68 ];. char zMonth
95d0: 5b 31 36 5d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 [16];.. memset(
95e0: 26 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 29 &t, 0, sizeof(t)
95f0: 29 3b 0a 20 20 69 66 28 20 37 3d 3d 73 73 63 61 );. if( 7==ssca
9600: 6e 66 28 7a 44 61 74 65 2c 20 22 25 31 32 5b 41 nf(zDate, "%12[A
9610: 2d 5a 61 2d 7a 2c 5d 20 25 64 20 25 31 32 5b 41 -Za-z,] %d %12[A
9620: 2d 5a 61 2d 7a 5d 20 25 64 20 25 64 3a 25 64 3a -Za-z] %d %d:%d:
9630: 25 64 22 2c 20 7a 49 67 6e 6f 72 65 2c 0a 20 20 %d", zIgnore,.
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9650: 20 20 20 20 20 26 74 2e 74 6d 5f 6d 64 61 79 2c &t.tm_mday,
9660: 20 7a 4d 6f 6e 74 68 2c 20 26 74 2e 74 6d 5f 79 zMonth, &t.tm_y
9670: 65 61 72 2c 20 26 74 2e 74 6d 5f 68 6f 75 72 2c ear, &t.tm_hour,
9680: 20 26 74 2e 74 6d 5f 6d 69 6e 2c 0a 20 20 20 20 &t.tm_min,.
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
96a0: 20 20 20 26 74 2e 74 6d 5f 73 65 63 29 29 7b 0a &t.tm_sec)){.
96b0: 0a 20 20 20 20 69 66 28 20 74 2e 74 6d 5f 79 65 . if( t.tm_ye
96c0: 61 72 20 3e 20 31 39 30 30 20 29 20 74 2e 74 6d ar > 1900 ) t.tm
96d0: 5f 79 65 61 72 20 2d 3d 20 31 39 30 30 3b 0a 20 _year -= 1900;.
96e0: 20 20 20 66 6f 72 28 74 2e 74 6d 5f 6d 6f 6e 3d for(t.tm_mon=
96f0: 30 3b 20 61 7a 4d 6f 6e 74 68 73 5b 74 2e 74 6d 0; azMonths[t.tm
9700: 5f 6d 6f 6e 5d 3b 20 74 2e 74 6d 5f 6d 6f 6e 2b _mon]; t.tm_mon+
9710: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73 +){. if( !s
9720: 74 72 6e 63 61 73 65 63 6d 70 28 20 61 7a 4d 6f trncasecmp( azMo
9730: 6e 74 68 73 5b 74 2e 74 6d 5f 6d 6f 6e 5d 2c 20 nths[t.tm_mon],
9740: 7a 4d 6f 6e 74 68 2c 20 33 20 29 29 7b 0a 20 20 zMonth, 3 )){.
9750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6b 67 return mkg
9760: 6d 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 mtime(&t);.
9770: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 }. }. }..
9780: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
9790: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 73 74 72 ** Convert a str
97a0: 75 63 74 20 74 6d 2a 20 74 68 61 74 20 72 65 70 uct tm* that rep
97b0: 72 65 73 65 6e 74 73 20 61 20 6d 6f 6d 65 6e 74 resents a moment
97c0: 20 69 6e 20 55 54 43 20 69 6e 74 6f 20 74 68 65 in UTC into the
97d0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 73 65 number.** of se
97e0: 63 6f 6e 64 73 20 69 6e 20 31 39 37 30 2c 20 55 conds in 1970, U
97f0: 54 43 2e 0a 2a 2f 0a 74 69 6d 65 5f 74 20 6d 6b TC..*/.time_t mk
9800: 67 6d 74 69 6d 65 28 73 74 72 75 63 74 20 74 6d gmtime(struct tm
9810: 20 2a 70 29 7b 0a 20 20 74 69 6d 65 5f 74 20 74 *p){. time_t t
9820: 3b 0a 20 20 69 6e 74 20 6e 44 61 79 3b 0a 20 20 ;. int nDay;.
9830: 69 6e 74 20 69 73 4c 65 61 70 59 72 3b 0a 20 20 int isLeapYr;.
9840: 2f 2a 20 44 61 79 73 20 69 6e 20 65 61 63 68 20 /* Days in each
9850: 6d 6f 6e 74 68 3a 20 20 20 20 20 20 20 33 31 2c month: 31,
9860: 20 32 38 2c 20 33 31 2c 20 33 30 2c 20 33 31 2c 28, 31, 30, 31,
9870: 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 30 2c 30, 31, 31, 30,
9880: 20 33 31 2c 20 33 30 2c 20 33 31 20 2a 2f 0a 20 31, 30, 31 */.
9890: 20 73 74 61 74 69 63 20 69 6e 74 20 70 72 69 6f static int prio
98a0: 72 44 61 79 73 5b 5d 20 20 20 3d 20 7b 20 20 30 rDays[] = { 0
98b0: 2c 20 33 31 2c 20 35 39 2c 20 39 30 2c 31 32 30 , 31, 59, 90,120
98c0: 2c 31 35 31 2c 31 38 31 2c 32 31 32 2c 32 34 33 ,151,181,212,243
98d0: 2c 32 37 33 2c 33 30 34 2c 33 33 34 20 7d 3b 0a ,273,304,334 };.
98e0: 20 20 69 66 28 20 70 2d 3e 74 6d 5f 6d 6f 6e 3c if( p->tm_mon<
98f0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 59 65 0 ){. int nYe
9900: 61 72 20 3d 20 28 31 31 20 2d 20 70 2d 3e 74 6d ar = (11 - p->tm
9910: 5f 6d 6f 6e 29 2f 31 32 3b 0a 20 20 20 20 70 2d _mon)/12;. p-
9920: 3e 74 6d 5f 79 65 61 72 20 2d 3d 20 6e 59 65 61 >tm_year -= nYea
9930: 72 3b 0a 20 20 20 20 70 2d 3e 74 6d 5f 6d 6f 6e r;. p->tm_mon
9940: 20 2b 3d 20 6e 59 65 61 72 2a 31 32 3b 0a 20 20 += nYear*12;.
9950: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 74 6d 5f }else if( p->tm_
9960: 6d 6f 6e 3e 31 31 20 29 7b 0a 20 20 20 20 70 2d mon>11 ){. p-
9970: 3e 74 6d 5f 79 65 61 72 20 2b 3d 20 70 2d 3e 74 >tm_year += p->t
9980: 6d 5f 6d 6f 6e 2f 31 32 3b 0a 20 20 20 20 70 2d m_mon/12;. p-
9990: 3e 74 6d 5f 6d 6f 6e 20 25 3d 20 31 32 3b 0a 20 >tm_mon %= 12;.
99a0: 20 7d 0a 20 20 69 73 4c 65 61 70 59 72 20 3d 20 }. isLeapYr =
99b0: 70 2d 3e 74 6d 5f 79 65 61 72 25 34 3d 3d 30 20 p->tm_year%4==0
99c0: 26 26 20 28 70 2d 3e 74 6d 5f 79 65 61 72 25 31 && (p->tm_year%1
99d0: 30 30 21 3d 30 20 7c 7c 20 28 70 2d 3e 74 6d 5f 00!=0 || (p->tm_
99e0: 79 65 61 72 2b 33 30 30 29 25 34 30 30 3d 3d 30 year+300)%400==0
99f0: 29 3b 0a 20 20 70 2d 3e 74 6d 5f 79 64 61 79 20 );. p->tm_yday
9a00: 3d 20 70 72 69 6f 72 44 61 79 73 5b 70 2d 3e 74 = priorDays[p->t
9a10: 6d 5f 6d 6f 6e 5d 20 2b 20 70 2d 3e 74 6d 5f 6d m_mon] + p->tm_m
9a20: 64 61 79 20 2d 20 31 3b 0a 20 20 69 66 28 20 69 day - 1;. if( i
9a30: 73 4c 65 61 70 59 72 20 26 26 20 70 2d 3e 74 6d sLeapYr && p->tm
9a40: 5f 6d 6f 6e 3e 31 20 29 20 70 2d 3e 74 6d 5f 79 _mon>1 ) p->tm_y
9a50: 64 61 79 2b 2b 3b 0a 20 20 6e 44 61 79 20 3d 20 day++;. nDay =
9a60: 28 70 2d 3e 74 6d 5f 79 65 61 72 2d 37 30 29 2a (p->tm_year-70)*
9a70: 33 36 35 20 2b 20 28 70 2d 3e 74 6d 5f 79 65 61 365 + (p->tm_yea
9a80: 72 2d 36 39 29 2f 34 20 2d 70 2d 3e 74 6d 5f 79 r-69)/4 -p->tm_y
9a90: 65 61 72 2f 31 30 30 20 2b 20 0a 20 20 20 20 20 ear/100 + .
9aa0: 20 20 20 20 28 70 2d 3e 74 6d 5f 79 65 61 72 2b (p->tm_year+
9ab0: 33 30 30 29 2f 34 30 30 20 2b 20 70 2d 3e 74 6d 300)/400 + p->tm
9ac0: 5f 79 64 61 79 3b 0a 20 20 74 20 3d 20 28 28 6e _yday;. t = ((n
9ad0: 44 61 79 2a 32 34 20 2b 20 70 2d 3e 74 6d 5f 68 Day*24 + p->tm_h
9ae0: 6f 75 72 29 2a 36 30 20 2b 20 70 2d 3e 74 6d 5f our)*60 + p->tm_
9af0: 6d 69 6e 29 2a 36 30 20 2b 20 70 2d 3e 74 6d 5f min)*60 + p->tm_
9b00: 73 65 63 3b 0a 20 20 72 65 74 75 72 6e 20 74 3b sec;. return t;
9b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 .}../*.** Check
9b20: 74 68 65 20 6f 62 6a 65 63 74 54 69 6d 65 20 61 the objectTime a
9b30: 67 61 69 6e 73 74 20 74 68 65 20 49 66 2d 4d 6f gainst the If-Mo
9b40: 64 69 66 69 65 64 2d 53 69 6e 63 65 20 72 65 71 dified-Since req
9b50: 75 65 73 74 20 68 65 61 64 65 72 2e 20 49 66 20 uest header. If
9b60: 74 68 65 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 69 the.** object ti
9b70: 6d 65 20 69 73 6e 27 74 20 61 6e 79 20 6e 65 77 me isn't any new
9b80: 65 72 20 74 68 61 6e 20 74 68 65 20 68 65 61 64 er than the head
9b90: 65 72 2c 20 77 65 20 69 6d 6d 65 64 69 61 74 65 er, we immediate
9ba0: 6c 79 20 73 65 6e 64 20 62 61 63 6b 0a 2a 2a 20 ly send back.**
9bb0: 61 20 33 30 34 20 72 65 70 6c 79 20 61 6e 64 20 a 304 reply and
9bc0: 65 78 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 exit..*/.void cg
9bd0: 69 5f 6d 6f 64 69 66 69 65 64 5f 73 69 6e 63 65 i_modified_since
9be0: 28 74 69 6d 65 5f 74 20 6f 62 6a 65 63 74 54 69 (time_t objectTi
9bf0: 6d 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 me){. const cha
9c00: 72 20 2a 7a 49 66 20 3d 20 50 28 22 48 54 54 50 r *zIf = P("HTTP
9c10: 5f 49 46 5f 4d 4f 44 49 46 49 45 44 5f 53 49 4e _IF_MODIFIED_SIN
9c20: 43 45 22 29 3b 0a 20 20 69 66 28 20 7a 49 66 3d CE");. if( zIf=
9c30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 =0 ) return;. i
9c40: 66 28 20 6f 62 6a 65 63 74 54 69 6d 65 20 3e 20 f( objectTime >
9c50: 63 67 69 5f 72 66 63 38 32 32 5f 70 61 72 73 65 cgi_rfc822_parse
9c60: 64 61 74 65 28 7a 49 66 29 20 29 20 72 65 74 75 date(zIf) ) retu
9c70: 72 6e 3b 0a 20 20 63 67 69 5f 73 65 74 5f 73 74 rn;. cgi_set_st
9c80: 61 74 75 73 28 33 30 34 2c 22 4e 6f 74 20 4d 6f atus(304,"Not Mo
9c90: 64 69 66 69 65 64 22 29 3b 0a 20 20 63 67 69 5f dified");. cgi_
9ca0: 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b reset_content();
9cb0: 0a 20 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a . cgi_reply();.
9cc0: 20 20 65 78 69 74 28 30 29 3b 0a 7d 0a exit(0);.}.