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 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20 Simplified BSD
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32 known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22 -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63 or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 ormation:.** d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 rh@hwaci.com.**
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a ci.com/drh/.**.*
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
0250: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 62 *.** This file b
0260: 65 67 61 6e 20 61 73 20 61 20 73 65 74 20 6f 66 egan as a set of
0270: 20 43 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 C functions and
0280: 20 70 72 6f 63 65 64 75 72 65 73 20 75 73 65 64 procedures used
0290: 20 69 6e 74 65 70 72 65 74 0a 2a 2a 20 43 47 49 intepret.** CGI
02a0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 environment var
02b0: 69 61 62 6c 65 73 20 66 6f 72 20 46 6f 73 73 69 iables for Fossi
02c0: 6c 20 77 65 62 20 70 61 67 65 73 20 74 68 61 74 l web pages that
02d0: 20 77 65 72 65 20 69 6e 76 6f 6b 65 64 20 62 79 were invoked by
02e0: 0a 2a 2a 20 43 47 49 2e 20 20 54 68 61 74 27 73 .** CGI. That's
02f0: 20 77 68 65 72 65 20 74 68 65 20 66 69 6c 65 20 where the file
0300: 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 2e name comes from.
0310: 20 20 42 75 74 20 6f 76 65 72 20 74 68 65 20 79 But over the y
0320: 65 61 72 73 20 69 74 0a 2a 2a 20 68 61 73 20 67 ears it.** has g
0330: 72 6f 77 6e 20 74 6f 20 69 6e 63 6f 72 70 6f 72 rown to incorpor
0340: 61 74 65 20 6c 6f 74 73 20 6f 66 20 72 65 6c 61 ate lots of rela
0350: 74 65 64 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 ted functionalit
0360: 79 2c 20 69 6e 63 6c 75 64 69 6e 67 3a 0a 2a 2a y, including:.**
0370: 0a 2a 2a 20 20 20 2a 20 20 49 6e 74 65 72 70 72 .** * Interpr
0380: 65 74 69 6e 67 20 43 47 49 20 65 6e 76 69 72 6f eting CGI enviro
0390: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 nment variables
03a0: 77 68 65 6e 20 46 6f 73 73 69 6c 20 69 73 20 72 when Fossil is r
03b0: 75 6e 20 61 73 0a 2a 2a 20 20 20 20 20 20 43 47 un as.** CG
03c0: 49 20 28 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 I (the original
03d0: 70 75 72 70 6f 73 65 29 2e 0a 2a 2a 0a 2a 2a 20 purpose)..**.**
03e0: 20 20 2a 20 20 49 6e 74 65 72 70 72 65 74 69 6e * Interpretin
03f0: 67 20 48 54 54 50 20 72 65 71 75 65 73 74 73 20 g HTTP requests
0400: 72 65 63 65 69 76 65 64 20 64 69 72 65 63 74 6c received directl
0410: 79 20 6f 72 20 76 69 61 20 61 6e 20 53 53 48 20 y or via an SSH
0420: 74 75 6e 6e 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 tunnel..**.**
0430: 2a 20 20 49 6e 74 65 72 70 72 65 74 69 6e 67 20 * Interpreting
0440: 53 43 47 49 20 72 65 71 75 65 73 74 73 0a 2a 2a SCGI requests.**
0450: 0a 2a 2a 20 20 20 2a 20 20 47 65 6e 65 72 61 74 .** * Generat
0460: 69 6e 67 20 61 70 70 72 6f 70 72 69 61 74 65 20 ing appropriate
0470: 72 65 70 6c 69 65 73 20 74 6f 20 43 47 49 2c 20 replies to CGI,
0480: 53 43 47 49 2c 20 61 6e 64 20 48 54 54 50 20 72 SCGI, and HTTP r
0490: 65 71 75 65 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 equests..**.**
04a0: 20 2a 20 20 4c 69 73 74 65 6e 69 6e 67 20 66 6f * Listening fo
04b0: 72 20 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 20 r incoming HTTP
04c0: 72 65 71 75 65 73 74 73 20 61 6e 64 20 64 69 73 requests and dis
04d0: 70 61 74 63 68 69 6e 67 20 74 68 65 6d 2e 0a 2a patching them..*
04e0: 2a 20 20 20 20 20 20 28 55 73 65 64 20 62 79 20 * (Used by
04f0: 22 66 6f 73 73 69 6c 20 75 69 22 20 61 6e 64 20 "fossil ui" and
0500: 22 66 6f 73 73 69 6c 20 73 65 72 76 65 72 22 2c "fossil server",
0510: 20 66 6f 72 20 65 78 61 6d 70 6c 65 29 2e 0a 2a for example)..*
0520: 2a 0a 2a 2a 20 53 6f 2c 20 65 76 65 6e 20 74 68 *.** So, even th
0530: 6f 75 67 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 ough the name of
0540: 20 74 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 69 this file impli
0550: 65 73 20 74 68 61 74 20 69 74 20 6f 6e 6c 79 20 es that it only
0560: 64 65 61 6c 73 20 77 69 74 68 0a 2a 2a 20 43 47 deals with.** CG
0570: 49 2c 20 69 6e 20 66 61 63 74 2c 20 74 68 65 20 I, in fact, the
0580: 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c code in this fil
0590: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e 74 e is used to int
05a0: 65 72 70 72 65 74 20 77 65 62 70 61 67 65 20 72 erpret webpage r
05b0: 65 71 75 65 73 74 73 0a 2a 2a 20 72 65 63 65 69 equests.** recei
05c0: 76 65 64 20 62 79 20 61 20 76 61 72 69 65 74 79 ved by a variety
05d0: 20 6f 66 20 6d 65 61 6e 73 2c 20 61 6e 64 20 74 of means, and t
05e0: 6f 20 67 65 6e 65 72 61 74 65 20 77 65 6c 6c 2d o generate well-
05f0: 66 6f 72 6d 61 74 74 65 64 20 72 65 70 6c 69 65 formatted replie
0600: 73 0a 2a 2a 20 74 6f 20 74 68 6f 73 65 20 72 65 s.** to those re
0610: 71 75 65 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 quests..**.** Th
0620: 65 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 e code in this f
0630: 69 6c 65 20 61 62 73 74 72 61 63 74 73 20 74 68 ile abstracts th
0640: 65 20 77 65 62 2d 72 65 71 75 65 73 74 20 73 6f e web-request so
0650: 20 74 68 61 74 20 64 6f 77 6e 73 74 72 65 61 6d that downstream
0660: 0a 2a 2a 20 6d 6f 64 75 6c 65 73 20 74 68 61 74 .** modules that
0670: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 62 6f generate the bo
0680: 64 79 20 6f 66 20 74 68 65 20 72 65 70 6c 79 20 dy of the reply
0690: 28 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 (based on the re
06a0: 71 75 65 73 74 65 64 20 70 61 67 65 29 0a 2a 2a quested page).**
06b0: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 do not need to
06c0: 6b 6e 6f 77 20 69 66 20 74 68 65 20 72 65 71 75 know if the requ
06d0: 65 73 74 20 69 73 20 63 6f 6d 69 6e 67 20 66 72 est is coming fr
06e0: 6f 6d 20 43 47 49 2c 20 64 69 72 65 63 74 20 48 om CGI, direct H
06f0: 54 54 50 2c 20 0a 2a 2a 20 53 43 47 49 2c 20 6f TTP, .** SCGI, o
0700: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 6d 65 61 r some other mea
0710: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d ns..**.** This m
0720: 6f 64 75 6c 65 20 67 61 74 68 65 72 73 20 69 6e odule gathers in
0730: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 formation about
0740: 77 65 62 20 70 61 67 65 20 72 65 71 75 65 73 74 web page request
0750: 20 69 6e 74 6f 20 61 20 6b 65 79 2f 76 61 6c 75 into a key/valu
0760: 65 0a 2a 2a 20 73 74 6f 72 65 2e 20 20 4b 65 79 e.** store. Key
0770: 73 20 61 6e 64 20 76 61 6c 75 65 73 20 63 6f 6d s and values com
0780: 65 20 66 72 6f 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 e from:.**.**
0790: 20 2a 20 20 51 75 65 72 79 20 70 61 72 61 6d 65 * Query parame
07a0: 74 65 72 73 0a 2a 2a 20 20 20 20 2a 20 20 50 4f ters.** * PO
07b0: 53 54 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 ST parameter.**
07c0: 20 20 20 2a 20 20 43 6f 6f 6b 69 65 73 0a 2a 2a * Cookies.**
07d0: 20 20 20 20 2a 20 20 45 6e 76 69 72 6f 6e 6d 65 * Environme
07e0: 6e 74 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 0a nt variables.**.
07f0: 2a 2a 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 ** The parameter
0800: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 75 s are accessed u
0810: 73 69 6e 67 20 63 67 69 5f 70 61 72 61 6d 65 74 sing cgi_paramet
0820: 65 72 28 29 20 61 6e 64 20 73 69 6d 69 6c 61 72 er() and similar
0830: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 6f 72 functions.** or
0840: 20 74 68 65 69 72 20 63 6f 6e 76 65 6e 69 65 6e their convenien
0850: 63 65 20 6d 61 63 72 6f 73 20 50 28 29 20 61 6e ce macros P() an
0860: 64 20 73 69 6d 69 6c 61 72 2e 0a 2a 2a 0a 2a 2a d similar..**.**
0870: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 Environment var
0880: 69 61 62 6c 65 20 70 61 72 61 6d 65 74 65 72 73 iable parameters
0890: 20 61 72 65 20 73 65 74 20 61 73 20 69 66 20 74 are set as if t
08a0: 68 65 20 72 65 71 75 65 73 74 20 77 65 72 65 20 he request were
08b0: 63 6f 6d 69 6e 67 0a 2a 2a 20 69 6e 20 6f 76 65 coming.** in ove
08c0: 72 20 43 47 49 20 65 76 65 6e 20 69 66 20 74 68 r CGI even if th
08d0: 65 20 72 65 71 75 65 73 74 20 61 72 72 69 76 65 e request arrive
08e0: 64 20 76 69 61 20 53 43 47 49 20 6f 72 20 64 69 d via SCGI or di
08f0: 72 65 63 74 20 48 54 54 50 2e 20 20 54 68 75 73 rect HTTP. Thus
0900: 0a 2a 2a 20 74 68 65 20 64 6f 77 6e 73 74 72 65 .** the downstre
0910: 61 6d 20 6d 6f 64 75 6c 65 73 20 74 68 61 74 20 am modules that
0920: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 69 6e are trying to in
0930: 74 65 72 70 72 65 74 20 74 68 65 20 72 65 71 75 terpret the requ
0940: 65 73 74 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 est do not.** ne
0950: 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 65 20 72 ed to know the r
0960: 65 71 75 65 73 74 20 70 72 6f 74 6f 63 6f 6c 20 equest protocol
0970: 2d 20 74 68 65 79 20 63 61 6e 20 6a 75 73 74 20 - they can just
0980: 72 65 71 75 65 73 74 20 74 68 65 20 76 61 6c 75 request the valu
0990: 65 73 0a 2a 2a 20 6f 66 20 65 6e 76 69 72 6f 6e es.** of environ
09a0: 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 73 20 61 ment variables a
09b0: 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 77 69 nd everything wi
09c0: 6c 6c 20 61 6c 77 61 79 73 20 77 6f 72 6b 2e 0a ll always work..
09d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 **.** This file
09e0: 63 6f 6e 74 61 69 6e 73 20 72 6f 75 74 69 6e 65 contains routine
09f0: 73 20 75 73 65 64 20 62 79 20 46 6f 73 73 69 6c s used by Fossil
0a00: 20 77 68 65 6e 20 69 74 20 69 73 20 61 63 74 69 when it is acti
0a10: 6e 67 20 61 73 20 61 0a 2a 2a 20 43 47 49 20 63 ng as a.** CGI c
0a20: 6c 69 65 6e 74 2e 20 20 46 6f 72 20 74 68 65 20 lient. For the
0a30: 63 6f 64 65 20 75 73 65 64 20 62 79 20 46 6f 73 code used by Fos
0a40: 73 69 6c 20 77 68 65 6e 20 69 74 20 69 73 20 61 sil when it is a
0a50: 63 74 69 6e 67 20 61 73 20 61 0a 2a 2a 20 43 47 cting as a.** CG
0a60: 49 20 73 65 72 76 65 72 20 28 66 6f 72 20 74 68 I server (for th
0a70: 65 20 2f 65 78 74 20 77 65 62 70 61 67 65 29 20 e /ext webpage)
0a80: 73 65 65 20 74 68 65 20 22 65 78 74 63 67 69 2e see the "extcgi.
0a90: 63 22 20 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a c" source file..
0aa0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e */.#include "con
0ab0: 66 69 67 2e 68 22 0a 23 69 66 64 65 66 20 5f 57 fig.h".#ifdef _W
0ac0: 49 4e 33 32 0a 23 20 69 66 20 21 64 65 66 69 6e IN32.# if !defin
0ad0: 65 64 28 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 29 ed(_WIN32_WINNT)
0ae0: 0a 23 20 20 64 65 66 69 6e 65 20 5f 57 49 4e 33 .# define _WIN3
0af0: 32 5f 57 49 4e 4e 54 20 30 78 30 35 30 31 0a 23 2_WINNT 0x0501.#
0b00: 20 65 6e 64 69 66 0a 23 20 69 6e 63 6c 75 64 65 endif.# include
0b10: 20 3c 77 69 6e 73 6f 63 6b 32 2e 68 3e 0a 23 20 <winsock2.h>.#
0b20: 69 6e 63 6c 75 64 65 20 3c 77 73 32 74 63 70 69 include <ws2tcpi
0b30: 70 2e 68 3e 0a 23 65 6c 73 65 0a 23 20 69 6e 63 p.h>.#else.# inc
0b40: 6c 75 64 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 lude <sys/socket
0b50: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6e .h>.# include <n
0b60: 65 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a 23 20 69 etinet/in.h>.# i
0b70: 6e 63 6c 75 64 65 20 3c 61 72 70 61 2f 69 6e 65 nclude <arpa/ine
0b80: 74 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c t.h>.# include <
0b90: 73 79 73 2f 74 69 6d 65 73 2e 68 3e 0a 23 20 69 sys/times.h>.# i
0ba0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 nclude <sys/time
0bb0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 .h>.# include <s
0bc0: 79 73 2f 77 61 69 74 2e 68 3e 0a 23 20 69 6e 63 ys/wait.h>.# inc
0bd0: 6c 75 64 65 20 3c 73 79 73 2f 73 65 6c 65 63 74 lude <sys/select
0be0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 .h>.#endif.#ifde
0bf0: 66 20 5f 5f 45 4d 58 5f 5f 0a 20 20 74 79 70 65 f __EMX__. type
0c00: 64 65 66 20 69 6e 74 20 73 6f 63 6b 6c 65 6e 5f def int socklen_
0c10: 74 3b 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 t;.#endif.#inclu
0c20: 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 de <time.h>.#inc
0c30: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 lude <stdio.h>.#
0c40: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e include <stdlib.
0c50: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 h>.#include <uni
0c60: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 std.h>.#include
0c70: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c <assert.h>.#incl
0c80: 75 64 65 20 22 63 67 69 2e 68 22 0a 23 69 6e 63 ude "cgi.h".#inc
0c90: 6c 75 64 65 20 22 63 79 67 73 75 70 2e 68 22 0a lude "cygsup.h".
0ca0: 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a 2f .#if INTERFACE./
0cb0: 2a 0a 2a 2a 20 53 68 6f 72 74 63 75 74 73 20 66 *.** Shortcuts f
0cc0: 6f 72 20 63 67 69 5f 70 61 72 61 6d 65 74 65 72 or cgi_parameter
0cd0: 2e 20 20 50 28 22 78 22 29 20 72 65 74 75 72 6e . P("x") return
0ce0: 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 71 s the value of q
0cf0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 0a 2a uery parameter.*
0d00: 2a 20 6f 72 20 63 6f 6f 6b 69 65 20 22 78 22 2c * or cookie "x",
0d10: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 or NULL if ther
0d20: 65 20 69 73 20 6e 6f 20 73 75 63 68 20 70 61 72 e is no such par
0d30: 61 6d 65 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 ameter or cookie
0d40: 2e 20 20 50 44 28 22 78 22 2c 22 79 22 29 0a 2a . PD("x","y").*
0d50: 2a 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 * does the same
0d60: 65 78 63 65 70 74 20 22 79 22 20 69 73 20 72 65 except "y" is re
0d70: 74 75 72 6e 65 64 20 69 6e 20 70 6c 61 63 65 20 turned in place
0d80: 6f 66 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 of NULL if there
0d90: 20 69 73 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a is not match..*
0da0: 2f 0a 23 64 65 66 69 6e 65 20 50 28 78 29 20 20 /.#define P(x)
0db0: 20 20 20 20 20 20 63 67 69 5f 70 61 72 61 6d 65 cgi_parame
0dc0: 74 65 72 28 28 78 29 2c 30 29 0a 23 64 65 66 69 ter((x),0).#defi
0dd0: 6e 65 20 50 44 28 78 2c 79 29 20 20 20 20 20 63 ne PD(x,y) c
0de0: 67 69 5f 70 61 72 61 6d 65 74 65 72 28 28 78 29 gi_parameter((x)
0df0: 2c 28 79 29 29 0a 23 64 65 66 69 6e 65 20 50 54 ,(y)).#define PT
0e00: 28 78 29 20 20 20 20 20 20 20 63 67 69 5f 70 61 (x) cgi_pa
0e10: 72 61 6d 65 74 65 72 5f 74 72 69 6d 6d 65 64 28 rameter_trimmed(
0e20: 28 78 29 2c 30 29 0a 23 64 65 66 69 6e 65 20 50 (x),0).#define P
0e30: 44 54 28 78 2c 79 29 20 20 20 20 63 67 69 5f 70 DT(x,y) cgi_p
0e40: 61 72 61 6d 65 74 65 72 5f 74 72 69 6d 6d 65 64 arameter_trimmed
0e50: 28 28 78 29 2c 28 79 29 29 0a 23 64 65 66 69 6e ((x),(y)).#defin
0e60: 65 20 50 42 28 78 29 20 20 20 20 20 20 20 63 67 e PB(x) cg
0e70: 69 5f 70 61 72 61 6d 65 74 65 72 5f 62 6f 6f 6c i_parameter_bool
0e80: 65 61 6e 28 78 29 0a 23 64 65 66 69 6e 65 20 50 ean(x).#define P
0e90: 43 4b 28 78 29 20 20 20 20 20 20 63 67 69 5f 70 CK(x) cgi_p
0ea0: 61 72 61 6d 65 74 65 72 5f 63 68 65 63 6b 65 64 arameter_checked
0eb0: 28 78 2c 31 29 0a 23 64 65 66 69 6e 65 20 50 49 (x,1).#define PI
0ec0: 46 28 78 2c 79 29 20 20 20 20 63 67 69 5f 70 61 F(x,y) cgi_pa
0ed0: 72 61 6d 65 74 65 72 5f 63 68 65 63 6b 65 64 28 rameter_checked(
0ee0: 78 2c 79 29 0a 0a 2f 2a 0a 2a 2a 20 53 68 6f 72 x,y)../*.** Shor
0ef0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 67 69 tcut for the cgi
0f00: 5f 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e _printf() routin
0f10: 65 2e 20 20 49 6e 73 74 65 61 64 20 6f 66 20 75 e. Instead of u
0f20: 73 69 6e 67 20 74 68 65 0a 2a 2a 0a 2a 2a 20 20 sing the.**.**
0f30: 20 20 40 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 6e 6f @ ....**.** no
0f40: 74 61 74 69 6f 6e 20 70 72 6f 76 69 64 65 64 20 tation provided
0f50: 62 79 20 74 68 65 20 74 72 61 6e 73 6c 61 74 65 by the translate
0f60: 2e 63 20 75 74 69 6c 69 74 79 2c 20 79 6f 75 20 .c utility, you
0f70: 63 61 6e 20 61 6c 73 6f 0a 2a 2a 20 6f 70 74 69 can also.** opti
0f80: 6f 6e 61 6c 6c 79 20 75 73 65 3a 0a 2a 2a 0a 2a onally use:.**.*
0f90: 2a 20 20 20 20 43 58 28 2e 2e 2e 29 0a 2a 2f 0a * CX(...).*/.
0fa0: 23 64 65 66 69 6e 65 20 43 58 20 63 67 69 5f 70 #define CX cgi_p
0fb0: 72 69 6e 74 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 rintf../*.** Des
0fc0: 74 69 6e 61 74 69 6f 6e 73 20 66 6f 72 20 6f 75 tinations for ou
0fd0: 74 70 75 74 20 74 65 78 74 2e 0a 2a 2f 0a 23 64 tput text..*/.#d
0fe0: 65 66 69 6e 65 20 43 47 49 5f 48 45 41 44 45 52 efine CGI_HEADER
0ff0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 43 47 49 0.#define CGI
1000: 5f 42 4f 44 59 20 20 20 20 20 31 0a 0a 2f 2a 0a _BODY 1../*.
1010: 2a 2a 20 46 6c 61 67 73 20 66 6f 72 20 53 53 48 ** Flags for SSH
1020: 20 48 54 54 50 20 63 6c 69 65 6e 74 73 0a 2a 2f HTTP clients.*/
1030: 0a 23 64 65 66 69 6e 65 20 43 47 49 5f 53 53 48 .#define CGI_SSH
1040: 5f 43 4c 49 45 4e 54 20 20 20 20 20 20 20 20 20 _CLIENT
1050: 20 20 30 78 30 30 30 31 20 20 20 20 20 2f 2a 20 0x0001 /*
1060: 43 6c 69 65 6e 74 20 69 73 20 53 53 48 20 2a 2f Client is SSH */
1070: 0a 23 64 65 66 69 6e 65 20 43 47 49 5f 53 53 48 .#define CGI_SSH
1080: 5f 43 4f 4d 50 41 54 20 20 20 20 20 20 20 20 20 _COMPAT
1090: 20 20 30 78 30 30 30 32 20 20 20 20 20 2f 2a 20 0x0002 /*
10a0: 43 6f 6d 70 61 74 20 66 6f 72 20 6f 6c 64 20 53 Compat for old S
10b0: 53 48 20 74 72 61 6e 73 70 6f 72 74 20 2a 2f 0a SH transport */.
10c0: 23 64 65 66 69 6e 65 20 43 47 49 5f 53 53 48 5f #define CGI_SSH_
10d0: 46 4f 53 53 49 4c 20 20 20 20 20 20 20 20 20 20 FOSSIL
10e0: 20 30 78 30 30 30 34 20 20 20 20 20 2f 2a 20 55 0x0004 /* U
10f0: 73 65 20 6e 65 77 20 46 6f 73 73 69 6c 20 53 53 se new Fossil SS
1100: 48 20 74 72 61 6e 73 70 6f 72 74 20 2a 2f 0a 0a H transport */..
1110: 23 65 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 #endif /* INTERF
1120: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 ACE */../*.** Th
1130: 65 20 72 65 70 6c 79 20 63 6f 6e 74 65 6e 74 20 e reply content
1140: 69 73 20 67 65 6e 65 72 61 74 65 64 20 69 6e 20 is generated in
1150: 74 77 6f 20 70 69 65 63 65 73 3a 20 74 68 65 20 two pieces: the
1160: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 62 header and the b
1170: 6f 64 79 2e 0a 2a 2a 20 54 68 65 73 65 20 70 69 ody..** These pi
1180: 65 63 65 73 20 61 72 65 20 67 65 6e 65 72 61 74 eces are generat
1190: 65 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 ed separately be
11a0: 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 6e cause they are n
11b0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a ot necessarily.*
11c0: 2a 20 70 72 6f 64 75 63 65 64 20 69 6e 20 6f 72 * produced in or
11d0: 64 65 72 2e 20 20 50 61 72 74 73 20 6f 66 20 74 der. Parts of t
11e0: 68 65 20 68 65 61 64 65 72 20 6d 69 67 68 74 20 he header might
11f0: 62 65 20 62 75 69 6c 74 20 61 66 74 65 72 20 61 be built after a
1200: 6c 6c 20 6f 72 0a 2a 2a 20 70 61 72 74 20 6f 66 ll or.** part of
1210: 20 74 68 65 20 62 6f 64 79 2e 20 20 54 68 65 20 the body. The
1220: 68 65 61 64 65 72 20 61 6e 64 20 62 6f 64 79 20 header and body
1230: 61 72 65 20 61 63 63 75 6d 75 6c 61 74 65 64 20 are accumulated
1240: 69 6e 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 42 in separate.** B
1250: 6c 6f 62 20 73 74 72 75 63 74 75 72 65 73 20 74 lob structures t
1260: 68 65 6e 20 6f 75 74 70 75 74 20 73 65 71 75 65 hen output seque
1270: 6e 74 69 61 6c 6c 79 20 6f 6e 63 65 20 65 76 65 ntially once eve
1280: 72 79 74 68 69 6e 67 20 68 61 73 20 62 65 65 6e rything has been
1290: 0a 2a 2a 20 62 75 69 6c 74 2e 0a 2a 2a 0a 2a 2a .** built..**.**
12a0: 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 Do not confuse
12b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 the content head
12c0: 65 72 20 77 69 74 68 20 74 68 65 20 48 54 54 50 er with the HTTP
12d0: 20 68 65 61 64 65 72 2e 20 54 68 65 20 63 6f 6e header. The con
12e0: 74 65 6e 74 20 68 65 61 64 65 72 0a 2a 2a 20 69 tent header.** i
12f0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 64 s generated by d
1300: 6f 77 6e 73 74 72 65 61 6d 20 63 6f 64 65 2e 20 ownstream code.
1310: 20 54 68 65 20 48 54 54 50 20 68 65 61 64 65 72 The HTTP header
1320: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 is generated by
1330: 20 74 68 65 0a 2a 2a 20 63 67 69 5f 72 65 70 6c the.** cgi_repl
1340: 79 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f y() routine belo
1350: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e w..**.** The con
1360: 74 65 6e 74 20 68 65 61 64 65 72 20 61 6e 64 20 tent header and
1370: 63 6f 6e 74 65 6e 74 79 20 62 6f 64 79 20 61 72 contenty body ar
1380: 65 20 2a 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 e *approximately
1390: 2a 20 74 68 65 20 3c 68 65 61 64 3e 0a 2a 2a 20 * the <head>.**
13a0: 65 6c 65 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 element and the
13b0: 3c 62 6f 64 79 3e 20 65 6c 65 6d 65 6e 74 73 20 <body> elements
13c0: 66 6f 72 20 48 54 4d 4c 20 72 65 70 6c 69 65 73 for HTML replies
13d0: 2e 20 20 48 6f 77 65 76 65 72 20 74 68 69 73 20 . However this
13e0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 70 70 72 6f is only.** appro
13f0: 78 69 6d 61 74 65 2e 20 54 68 65 20 63 6f 6e 74 ximate. The cont
1400: 65 6e 74 20 68 65 61 64 65 72 20 61 6c 73 6f 20 ent header also
1410: 69 6e 63 6c 75 64 65 73 20 70 61 72 74 73 20 6f includes parts o
1420: 66 20 3c 62 6f 64 79 3e 20 74 68 61 74 0a 2a 2a f <body> that.**
1430: 20 73 68 6f 77 20 74 68 65 20 62 61 6e 6e 65 72 show the banner
1440: 20 61 6e 64 20 6d 65 6e 75 20 62 61 72 20 61 74 and menu bar at
1450: 20 74 68 65 20 74 6f 70 20 6f 66 20 65 61 63 68 the top of each
1460: 20 70 61 67 65 2e 20 20 41 6c 73 6f 20 6e 6f 74 page. Also not
1470: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 74 20 61 6c e that.** not al
1480: 6c 20 72 65 70 6c 69 65 73 20 61 72 65 20 48 54 l replies are HT
1490: 4d 4c 2c 20 62 75 74 20 74 68 65 72 65 20 63 61 ML, but there ca
14a0: 6e 20 73 74 69 6c 6c 20 62 65 20 73 65 70 61 72 n still be separ
14b0: 61 74 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a ate header and.*
14c0: 2a 20 62 6f 64 79 20 73 65 63 74 69 6f 6e 73 20 * body sections
14d0: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a of the content..
14e0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 67 69 5f 64 65 **.** The cgi_de
14f0: 73 74 69 6e 61 74 69 6f 6e 28 29 20 69 6e 74 65 stination() inte
1500: 72 66 61 63 65 20 73 77 69 74 63 68 65 73 20 62 rface switches b
1510: 65 74 77 65 65 6e 20 74 68 65 20 62 75 66 66 65 etween the buffe
1520: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 6c rs..*/.static Bl
1530: 6f 62 20 63 67 69 43 6f 6e 74 65 6e 74 5b 32 5d ob cgiContent[2]
1540: 20 3d 20 7b 20 42 4c 4f 42 5f 49 4e 49 54 49 41 = { BLOB_INITIA
1550: 4c 49 5a 45 52 2c 20 42 4c 4f 42 5f 49 4e 49 54 LIZER, BLOB_INIT
1560: 49 41 4c 49 5a 45 52 20 7d 3b 0a 73 74 61 74 69 IALIZER };.stati
1570: 63 20 42 6c 6f 62 20 2a 70 43 6f 6e 74 65 6e 74 c Blob *pContent
1580: 20 3d 20 26 63 67 69 43 6f 6e 74 65 6e 74 5b 30 = &cgiContent[0
1590: 5d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 ];../*.** Set th
15a0: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 62 75 e destination bu
15b0: 66 66 65 72 20 69 6e 74 6f 20 77 68 69 63 68 20 ffer into which
15c0: 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 43 47 to accumulate CG
15d0: 49 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f I content..*/.vo
15e0: 69 64 20 63 67 69 5f 64 65 73 74 69 6e 61 74 69 id cgi_destinati
15f0: 6f 6e 28 69 6e 74 20 64 65 73 74 29 7b 0a 20 20 on(int dest){.
1600: 73 77 69 74 63 68 28 20 64 65 73 74 20 29 7b 0a switch( dest ){.
1610: 20 20 20 20 63 61 73 65 20 43 47 49 5f 48 45 41 case CGI_HEA
1620: 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 70 43 6f DER: {. pCo
1630: 6e 74 65 6e 74 20 3d 20 26 63 67 69 43 6f 6e 74 ntent = &cgiCont
1640: 65 6e 74 5b 30 5d 3b 0a 20 20 20 20 20 20 62 72 ent[0];. br
1650: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
1660: 61 73 65 20 43 47 49 5f 42 4f 44 59 3a 20 7b 0a ase CGI_BODY: {.
1670: 20 20 20 20 20 20 70 43 6f 6e 74 65 6e 74 20 3d pContent =
1680: 20 26 63 67 69 43 6f 6e 74 65 6e 74 5b 31 5d 3b &cgiContent[1];
1690: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
16a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a }. default:
16b0: 20 7b 0a 20 20 20 20 20 20 63 67 69 5f 70 61 6e {. cgi_pan
16c0: 69 63 28 22 62 61 64 20 64 65 73 74 69 6e 61 74 ic("bad destinat
16d0: 69 6f 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d ion");. }. }
16e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 .}../*.** Check
16f0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 6f to see if the co
1700: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 6f 72 20 ntent header or
1710: 62 6f 64 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 body contains th
1720: 65 20 7a 4e 65 65 64 6c 65 20 73 74 72 69 6e 67 e zNeedle string
1730: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 ..** Return true
1740: 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 if it does and
1750: 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 false if it does
1760: 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 not..*/.int cgi
1770: 5f 68 65 61 64 65 72 5f 63 6f 6e 74 61 69 6e 73 _header_contains
1780: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 (const char *zNe
1790: 65 64 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 edle){. return
17a0: 73 74 72 73 74 72 28 62 6c 6f 62 5f 73 74 72 28 strstr(blob_str(
17b0: 26 63 67 69 43 6f 6e 74 65 6e 74 5b 30 5d 29 2c &cgiContent[0]),
17c0: 20 7a 4e 65 65 64 6c 65 29 21 3d 30 3b 0a 7d 0a zNeedle)!=0;.}.
17d0: 69 6e 74 20 63 67 69 5f 62 6f 64 79 5f 63 6f 6e int cgi_body_con
17e0: 74 61 69 6e 73 28 63 6f 6e 73 74 20 63 68 61 72 tains(const char
17f0: 20 2a 7a 4e 65 65 64 6c 65 29 7b 0a 20 20 72 65 *zNeedle){. re
1800: 74 75 72 6e 20 73 74 72 73 74 72 28 62 6c 6f 62 turn strstr(blob
1810: 5f 73 74 72 28 26 63 67 69 43 6f 6e 74 65 6e 74 _str(&cgiContent
1820: 5b 31 5d 29 2c 20 7a 4e 65 65 64 6c 65 29 21 3d [1]), zNeedle)!=
1830: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 0;.}../*.** Appe
1840: 6e 64 20 6e 65 77 20 72 65 70 6c 79 20 63 6f 6e nd new reply con
1850: 74 65 6e 74 20 74 6f 20 77 68 61 74 20 61 6c 72 tent to what alr
1860: 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2f 0a eady exists..*/.
1870: 76 6f 69 64 20 63 67 69 5f 61 70 70 65 6e 64 5f void cgi_append_
1880: 63 6f 6e 74 65 6e 74 28 63 6f 6e 73 74 20 63 68 content(const ch
1890: 61 72 20 2a 7a 44 61 74 61 2c 20 69 6e 74 20 6e ar *zData, int n
18a0: 41 6d 74 29 7b 0a 20 20 62 6c 6f 62 5f 61 70 70 Amt){. blob_app
18b0: 65 6e 64 28 70 43 6f 6e 74 65 6e 74 2c 20 7a 44 end(pContent, zD
18c0: 61 74 61 2c 20 6e 41 6d 74 29 3b 0a 7d 0a 0a 2f ata, nAmt);.}../
18d0: 2a 0a 2a 2a 20 52 65 73 65 74 20 62 6f 74 68 20 *.** Reset both
18e0: 72 65 70 6c 79 20 63 6f 6e 74 65 6e 74 20 62 75 reply content bu
18f0: 66 66 65 72 73 20 74 6f 20 62 65 20 65 6d 70 74 ffers to be empt
1900: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 72 y..*/.void cgi_r
1910: 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 76 6f 69 eset_content(voi
1920: 64 29 7b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 d){. blob_reset
1930: 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 30 5d 29 (&cgiContent[0])
1940: 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 ;. blob_reset(&
1950: 63 67 69 43 6f 6e 74 65 6e 74 5b 31 5d 29 3b 0a cgiContent[1]);.
1960: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
1970: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 42 6c 6f a pointer to Blo
1980: 62 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e b that is curren
1990: 74 6c 79 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 tly accumulating
19a0: 20 72 65 70 6c 79 20 63 6f 6e 74 65 6e 74 2e 0a reply content..
19b0: 2a 2f 0a 42 6c 6f 62 20 2a 63 67 69 5f 6f 75 74 */.Blob *cgi_out
19c0: 70 75 74 5f 62 6c 6f 62 28 76 6f 69 64 29 7b 0a put_blob(void){.
19d0: 20 20 72 65 74 75 72 6e 20 70 43 6f 6e 74 65 6e return pConten
19e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 t;.}../*.** Retu
19f0: 72 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 68 rn the content h
1a00: 65 61 64 65 72 20 61 73 20 61 20 74 65 78 74 20 eader as a text
1a10: 73 74 72 69 6e 67 0a 2a 2f 0a 63 6f 6e 73 74 20 string.*/.const
1a20: 63 68 61 72 20 2a 63 67 69 5f 68 65 61 64 65 72 char *cgi_header
1a30: 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e (void){. return
1a40: 20 62 6c 6f 62 5f 73 74 72 28 26 63 67 69 43 6f blob_str(&cgiCo
1a50: 6e 74 65 6e 74 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a ntent[0]);.}../*
1a60: 0a 2a 2a 20 43 6f 6d 62 69 6e 65 20 74 68 65 20 .** Combine the
1a70: 68 65 61 64 65 72 20 61 6e 64 20 62 6f 64 79 20 header and body
1a80: 63 6f 6e 74 65 6e 74 20 61 6c 6c 20 69 6e 74 6f content all into
1a90: 20 74 68 65 20 68 65 61 64 65 72 20 62 75 66 66 the header buff
1aa0: 65 72 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 er..** In other
1ab0: 77 6f 72 64 73 2c 20 61 70 70 65 6e 64 20 74 68 words, append th
1ac0: 65 20 62 6f 64 79 20 63 6f 6e 74 65 6e 74 20 74 e body content t
1ad0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 o the end of the
1ae0: 20 68 65 61 64 65 72 0a 2a 2a 20 63 6f 6e 74 65 header.** conte
1af0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f nt..*/.static vo
1b00: 69 64 20 63 67 69 5f 63 6f 6d 62 69 6e 65 5f 68 id cgi_combine_h
1b10: 65 61 64 65 72 5f 61 6e 64 5f 62 6f 64 79 28 76 eader_and_body(v
1b20: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 69 7a 65 oid){. int size
1b30: 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 26 63 67 = blob_size(&cg
1b40: 69 43 6f 6e 74 65 6e 74 5b 31 5d 29 3b 0a 20 20 iContent[1]);.
1b50: 69 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 if( size>0 ){.
1b60: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 63 blob_append(&c
1b70: 67 69 43 6f 6e 74 65 6e 74 5b 30 5d 2c 20 62 6c giContent[0], bl
1b80: 6f 62 5f 62 75 66 66 65 72 28 26 63 67 69 43 6f ob_buffer(&cgiCo
1b90: 6e 74 65 6e 74 5b 31 5d 29 2c 20 73 69 7a 65 29 ntent[1]), size)
1ba0: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 ;. blob_reset
1bb0: 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 31 5d 29 (&cgiContent[1])
1bc0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 ;. }.}../*.** R
1bd0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 eturn a pointer
1be0: 74 6f 20 74 68 65 20 63 6f 6d 62 69 6e 65 64 20 to the combined
1bf0: 68 65 61 64 65 72 2b 62 6f 64 79 20 63 6f 6e 74 header+body cont
1c00: 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 63 67 ent..*/.char *cg
1c10: 69 5f 65 78 74 72 61 63 74 5f 63 6f 6e 74 65 6e i_extract_conten
1c20: 74 28 76 6f 69 64 29 7b 0a 20 20 63 67 69 5f 63 t(void){. cgi_c
1c30: 6f 6d 62 69 6e 65 5f 68 65 61 64 65 72 5f 61 6e ombine_header_an
1c40: 64 5f 62 6f 64 79 28 29 3b 0a 20 20 72 65 74 75 d_body();. retu
1c50: 72 6e 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 rn blob_buffer(&
1c60: 63 67 69 43 6f 6e 74 65 6e 74 5b 30 5d 29 3b 0a cgiContent[0]);.
1c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 69 74 69 6f }../*.** Additio
1c80: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 nal information
1c90: 75 73 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 used to form the
1ca0: 20 48 54 54 50 20 72 65 70 6c 79 0a 2a 2f 0a 73 HTTP reply.*/.s
1cb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
1cc0: 20 2a 7a 43 6f 6e 74 65 6e 74 54 79 70 65 20 3d *zContentType =
1cd0: 20 22 74 65 78 74 2f 68 74 6d 6c 22 3b 20 20 20 "text/html";
1ce0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 74 79 70 65 20 /* Content type
1cf0: 6f 66 20 74 68 65 20 72 65 70 6c 79 20 2a 2f 0a of the reply */.
1d00: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
1d10: 72 20 2a 7a 52 65 70 6c 79 53 74 61 74 75 73 20 r *zReplyStatus
1d20: 3d 20 22 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 = "OK";
1d30: 20 2f 2a 20 52 65 70 6c 79 20 73 74 61 74 75 73 /* Reply status
1d40: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 2a 2f 0a description */.
1d50: 73 74 61 74 69 63 20 69 6e 74 20 69 52 65 70 6c static int iRepl
1d60: 79 53 74 61 74 75 73 20 3d 20 32 30 30 3b 20 20 yStatus = 200;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1d80: 52 65 70 6c 79 20 73 74 61 74 75 73 20 63 6f 64 Reply status cod
1d90: 65 20 2a 2f 0a 73 74 61 74 69 63 20 42 6c 6f 62 e */.static Blob
1da0: 20 65 78 74 72 61 48 65 61 64 65 72 20 3d 20 42 extraHeader = B
1db0: 4c 4f 42 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b LOB_INITIALIZER;
1dc0: 20 20 2f 2a 20 45 78 74 72 61 20 68 65 61 64 65 /* Extra heade
1dd0: 72 20 74 65 78 74 20 2a 2f 0a 73 74 61 74 69 63 r text */.static
1de0: 20 69 6e 74 20 72 61 6e 67 65 53 74 61 72 74 20 int rangeStart
1df0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
1e00: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 /* Start
1e10: 6f 66 20 52 61 6e 67 65 3a 20 2a 2f 0a 73 74 61 of Range: */.sta
1e20: 74 69 63 20 69 6e 74 20 72 61 6e 67 65 45 6e 64 tic int rangeEnd
1e30: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
1e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 /* End
1e50: 20 6f 66 20 52 61 6e 67 65 3a 20 70 6c 75 73 20 of Range: plus
1e60: 31 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 1 */../*.** Set
1e70: 74 68 65 20 72 65 70 6c 79 20 63 6f 6e 74 65 6e the reply conten
1e80: 74 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 t type..**.** Th
1e90: 65 20 72 65 70 6c 79 20 63 6f 6e 74 65 6e 74 20 e reply content
1ea0: 74 79 70 65 20 64 65 66 61 75 6c 74 73 20 74 6f type defaults to
1eb0: 20 22 74 65 78 74 2f 68 74 6d 6c 22 2e 20 20 49 "text/html". I
1ec0: 74 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 t only needs to
1ed0: 62 65 0a 2a 2a 20 63 68 61 6e 67 65 64 20 28 62 be.** changed (b
1ee0: 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 y calling this r
1ef0: 6f 75 74 69 6e 65 29 20 69 6e 20 74 68 65 20 65 outine) in the e
1f00: 78 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 xceptional case
1f10: 77 68 65 72 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 where some.** ot
1f20: 68 65 72 20 63 6f 6e 74 65 6e 74 20 74 79 70 65 her content type
1f30: 20 69 73 20 62 65 69 6e 67 20 72 65 74 75 72 6e is being return
1f40: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f ed..*/.void cgi_
1f50: 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 set_content_type
1f60: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 (const char *zTy
1f70: 70 65 29 7b 0a 20 20 7a 43 6f 6e 74 65 6e 74 54 pe){. zContentT
1f80: 79 70 65 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 ype = fossil_str
1f90: 64 75 70 28 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f dup(zType);.}../
1fa0: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6e 79 20 65 *.** Erase any e
1fb0: 78 69 73 74 69 6e 67 20 72 65 70 6c 79 20 63 6f xisting reply co
1fc0: 6e 74 65 6e 74 2e 20 20 52 65 70 6c 61 63 65 20 ntent. Replace
1fd0: 69 73 20 77 69 74 68 20 61 20 70 4e 65 77 43 6f is with a pNewCo
1fe0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ntent..**.** Thi
1ff0: 73 20 72 6f 75 74 69 6e 65 20 65 72 61 73 65 73 s routine erases
2000: 20 70 4e 65 77 43 6f 6e 74 65 6e 74 2e 20 20 49 pNewContent. I
2010: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 n other words, i
2020: 74 20 6d 6f 76 65 20 70 4e 65 77 43 6f 6e 74 65 t move pNewConte
2030: 6e 74 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 nt.** into the c
2040: 6f 6e 74 65 6e 74 20 62 75 66 66 65 72 2e 0a 2a ontent buffer..*
2050: 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 74 5f 63 /.void cgi_set_c
2060: 6f 6e 74 65 6e 74 28 42 6c 6f 62 20 2a 70 4e 65 ontent(Blob *pNe
2070: 77 43 6f 6e 74 65 6e 74 29 7b 0a 20 20 63 67 69 wContent){. cgi
2080: 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 _reset_content()
2090: 3b 0a 20 20 63 67 69 5f 64 65 73 74 69 6e 61 74 ;. cgi_destinat
20a0: 69 6f 6e 28 43 47 49 5f 48 45 41 44 45 52 29 3b ion(CGI_HEADER);
20b0: 0a 20 20 63 67 69 43 6f 6e 74 65 6e 74 5b 30 5d . cgiContent[0]
20c0: 20 3d 20 2a 70 4e 65 77 43 6f 6e 74 65 6e 74 3b = *pNewContent;
20d0: 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 70 4e 65 . blob_zero(pNe
20e0: 77 43 6f 6e 74 65 6e 74 29 3b 0a 7d 0a 0a 2f 2a wContent);.}../*
20f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 70 6c .** Set the repl
2100: 79 20 73 74 61 74 75 73 20 63 6f 64 65 0a 2a 2f y status code.*/
2110: 0a 76 6f 69 64 20 63 67 69 5f 73 65 74 5f 73 74 .void cgi_set_st
2120: 61 74 75 73 28 69 6e 74 20 69 53 74 61 74 2c 20 atus(int iStat,
2130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 61 const char *zSta
2140: 74 29 7b 0a 20 20 7a 52 65 70 6c 79 53 74 61 74 t){. zReplyStat
2150: 75 73 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 us = fossil_strd
2160: 75 70 28 7a 53 74 61 74 29 3b 0a 20 20 69 52 65 up(zStat);. iRe
2170: 70 6c 79 53 74 61 74 75 73 20 3d 20 69 53 74 61 plyStatus = iSta
2180: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 t;.}../*.** Appe
2190: 6e 64 20 74 65 78 74 20 74 6f 20 74 68 65 20 63 nd text to the c
21a0: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 62 75 ontent header bu
21b0: 66 66 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 ffer..*/.void cg
21c0: 69 5f 61 70 70 65 6e 64 5f 68 65 61 64 65 72 28 i_append_header(
21d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e const char *zLin
21e0: 65 29 7b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e e){. blob_appen
21f0: 64 28 26 65 78 74 72 61 48 65 61 64 65 72 2c 20 d(&extraHeader,
2200: 7a 4c 69 6e 65 2c 20 2d 31 29 3b 0a 7d 0a 76 6f zLine, -1);.}.vo
2210: 69 64 20 63 67 69 5f 70 72 69 6e 74 66 5f 68 65 id cgi_printf_he
2220: 61 64 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 ader(const char
2230: 2a 7a 4c 69 6e 65 2c 20 2e 2e 2e 29 7b 0a 20 20 *zLine, ...){.
2240: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 va_list ap;. va
2250: 5f 73 74 61 72 74 28 61 70 2c 20 7a 4c 69 6e 65 _start(ap, zLine
2260: 29 3b 0a 20 20 62 6c 6f 62 5f 76 61 70 70 65 6e );. blob_vappen
2270: 64 66 28 26 65 78 74 72 61 48 65 61 64 65 72 2c df(&extraHeader,
2280: 20 7a 4c 69 6e 65 2c 20 61 70 29 3b 0a 20 20 76 zLine, ap);. v
2290: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a a_end(ap);.}../*
22a0: 0a 2a 2a 20 53 65 74 20 61 20 63 6f 6f 6b 69 65 .** Set a cookie
22b0: 20 62 79 20 71 75 65 75 69 6e 67 20 75 70 20 74 by queuing up t
22c0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 48 he appropriate H
22d0: 54 54 50 20 68 65 61 64 65 72 20 6f 75 74 70 75 TTP header outpu
22e0: 74 2e 20 49 66 0a 2a 2a 20 21 67 2e 69 73 48 54 t. If.** !g.isHT
22f0: 54 50 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f TP, this is a no
2300: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 -op..**.** Zero
2310: 6c 69 66 65 74 69 6d 65 20 69 6d 70 6c 69 65 73 lifetime implies
2320: 20 61 20 73 65 73 73 69 6f 6e 20 63 6f 6f 6b 69 a session cooki
2330: 65 2e 20 41 20 6e 65 67 61 74 69 76 65 20 6f 6e e. A negative on
2340: 65 20 65 78 70 69 72 65 73 0a 2a 2a 20 74 68 65 e expires.** the
2350: 20 63 6f 6f 6b 69 65 20 69 6d 6d 65 64 69 61 74 cookie immediat
2360: 65 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 ely..*/.void cgi
2370: 5f 73 65 74 5f 63 6f 6f 6b 69 65 28 0a 20 20 63 _set_cookie(. c
2380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
2390: 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 , /* Name of
23a0: 74 68 65 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 the cookie */.
23b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c const char *zVal
23c0: 75 65 2c 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f ue, /* Value o
23d0: 66 20 74 68 65 20 63 6f 6f 6b 69 65 2e 20 20 41 f the cookie. A
23e0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 65 73 63 utomatically esc
23f0: 61 70 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 aped */. const
2400: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 char *zPath,
2410: 2f 2a 20 50 61 74 68 20 63 6f 6f 6b 69 65 20 61 /* Path cookie a
2420: 70 70 6c 69 65 73 20 74 6f 2e 20 20 4e 55 4c 4c pplies to. NULL
2430: 20 6d 65 61 6e 73 20 22 2f 22 20 2a 2f 0a 20 20 means "/" */.
2440: 69 6e 74 20 6c 69 66 65 74 69 6d 65 20 20 20 20 int lifetime
2450: 20 20 20 20 20 20 2f 2a 20 45 78 70 69 72 61 74 /* Expirat
2460: 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6f 6b 69 ion of the cooki
2470: 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 66 72 6f e in seconds fro
2480: 6d 20 6e 6f 77 20 2a 2f 0a 29 7b 0a 20 20 63 68 m now */.){. ch
2490: 61 72 20 63 6f 6e 73 74 20 2a 7a 53 65 63 75 72 ar const *zSecur
24a0: 65 20 3d 20 22 22 3b 0a 20 20 69 66 28 21 67 2e e = "";. if(!g.
24b0: 69 73 48 54 54 50 29 20 72 65 74 75 72 6e 20 2f isHTTP) return /
24c0: 2a 20 65 2e 67 2e 20 4a 53 4f 4e 20 43 4c 49 20 * e.g. JSON CLI
24d0: 6d 6f 64 65 2c 20 77 68 65 72 65 20 67 2e 7a 54 mode, where g.zT
24e0: 6f 70 20 69 73 20 6e 6f 74 20 73 65 74 20 2a 2f op is not set */
24f0: 3b 0a 20 20 65 6c 73 65 20 69 66 28 20 7a 50 61 ;. else if( zPa
2500: 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 50 61 th==0 ){. zPa
2510: 74 68 20 3d 20 67 2e 7a 54 6f 70 3b 0a 20 20 20 th = g.zTop;.
2520: 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 if( zPath[0]==0
2530: 20 29 20 7a 50 61 74 68 20 3d 20 22 2f 22 3b 0a ) zPath = "/";.
2540: 20 20 7d 0a 20 20 69 66 28 20 67 2e 7a 42 61 73 }. if( g.zBas
2550: 65 55 52 4c 21 3d 30 20 26 26 20 73 74 72 6e 63 eURL!=0 && strnc
2560: 6d 70 28 67 2e 7a 42 61 73 65 55 52 4c 2c 20 22 mp(g.zBaseURL, "
2570: 68 74 74 70 73 3a 22 2c 20 36 29 3d 3d 30 20 29 https:", 6)==0 )
2580: 7b 0a 20 20 20 20 7a 53 65 63 75 72 65 20 3d 20 {. zSecure =
2590: 22 20 73 65 63 75 72 65 3b 22 3b 0a 20 20 7d 0a " secure;";. }.
25a0: 20 20 69 66 28 20 6c 69 66 65 74 69 6d 65 21 3d if( lifetime!=
25b0: 30 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 0 ){. blob_ap
25c0: 70 65 6e 64 66 28 26 65 78 74 72 61 48 65 61 64 pendf(&extraHead
25d0: 65 72 2c 0a 20 20 20 20 20 20 20 22 53 65 74 2d er,. "Set-
25e0: 43 6f 6f 6b 69 65 3a 20 25 73 3d 25 74 3b 20 50 Cookie: %s=%t; P
25f0: 61 74 68 3d 25 73 3b 20 6d 61 78 2d 61 67 65 3d ath=%s; max-age=
2600: 25 64 3b 20 48 74 74 70 4f 6e 6c 79 3b 20 22 0a %d; HttpOnly; ".
2610: 20 20 20 20 20 20 20 22 25 73 20 56 65 72 73 69 "%s Versi
2620: 6f 6e 3d 31 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 on=1\r\n",.
2630: 20 20 7a 4e 61 6d 65 2c 20 6c 69 66 65 74 69 6d zName, lifetim
2640: 65 3e 30 20 3f 20 7a 56 61 6c 75 65 20 3a 20 22 e>0 ? zValue : "
2650: 6e 75 6c 6c 22 2c 20 7a 50 61 74 68 2c 20 6c 69 null", zPath, li
2660: 66 65 74 69 6d 65 2c 20 7a 53 65 63 75 72 65 29 fetime, zSecure)
2670: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 ;. }else{. b
2680: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 65 78 74 lob_appendf(&ext
2690: 72 61 48 65 61 64 65 72 2c 0a 20 20 20 20 20 20 raHeader,.
26a0: 20 22 53 65 74 2d 43 6f 6f 6b 69 65 3a 20 25 73 "Set-Cookie: %s
26b0: 3d 25 74 3b 20 50 61 74 68 3d 25 73 3b 20 48 74 =%t; Path=%s; Ht
26c0: 74 70 4f 6e 6c 79 3b 20 22 0a 20 20 20 20 20 20 tpOnly; ".
26d0: 20 22 25 73 20 56 65 72 73 69 6f 6e 3d 31 5c 72 "%s Version=1\r
26e0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 4e 61 6d \n",. zNam
26f0: 65 2c 20 7a 56 61 6c 75 65 2c 20 7a 50 61 74 68 e, zValue, zPath
2700: 2c 20 7a 53 65 63 75 72 65 29 3b 0a 20 20 7d 0a , zSecure);. }.
2710: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e }.../*.** Return
2720: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 true if the res
2730: 70 6f 6e 73 65 20 73 68 6f 75 6c 64 20 62 65 20 ponse should be
2740: 73 65 6e 74 20 77 69 74 68 20 43 6f 6e 74 65 6e sent with Conten
2750: 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 67 7a 69 70 t-Encoding: gzip
2760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
2770: 69 73 5f 67 7a 69 70 70 61 62 6c 65 28 76 6f 69 is_gzippable(voi
2780: 64 29 7b 0a 20 20 69 66 28 20 67 2e 66 4e 6f 48 d){. if( g.fNoH
2790: 74 74 70 43 6f 6d 70 72 65 73 73 20 29 20 72 65 ttpCompress ) re
27a0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 turn 0;. if( st
27b0: 72 73 74 72 28 50 44 28 22 48 54 54 50 5f 41 43 rstr(PD("HTTP_AC
27c0: 43 45 50 54 5f 45 4e 43 4f 44 49 4e 47 22 2c 20 CEPT_ENCODING",
27d0: 22 22 29 2c 20 22 67 7a 69 70 22 29 3d 3d 30 20 ""), "gzip")==0
27e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 ) return 0;. re
27f0: 74 75 72 6e 20 73 74 72 6e 63 6d 70 28 7a 43 6f turn strncmp(zCo
2800: 6e 74 65 6e 74 54 79 70 65 2c 20 22 74 65 78 74 ntentType, "text
2810: 2f 22 2c 20 35 29 3d 3d 30 0a 20 20 20 20 7c 7c /", 5)==0. ||
2820: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 sqlite3_strglob
2830: 28 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 2a 78 ("application/*x
2840: 6d 6c 22 2c 20 7a 43 6f 6e 74 65 6e 74 54 79 70 ml", zContentTyp
2850: 65 29 3d 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c e)==0. || sql
2860: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 61 70 ite3_strglob("ap
2870: 70 6c 69 63 61 74 69 6f 6e 2f 2a 6a 61 76 61 73 plication/*javas
2880: 63 72 69 70 74 22 2c 20 7a 43 6f 6e 74 65 6e 74 cript", zContent
2890: 54 79 70 65 29 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a Type)==0;.}.../*
28a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin
28b0: 67 20 72 6f 75 74 69 6e 65 73 20 72 65 61 64 20 g routines read
28c0: 6f 72 20 77 72 69 74 65 20 63 6f 6e 74 65 6e 74 or write content
28d0: 20 66 72 6f 6d 2f 74 6f 20 74 68 65 20 77 69 72 from/to the wir
28e0: 65 20 66 6f 72 0a 2a 2a 20 61 6e 20 48 54 54 50 e for.** an HTTP
28f0: 20 72 65 71 75 65 73 74 2e 20 20 44 65 70 65 6e request. Depen
2900: 64 69 6e 67 20 6f 6e 20 73 65 74 74 69 6e 67 73 ding on settings
2910: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 the content mig
2920: 68 74 20 62 65 20 63 6f 6d 69 6e 67 0a 2a 2a 20 ht be coming.**
2930: 66 72 6f 6d 20 6f 72 20 67 6f 69 6e 67 20 74 6f from or going to
2940: 20 61 20 73 6f 63 6b 65 74 2c 20 6f 72 20 61 20 a socket, or a
2950: 66 69 6c 65 2c 20 6f 72 20 69 74 20 6d 69 67 68 file, or it migh
2960: 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 72 20 67 t come from or g
2970: 6f 0a 2a 2a 20 74 6f 20 61 6e 20 53 53 4c 20 64 o.** to an SSL d
2980: 65 63 6f 64 65 72 2f 65 6e 63 6f 64 65 72 2e 0a ecoder/encoder..
2990: 2a 2f 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b 73 20 6c */./*.** Works l
29a0: 69 6b 65 20 66 67 65 74 73 28 29 3a 0a 2a 2a 0a ike fgets():.**.
29b0: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 ** Read a single
29c0: 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 69 line of input i
29d0: 6e 74 6f 20 73 5b 5d 2e 20 20 45 6e 73 75 72 65 nto s[]. Ensure
29e0: 20 74 68 61 74 20 73 5b 5d 20 69 73 20 7a 65 72 that s[] is zer
29f0: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a o-terminated..**
2a00: 20 54 68 65 20 73 5b 5d 20 62 75 66 66 65 72 20 The s[] buffer
2a10: 69 73 20 73 69 7a 65 20 62 79 74 65 73 20 61 6e is size bytes an
2a20: 64 20 73 6f 20 61 74 20 6d 6f 73 74 20 73 69 7a d so at most siz
2a30: 65 2d 31 20 62 79 74 65 73 20 77 69 6c 6c 20 62 e-1 bytes will b
2a40: 65 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 e read..**.** Re
2a50: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 turn a pointer t
2a60: 6f 20 73 5b 5d 20 6f 6e 20 73 75 63 63 65 73 73 o s[] on success
2a70: 2c 20 6f 72 20 4e 55 4c 4c 20 61 74 20 65 6e 64 , or NULL at end
2a80: 2d 6f 66 2d 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 -of-input..*/.st
2a90: 61 74 69 63 20 63 68 61 72 20 2a 63 67 69 5f 66 atic char *cgi_f
2aa0: 67 65 74 73 28 63 68 61 72 20 2a 73 2c 20 69 6e gets(char *s, in
2ab0: 74 20 73 69 7a 65 29 7b 0a 20 20 69 66 28 20 21 t size){. if( !
2ac0: 67 2e 68 74 74 70 55 73 65 53 53 4c 20 29 7b 0a g.httpUseSSL ){.
2ad0: 20 20 20 20 72 65 74 75 72 6e 20 66 67 65 74 73 return fgets
2ae0: 28 73 2c 20 73 69 7a 65 2c 20 67 2e 68 74 74 70 (s, size, g.http
2af0: 49 6e 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 In);. }.#ifdef
2b00: 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 53 53 FOSSIL_ENABLE_SS
2b10: 4c 0a 20 20 72 65 74 75 72 6e 20 73 73 6c 5f 67 L. return ssl_g
2b20: 65 74 73 28 67 2e 68 74 74 70 53 53 4c 43 6f 6e ets(g.httpSSLCon
2b30: 6e 2c 20 73 2c 20 73 69 7a 65 29 3b 0a 23 65 6c n, s, size);.#el
2b40: 73 65 0a 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 se. fossil_fata
2b50: 6c 28 22 53 53 4c 20 6e 6f 74 20 61 76 61 69 6c l("SSL not avail
2b60: 61 62 6c 65 22 29 3b 0a 23 65 6e 64 69 66 0a 7d able");.#endif.}
2b70: 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 ../* Works like
2b80: 66 72 65 61 64 28 29 3a 0a 2a 2a 0a 2a 2a 20 52 fread():.**.** R
2b90: 65 61 64 20 61 73 20 6d 61 6e 79 20 61 73 20 62 ead as many as b
2ba0: 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 ytes of content
2bb0: 61 73 20 77 65 20 63 61 6e 2c 20 75 70 20 74 6f as we can, up to
2bc0: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 6d a maximum of nm
2bd0: 65 6d 62 0a 2a 2a 20 62 79 74 65 73 2e 20 20 52 emb.** bytes. R
2be0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 eturn the number
2bf0: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 20 of bytes read.
2c00: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 Return 0 if the
2c10: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 66 75 72 74 re is no.** furt
2c20: 68 65 72 20 69 6e 70 75 74 20 6f 72 20 69 66 20 her input or if
2c30: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 an I/O error occ
2c40: 75 72 73 2e 0a 2a 2f 0a 73 69 7a 65 5f 74 20 63 urs..*/.size_t c
2c50: 67 69 5f 66 72 65 61 64 28 76 6f 69 64 20 2a 70 gi_fread(void *p
2c60: 74 72 2c 20 73 69 7a 65 5f 74 20 6e 6d 65 6d 62 tr, size_t nmemb
2c70: 29 7b 0a 20 20 69 66 28 20 21 67 2e 68 74 74 70 ){. if( !g.http
2c80: 55 73 65 53 53 4c 20 29 7b 0a 20 20 20 20 72 65 UseSSL ){. re
2c90: 74 75 72 6e 20 66 72 65 61 64 28 70 74 72 2c 20 turn fread(ptr,
2ca0: 31 2c 20 6e 6d 65 6d 62 2c 20 67 2e 68 74 74 70 1, nmemb, g.http
2cb0: 49 6e 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 In);. }.#ifdef
2cc0: 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 53 53 FOSSIL_ENABLE_SS
2cd0: 4c 0a 20 20 72 65 74 75 72 6e 20 73 73 6c 5f 72 L. return ssl_r
2ce0: 65 61 64 5f 73 65 72 76 65 72 28 67 2e 68 74 74 ead_server(g.htt
2cf0: 70 53 53 4c 43 6f 6e 6e 2c 20 70 74 72 2c 20 6e pSSLConn, ptr, n
2d00: 6d 65 6d 62 2c 20 31 29 3b 0a 23 65 6c 73 65 0a memb, 1);.#else.
2d10: 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 fossil_fatal("
2d20: 53 53 4c 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c SSL not availabl
2d30: 65 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f e");.#endif.}../
2d40: 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 66 65 6f * Works like feo
2d50: 66 28 29 3a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 f():.**.** Retur
2d60: 6e 20 74 72 75 65 20 69 66 20 65 6e 64 2d 6f 66 n true if end-of
2d70: 2d 69 6e 70 75 74 20 68 61 73 20 62 65 65 6e 20 -input has been
2d80: 72 65 61 63 68 65 64 2e 0a 2a 2f 0a 69 6e 74 20 reached..*/.int
2d90: 63 67 69 5f 66 65 6f 66 28 76 6f 69 64 29 7b 0a cgi_feof(void){.
2da0: 20 20 69 66 28 20 21 67 2e 68 74 74 70 55 73 65 if( !g.httpUse
2db0: 53 53 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 SSL ){. retur
2dc0: 6e 20 66 65 6f 66 28 67 2e 68 74 74 70 49 6e 29 n feof(g.httpIn)
2dd0: 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 46 4f 53 ;. }.#ifdef FOS
2de0: 53 49 4c 5f 45 4e 41 42 4c 45 5f 53 53 4c 0a 20 SIL_ENABLE_SSL.
2df0: 20 72 65 74 75 72 6e 20 73 73 6c 5f 65 6f 66 28 return ssl_eof(
2e00: 67 2e 68 74 74 70 53 53 4c 43 6f 6e 6e 29 3b 0a g.httpSSLConn);.
2e10: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 #else. return 1
2e20: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 57 ;.#endif.}../* W
2e30: 6f 72 6b 73 20 6c 69 6b 65 20 66 77 72 69 74 65 orks like fwrite
2e40: 28 29 3a 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f ():.**.** Try to
2e50: 20 6f 75 74 70 75 74 20 6e 6d 65 6d 62 20 62 79 output nmemb by
2e60: 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2e 20 tes of content.
2e70: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 Return the numb
2e80: 65 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 61 er of.** bytes a
2e90: 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 2e ctually written.
2ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 69 7a 65 5f .*/.static size_
2eb0: 74 20 63 67 69 5f 66 77 72 69 74 65 28 76 6f 69 t cgi_fwrite(voi
2ec0: 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f 74 20 6e d *ptr, size_t n
2ed0: 6d 65 6d 62 29 7b 0a 20 20 69 66 28 20 21 67 2e memb){. if( !g.
2ee0: 68 74 74 70 55 73 65 53 53 4c 20 29 7b 0a 20 20 httpUseSSL ){.
2ef0: 20 20 72 65 74 75 72 6e 20 66 77 72 69 74 65 28 return fwrite(
2f00: 70 74 72 2c 20 31 2c 20 6e 6d 65 6d 62 2c 20 67 ptr, 1, nmemb, g
2f10: 2e 68 74 74 70 4f 75 74 29 3b 0a 20 20 7d 0a 23 .httpOut);. }.#
2f20: 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 ifdef FOSSIL_ENA
2f30: 42 4c 45 5f 53 53 4c 0a 20 20 72 65 74 75 72 6e BLE_SSL. return
2f40: 20 73 73 6c 5f 77 72 69 74 65 5f 73 65 72 76 65 ssl_write_serve
2f50: 72 28 67 2e 68 74 74 70 53 53 4c 43 6f 6e 6e 2c r(g.httpSSLConn,
2f60: 20 70 74 72 2c 20 6e 6d 65 6d 62 29 3b 0a 23 65 ptr, nmemb);.#e
2f70: 6c 73 65 0a 20 20 66 6f 73 73 69 6c 5f 66 61 74 lse. fossil_fat
2f80: 61 6c 28 22 53 53 4c 20 6e 6f 74 20 61 76 61 69 al("SSL not avai
2f90: 6c 61 62 6c 65 22 29 3b 0a 23 65 6e 64 69 66 0a lable");.#endif.
2fa0: 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 }../* Works like
2fb0: 20 66 66 6c 75 73 68 28 29 3a 0a 2a 2a 0a 2a 2a fflush():.**.**
2fc0: 20 4d 61 6b 65 20 73 75 72 65 20 49 2f 4f 20 68 Make sure I/O h
2fd0: 61 73 20 63 6f 6d 70 6c 65 74 65 64 2e 0a 2a 2f as completed..*/
2fe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 67 69 .static void cgi
2ff0: 5f 66 66 6c 75 73 68 28 76 6f 69 64 29 7b 0a 20 _fflush(void){.
3000: 20 69 66 28 20 21 67 2e 68 74 74 70 55 73 65 53 if( !g.httpUseS
3010: 53 4c 20 29 7b 0a 20 20 20 20 66 66 6c 75 73 68 SL ){. fflush
3020: 28 67 2e 68 74 74 70 4f 75 74 29 3b 0a 20 20 7d (g.httpOut);. }
3030: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 .}.../*.** Gener
3040: 61 74 65 20 74 68 65 20 72 65 70 6c 79 20 74 6f ate the reply to
3050: 20 61 20 77 65 62 20 72 65 71 75 65 73 74 2e 20 a web request.
3060: 20 54 68 65 20 6f 75 74 70 75 74 20 6d 69 67 68 The output migh
3070: 74 20 62 65 20 61 6e 0a 2a 2a 20 66 75 6c 6c 20 t be an.** full
3080: 48 54 54 50 20 72 65 73 70 6f 6e 73 65 2c 20 6f HTTP response, o
3090: 72 20 61 20 43 47 49 20 72 65 73 70 6f 6e 73 65 r a CGI response
30a0: 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 68 , depending on h
30b0: 6f 77 20 74 68 69 6e 67 73 20 68 61 76 65 0a 2a ow things have.*
30c0: 2a 20 62 65 20 73 65 74 20 75 70 2e 0a 2a 2a 0a * be set up..**.
30d0: 2a 2a 20 54 68 65 20 72 65 70 6c 79 20 63 6f 6e ** The reply con
30e0: 73 69 73 74 73 20 6f 66 20 61 20 72 65 73 70 6f sists of a respo
30f0: 6e 73 65 20 68 65 61 64 65 72 20 28 61 6e 20 48 nse header (an H
3100: 54 54 50 20 6f 72 20 43 47 49 20 72 65 73 70 6f TTP or CGI respo
3110: 6e 73 65 20 68 65 61 64 65 72 29 0a 2a 2a 20 66 nse header).** f
3120: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 ollowed by the c
3130: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 oncatenation of
3140: 74 68 65 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 the content head
3150: 65 72 20 61 6e 64 20 63 6f 6e 74 65 6e 74 20 62 er and content b
3160: 6f 64 79 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 ody..*/.void cgi
3170: 5f 72 65 70 6c 79 28 76 6f 69 64 29 7b 0a 20 20 _reply(void){.
3180: 42 6c 6f 62 20 68 64 72 20 3d 20 42 4c 4f 42 5f Blob hdr = BLOB_
3190: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 20 20 69 INITIALIZER;. i
31a0: 6e 74 20 74 6f 74 61 6c 5f 73 69 7a 65 3b 0a 20 nt total_size;.
31b0: 20 69 66 28 20 69 52 65 70 6c 79 53 74 61 74 75 if( iReplyStatu
31c0: 73 3c 3d 30 20 29 7b 0a 20 20 20 20 69 52 65 70 s<=0 ){. iRep
31d0: 6c 79 53 74 61 74 75 73 20 3d 20 32 30 30 3b 0a lyStatus = 200;.
31e0: 20 20 20 20 7a 52 65 70 6c 79 53 74 61 74 75 73 zReplyStatus
31f0: 20 3d 20 22 4f 4b 22 3b 0a 20 20 7d 0a 0a 20 20 = "OK";. }..
3200: 69 66 28 20 67 2e 66 75 6c 6c 48 74 74 70 52 65 if( g.fullHttpRe
3210: 70 6c 79 20 29 7b 0a 20 20 20 20 69 66 28 20 72 ply ){. if( r
3220: 61 6e 67 65 45 6e 64 3e 30 0a 20 20 20 20 20 26 angeEnd>0. &
3230: 26 20 69 52 65 70 6c 79 53 74 61 74 75 73 3d 3d & iReplyStatus==
3240: 32 30 30 20 0a 20 20 20 20 20 26 26 20 66 6f 73 200 . && fos
3250: 73 69 6c 5f 73 74 72 63 6d 70 28 50 28 22 52 45 sil_strcmp(P("RE
3260: 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 29 2c 22 QUEST_METHOD"),"
3270: 47 45 54 22 29 3d 3d 30 0a 20 20 20 20 29 7b 0a GET")==0. ){.
3280: 20 20 20 20 20 20 69 52 65 70 6c 79 53 74 61 74 iReplyStat
3290: 75 73 20 3d 20 32 30 36 3b 0a 20 20 20 20 20 20 us = 206;.
32a0: 7a 52 65 70 6c 79 53 74 61 74 75 73 20 3d 20 22 zReplyStatus = "
32b0: 50 61 72 74 69 61 6c 20 43 6f 6e 74 65 6e 74 22 Partial Content"
32c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 ;. }. blob
32d0: 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20 22 _appendf(&hdr, "
32e0: 48 54 54 50 2f 31 2e 30 20 25 64 20 25 73 5c 72 HTTP/1.0 %d %s\r
32f0: 5c 6e 22 2c 20 69 52 65 70 6c 79 53 74 61 74 75 \n", iReplyStatu
3300: 73 2c 20 7a 52 65 70 6c 79 53 74 61 74 75 73 29 s, zReplyStatus)
3310: 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e ;. blob_appen
3320: 64 66 28 26 68 64 72 2c 20 22 44 61 74 65 3a 20 df(&hdr, "Date:
3330: 25 73 5c 72 5c 6e 22 2c 20 63 67 69 5f 72 66 63 %s\r\n", cgi_rfc
3340: 38 32 32 5f 64 61 74 65 73 74 61 6d 70 28 74 69 822_datestamp(ti
3350: 6d 65 28 30 29 29 29 3b 0a 20 20 20 20 62 6c 6f me(0)));. blo
3360: 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20 b_appendf(&hdr,
3370: 22 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f "Connection: clo
3380: 73 65 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 62 6c se\r\n");. bl
3390: 6f 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c ob_appendf(&hdr,
33a0: 20 22 58 2d 55 41 2d 43 6f 6d 70 61 74 69 62 6c "X-UA-Compatibl
33b0: 65 3a 20 49 45 3d 65 64 67 65 5c 72 5c 6e 22 29 e: IE=edge\r\n")
33c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 ;. }else{. a
33d0: 73 73 65 72 74 28 20 72 61 6e 67 65 45 6e 64 3d ssert( rangeEnd=
33e0: 3d 30 20 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 =0 );. blob_a
33f0: 70 70 65 6e 64 66 28 26 68 64 72 2c 20 22 53 74 ppendf(&hdr, "St
3400: 61 74 75 73 3a 20 25 64 20 25 73 5c 72 5c 6e 22 atus: %d %s\r\n"
3410: 2c 20 69 52 65 70 6c 79 53 74 61 74 75 73 2c 20 , iReplyStatus,
3420: 7a 52 65 70 6c 79 53 74 61 74 75 73 29 3b 0a 20 zReplyStatus);.
3430: 20 7d 0a 20 20 69 66 28 20 65 74 61 67 5f 74 61 }. if( etag_ta
3440: 67 28 29 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 g()[0]!=0 ){.
3450: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 68 blob_appendf(&h
3460: 64 72 2c 20 22 45 54 61 67 3a 20 25 73 5c 72 5c dr, "ETag: %s\r\
3470: 6e 22 2c 20 65 74 61 67 5f 74 61 67 28 29 29 3b n", etag_tag());
3480: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 . blob_append
3490: 66 28 26 68 64 72 2c 20 22 43 61 63 68 65 2d 43 f(&hdr, "Cache-C
34a0: 6f 6e 74 72 6f 6c 3a 20 6d 61 78 2d 61 67 65 3d ontrol: max-age=
34b0: 25 64 5c 72 5c 6e 22 2c 20 65 74 61 67 5f 6d 61 %d\r\n", etag_ma
34c0: 78 61 67 65 28 29 29 3b 0a 20 20 20 20 69 66 28 xage());. if(
34d0: 20 65 74 61 67 5f 6d 74 69 6d 65 28 29 3e 30 20 etag_mtime()>0
34e0: 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 ){. blob_ap
34f0: 70 65 6e 64 66 28 26 68 64 72 2c 20 22 4c 61 73 pendf(&hdr, "Las
3500: 74 2d 4d 6f 64 69 66 69 65 64 3a 20 25 73 5c 72 t-Modified: %s\r
3510: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 \n",.
3520: 20 20 20 63 67 69 5f 72 66 63 38 32 32 5f 64 61 cgi_rfc822_da
3530: 74 65 73 74 61 6d 70 28 65 74 61 67 5f 6d 74 69 testamp(etag_mti
3540: 6d 65 28 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 me()));. }.
3550: 7d 65 6c 73 65 20 69 66 28 20 67 2e 69 73 43 6f }else if( g.isCo
3560: 6e 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 69 73 nst ){. /* is
3570: 43 6f 6e 73 74 20 6d 65 61 6e 73 20 74 68 61 74 Const means that
3580: 20 74 68 65 20 72 65 70 6c 79 20 69 73 20 67 75 the reply is gu
3590: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 69 aranteed to be i
35a0: 6e 76 61 72 69 61 6e 74 2c 20 65 76 65 6e 0a 20 nvariant, even.
35b0: 20 20 20 2a 2a 20 61 66 74 65 72 20 63 6f 6e 66 ** after conf
35c0: 69 67 75 72 61 74 69 6f 6e 20 63 68 61 6e 67 65 iguration change
35d0: 73 20 61 6e 64 2f 6f 72 20 46 6f 73 73 69 6c 20 s and/or Fossil
35e0: 62 69 6e 61 72 79 20 72 65 63 6f 6d 70 69 6c 65 binary recompile
35f0: 73 2e 20 2a 2f 0a 20 20 20 20 62 6c 6f 62 5f 61 s. */. blob_a
3600: 70 70 65 6e 64 66 28 26 68 64 72 2c 20 22 43 61 ppendf(&hdr, "Ca
3610: 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6d 61 78 che-Control: max
3620: 2d 61 67 65 3d 33 31 35 33 36 30 30 30 30 2c 20 -age=315360000,
3630: 69 6d 6d 75 74 61 62 6c 65 5c 72 5c 6e 22 29 3b immutable\r\n");
3640: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c . }else{. bl
3650: 6f 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c ob_appendf(&hdr,
3660: 20 22 43 61 63 68 65 2d 63 6f 6e 74 72 6f 6c 3a "Cache-control:
3670: 20 6e 6f 2d 63 61 63 68 65 5c 72 5c 6e 22 29 3b no-cache\r\n");
3680: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 . }.. if( blob
3690: 5f 73 69 7a 65 28 26 65 78 74 72 61 48 65 61 64 _size(&extraHead
36a0: 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 62 6c 6f er)>0 ){. blo
36b0: 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20 b_appendf(&hdr,
36c0: 22 25 73 22 2c 20 62 6c 6f 62 5f 62 75 66 66 65 "%s", blob_buffe
36d0: 72 28 26 65 78 74 72 61 48 65 61 64 65 72 29 29 r(&extraHeader))
36e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 ;. }.. /* Add
36f0: 68 65 61 64 65 72 73 20 74 6f 20 74 75 72 6e 20 headers to turn
3700: 6f 6e 20 75 73 65 66 75 6c 20 73 65 63 75 72 69 on useful securi
3710: 74 79 20 6f 70 74 69 6f 6e 73 20 69 6e 20 62 72 ty options in br
3720: 6f 77 73 65 72 73 2e 20 2a 2f 0a 20 20 62 6c 6f owsers. */. blo
3730: 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20 b_appendf(&hdr,
3740: 22 58 2d 46 72 61 6d 65 2d 4f 70 74 69 6f 6e 73 "X-Frame-Options
3750: 3a 20 53 41 4d 45 4f 52 49 47 49 4e 5c 72 5c 6e : SAMEORIGIN\r\n
3760: 22 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 73 74 ");. /* This st
3770: 6f 70 73 20 66 6f 73 73 69 6c 20 70 61 67 65 73 ops fossil pages
3780: 20 61 70 70 65 61 72 69 6e 67 20 69 6e 20 66 72 appearing in fr
3790: 61 6d 65 73 20 6f 72 20 69 66 72 61 6d 65 73 2c ames or iframes,
37a0: 20 70 72 65 76 65 6e 74 69 6e 67 0a 20 20 2a 2a preventing. **
37b0: 20 63 6c 69 63 6b 2d 6a 61 63 6b 69 6e 67 20 61 click-jacking a
37c0: 74 74 61 63 6b 73 20 6f 6e 20 73 75 70 70 6f 72 ttacks on suppor
37d0: 74 69 6e 67 20 62 72 6f 77 73 65 72 73 2e 0a 20 ting browsers..
37e0: 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 20 67 **. ** Other g
37f0: 6f 6f 64 20 68 65 61 64 65 72 73 20 77 6f 75 6c ood headers woul
3800: 64 20 62 65 0a 20 20 2a 2a 20 20 20 53 74 72 69 d be. ** Stri
3810: 63 74 2d 54 72 61 6e 73 70 6f 72 74 2d 53 65 63 ct-Transport-Sec
3820: 75 72 69 74 79 3a 20 6d 61 78 2d 61 67 65 3d 36 urity: max-age=6
3830: 32 32 30 38 30 30 30 0a 20 20 2a 2a 20 69 66 20 2208000. ** if
3840: 77 65 27 72 65 20 75 73 69 6e 67 20 68 74 74 70 we're using http
3850: 73 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 s. However, this
3860: 20 77 6f 75 6c 64 20 62 72 65 61 6b 20 73 69 74 would break sit
3870: 65 73 20 77 68 69 63 68 20 73 65 72 76 65 20 64 es which serve d
3880: 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 63 6f ifferent. ** co
3890: 6e 74 65 6e 74 20 6f 6e 20 68 74 74 70 20 61 6e ntent on http an
38a0: 64 20 68 74 74 70 73 20 70 72 6f 74 6f 63 6f 6c d https protocol
38b0: 73 2e 20 41 6c 73 6f 2c 0a 20 20 2a 2a 20 20 20 s. Also,. **
38c0: 58 2d 43 6f 6e 74 65 6e 74 2d 53 65 63 75 72 69 X-Content-Securi
38d0: 74 79 2d 50 6f 6c 69 63 79 3a 20 61 6c 6c 6f 77 ty-Policy: allow
38e0: 20 27 73 65 6c 66 27 0a 20 20 2a 2a 20 77 6f 75 'self'. ** wou
38f0: 6c 64 20 68 65 6c 70 20 6d 69 74 69 67 61 74 65 ld help mitigate
3900: 20 73 6f 6d 65 20 58 53 53 20 61 6e 64 20 64 61 some XSS and da
3910: 74 61 20 69 6e 6a 65 63 74 69 6f 6e 20 61 74 74 ta injection att
3920: 61 63 6b 73 2c 20 62 75 74 20 77 69 6c 6c 20 62 acks, but will b
3930: 72 65 61 6b 0a 20 20 2a 2a 20 64 65 6c 69 62 65 reak. ** delibe
3940: 72 61 74 65 20 69 6e 63 6c 75 73 69 6f 6e 20 6f rate inclusion o
3950: 66 20 65 78 74 65 72 6e 61 6c 20 72 65 73 6f 75 f external resou
3960: 72 63 65 73 2c 20 73 75 63 68 20 61 73 20 4a 61 rces, such as Ja
3970: 76 61 53 63 72 69 70 74 20 73 79 6e 74 61 78 0a vaScript syntax.
3980: 20 20 2a 2a 20 68 69 67 68 6c 69 67 68 74 65 72 ** highlighter
3990: 20 73 63 72 69 70 74 73 2e 0a 20 20 2a 2a 0a 20 scripts.. **.
39a0: 20 2a 2a 20 54 68 65 73 65 20 68 65 61 64 65 72 ** These header
39b0: 73 20 61 72 65 20 70 72 6f 62 61 62 6c 79 20 62 s are probably b
39c0: 65 73 74 20 61 64 64 65 64 20 62 79 20 74 68 65 est added by the
39d0: 20 77 65 62 20 73 65 72 76 65 72 20 68 6f 73 74 web server host
39e0: 69 6e 67 20 66 6f 73 73 69 6c 20 61 73 0a 20 20 ing fossil as.
39f0: 2a 2a 20 61 20 43 47 49 20 73 63 72 69 70 74 2e ** a CGI script.
3a00: 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6e 74 . */.. /* Cont
3a10: 65 6e 74 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 ent intended for
3a20: 20 6c 6f 67 67 65 64 20 69 6e 20 75 73 65 72 73 logged in users
3a30: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 should only be
3a40: 63 61 63 68 65 64 20 69 6e 0a 20 20 2a 2a 20 74 cached in. ** t
3a50: 68 65 20 62 72 6f 77 73 65 72 2c 20 6e 6f 74 20 he browser, not
3a60: 73 6f 6d 65 20 73 68 61 72 65 64 20 6c 6f 63 61 some shared loca
3a70: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 tion.. */. if(
3a80: 20 69 52 65 70 6c 79 53 74 61 74 75 73 21 3d 33 iReplyStatus!=3
3a90: 30 34 20 29 20 7b 0a 20 20 20 20 62 6c 6f 62 5f 04 ) {. blob_
3aa0: 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20 22 43 appendf(&hdr, "C
3ab0: 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 25 73 3b ontent-Type: %s;
3ac0: 20 63 68 61 72 73 65 74 3d 75 74 66 2d 38 5c 72 charset=utf-8\r
3ad0: 5c 6e 22 2c 20 7a 43 6f 6e 74 65 6e 74 54 79 70 \n", zContentTyp
3ae0: 65 29 3b 0a 20 20 20 20 69 66 28 20 66 6f 73 73 e);. if( foss
3af0: 69 6c 5f 73 74 72 63 6d 70 28 7a 43 6f 6e 74 65 il_strcmp(zConte
3b00: 6e 74 54 79 70 65 2c 22 61 70 70 6c 69 63 61 74 ntType,"applicat
3b10: 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 22 29 3d 3d ion/x-fossil")==
3b20: 30 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 63 0 ){. cgi_c
3b30: 6f 6d 62 69 6e 65 5f 68 65 61 64 65 72 5f 61 6e ombine_header_an
3b40: 64 5f 62 6f 64 79 28 29 3b 0a 20 20 20 20 20 20 d_body();.
3b50: 62 6c 6f 62 5f 63 6f 6d 70 72 65 73 73 28 26 63 blob_compress(&c
3b60: 67 69 43 6f 6e 74 65 6e 74 5b 30 5d 2c 20 26 63 giContent[0], &c
3b70: 67 69 43 6f 6e 74 65 6e 74 5b 30 5d 29 3b 0a 20 giContent[0]);.
3b80: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 73 }.. if( is
3b90: 5f 67 7a 69 70 70 61 62 6c 65 28 29 20 26 26 20 _gzippable() &&
3ba0: 69 52 65 70 6c 79 53 74 61 74 75 73 21 3d 32 30 iReplyStatus!=20
3bb0: 36 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 6 ){. int i
3bc0: 3b 0a 20 20 20 20 20 20 67 7a 69 70 5f 62 65 67 ;. gzip_beg
3bd0: 69 6e 28 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 in(0);. for
3be0: 28 20 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 20 ( i=0; i<2; i++
3bf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 ){. int s
3c00: 69 7a 65 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 ize = blob_size(
3c10: 26 63 67 69 43 6f 6e 74 65 6e 74 5b 69 5d 29 3b &cgiContent[i]);
3c20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a . if( siz
3c30: 65 3e 30 20 29 20 67 7a 69 70 5f 73 74 65 70 28 e>0 ) gzip_step(
3c40: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 63 67 69 blob_buffer(&cgi
3c50: 43 6f 6e 74 65 6e 74 5b 69 5d 29 2c 20 73 69 7a Content[i]), siz
3c60: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 e);. blob
3c70: 5f 72 65 73 65 74 28 26 63 67 69 43 6f 6e 74 65 _reset(&cgiConte
3c80: 6e 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a nt[i]);. }.
3c90: 20 20 20 20 20 20 67 7a 69 70 5f 66 69 6e 69 73 gzip_finis
3ca0: 68 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 30 5d h(&cgiContent[0]
3cb0: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 );. blob_ap
3cc0: 70 65 6e 64 66 28 26 68 64 72 2c 20 22 43 6f 6e pendf(&hdr, "Con
3cd0: 74 65 6e 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 67 tent-Encoding: g
3ce0: 7a 69 70 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 20 zip\r\n");.
3cf0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 68 blob_appendf(&h
3d00: 64 72 2c 20 22 56 61 72 79 3a 20 41 63 63 65 70 dr, "Vary: Accep
3d10: 74 2d 45 6e 63 6f 64 69 6e 67 5c 72 5c 6e 22 29 t-Encoding\r\n")
3d20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 6f 74 61 ;. }. tota
3d30: 6c 5f 73 69 7a 65 20 3d 20 62 6c 6f 62 5f 73 69 l_size = blob_si
3d40: 7a 65 28 26 63 67 69 43 6f 6e 74 65 6e 74 5b 30 ze(&cgiContent[0
3d50: 5d 29 20 2b 20 62 6c 6f 62 5f 73 69 7a 65 28 26 ]) + blob_size(&
3d60: 63 67 69 43 6f 6e 74 65 6e 74 5b 31 5d 29 3b 0a cgiContent[1]);.
3d70: 20 20 20 20 69 66 28 20 69 52 65 70 6c 79 53 74 if( iReplySt
3d80: 61 74 75 73 3d 3d 32 30 36 20 29 7b 0a 20 20 20 atus==206 ){.
3d90: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
3da0: 26 68 64 72 2c 20 22 43 6f 6e 74 65 6e 74 2d 52 &hdr, "Content-R
3db0: 61 6e 67 65 3a 20 62 79 74 65 73 20 25 64 2d 25 ange: bytes %d-%
3dc0: 64 2f 25 64 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 d/%d\r\n",.
3dd0: 20 20 20 20 20 20 20 20 20 72 61 6e 67 65 53 74 rangeSt
3de0: 61 72 74 2c 20 72 61 6e 67 65 45 6e 64 2d 31 2c art, rangeEnd-1,
3df0: 20 74 6f 74 61 6c 5f 73 69 7a 65 29 3b 0a 20 20 total_size);.
3e00: 20 20 20 20 74 6f 74 61 6c 5f 73 69 7a 65 20 3d total_size =
3e10: 20 72 61 6e 67 65 45 6e 64 20 2d 20 72 61 6e 67 rangeEnd - rang
3e20: 65 53 74 61 72 74 3b 20 0a 20 20 20 20 7d 0a 20 eStart; . }.
3e30: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
3e40: 26 68 64 72 2c 20 22 43 6f 6e 74 65 6e 74 2d 4c &hdr, "Content-L
3e50: 65 6e 67 74 68 3a 20 25 64 5c 72 5c 6e 22 2c 20 ength: %d\r\n",
3e60: 74 6f 74 61 6c 5f 73 69 7a 65 29 3b 0a 20 20 7d total_size);. }
3e70: 65 6c 73 65 7b 0a 20 20 20 20 74 6f 74 61 6c 5f else{. total_
3e80: 73 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 size = 0;. }.
3e90: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 68 64 blob_appendf(&hd
3ea0: 72 2c 20 22 5c 72 5c 6e 22 29 3b 0a 20 20 63 67 r, "\r\n");. cg
3eb0: 69 5f 66 77 72 69 74 65 28 62 6c 6f 62 5f 62 75 i_fwrite(blob_bu
3ec0: 66 66 65 72 28 26 68 64 72 29 2c 20 62 6c 6f 62 ffer(&hdr), blob
3ed0: 5f 73 69 7a 65 28 26 68 64 72 29 29 3b 0a 20 20 _size(&hdr));.
3ee0: 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 64 72 29 blob_reset(&hdr)
3ef0: 3b 0a 20 20 69 66 28 20 74 6f 74 61 6c 5f 73 69 ;. if( total_si
3f00: 7a 65 3e 30 0a 20 20 20 26 26 20 69 52 65 70 6c ze>0. && iRepl
3f10: 79 53 74 61 74 75 73 21 3d 33 30 34 0a 20 20 20 yStatus!=304.
3f20: 26 26 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 && fossil_strcmp
3f30: 28 50 28 22 52 45 51 55 45 53 54 5f 4d 45 54 48 (P("REQUEST_METH
3f40: 4f 44 22 29 2c 22 48 45 41 44 22 29 21 3d 30 0a OD"),"HEAD")!=0.
3f50: 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 ){. int i,
3f60: 73 69 7a 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d size;. for(i=
3f70: 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 0; i<2; i++){.
3f80: 20 20 20 20 73 69 7a 65 20 3d 20 62 6c 6f 62 5f size = blob_
3f90: 73 69 7a 65 28 26 63 67 69 43 6f 6e 74 65 6e 74 size(&cgiContent
3fa0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 [i]);. if(
3fb0: 73 69 7a 65 3c 3d 72 61 6e 67 65 53 74 61 72 74 size<=rangeStart
3fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 6e 67 ){. rang
3fd0: 65 53 74 61 72 74 20 2d 3d 20 73 69 7a 65 3b 0a eStart -= size;.
3fe0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
3ff0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 69 7a int n = siz
4000: 65 20 2d 20 72 61 6e 67 65 53 74 61 72 74 3b 0a e - rangeStart;.
4010: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 74 6f if( n>to
4020: 74 61 6c 5f 73 69 7a 65 20 29 7b 0a 20 20 20 20 tal_size ){.
4030: 20 20 20 20 20 20 6e 20 3d 20 74 6f 74 61 6c 5f n = total_
4040: 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a size;. }.
4050: 20 20 20 20 20 20 20 20 63 67 69 5f 66 77 72 69 cgi_fwri
4060: 74 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 te(blob_buffer(&
4070: 63 67 69 43 6f 6e 74 65 6e 74 5b 69 5d 29 2b 72 cgiContent[i])+r
4080: 61 6e 67 65 53 74 61 72 74 2c 20 6e 29 3b 0a 20 angeStart, n);.
4090: 20 20 20 20 20 20 20 72 61 6e 67 65 53 74 61 72 rangeStar
40a0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 t = 0;. t
40b0: 6f 74 61 6c 5f 73 69 7a 65 20 2d 3d 20 6e 3b 0a otal_size -= n;.
40c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
40d0: 7d 0a 20 20 63 67 69 5f 66 66 6c 75 73 68 28 29 }. cgi_fflush()
40e0: 3b 0a 20 20 43 47 49 44 45 42 55 47 28 28 22 2d ;. CGIDEBUG(("-
40f0: 2d 2d 2d 2d 2d 2d 2d 20 45 4e 44 20 63 67 69 20 ------- END cgi
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 29 3b 0a ---------\n"));.
4110: 0a 20 20 2f 2a 20 41 66 74 65 72 20 74 68 65 20 . /* After the
4120: 77 65 62 70 61 67 65 20 68 61 73 20 62 65 65 6e webpage has been
4130: 20 73 65 6e 74 2c 20 64 6f 20 61 6e 79 20 75 73 sent, do any us
4140: 65 66 75 6c 20 62 61 63 6b 67 72 6f 75 6e 64 0a eful background.
4150: 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e ** processing.
4160: 0a 20 20 2a 2f 0a 20 20 67 2e 63 67 69 4f 75 74 . */. g.cgiOut
4170: 70 75 74 20 3d 20 32 3b 0a 20 20 69 66 28 20 67 put = 2;. if( g
4180: 2e 64 62 21 3d 30 20 26 26 20 69 52 65 70 6c 79 .db!=0 && iReply
4190: 53 74 61 74 75 73 3d 3d 32 30 30 20 29 7b 0a 20 Status==200 ){.
41a0: 20 20 20 62 61 63 6b 6f 66 66 69 63 65 5f 63 68 backoffice_ch
41b0: 65 63 6b 5f 69 66 5f 6e 65 65 64 65 64 28 29 3b eck_if_needed();
41c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 . }.}../*.** Ge
41d0: 6e 65 72 61 74 65 20 61 6e 20 48 54 54 50 20 6f nerate an HTTP o
41e0: 72 20 43 47 49 20 72 65 64 69 72 65 63 74 20 72 r CGI redirect r
41f0: 65 73 70 6f 6e 73 65 20 74 68 61 74 20 63 61 75 esponse that cau
4200: 73 65 73 20 61 20 72 65 64 69 72 65 63 74 0a 2a ses a redirect.*
4210: 2a 20 74 6f 20 74 68 65 20 55 52 4c 20 67 69 76 * to the URL giv
4220: 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 en in the argume
4230: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 55 52 nt..**.** The UR
4240: 4c 20 6d 75 73 74 20 62 65 20 72 65 6c 61 74 69 L must be relati
4250: 76 65 20 74 6f 20 74 68 65 20 62 61 73 65 20 6f ve to the base o
4260: 66 20 74 68 65 20 66 6f 73 73 69 6c 20 73 65 72 f the fossil ser
4270: 76 65 72 2e 0a 2a 2f 0a 4e 4f 52 45 54 55 52 4e ver..*/.NORETURN
4280: 20 76 6f 69 64 20 63 67 69 5f 72 65 64 69 72 65 void cgi_redire
4290: 63 74 5f 77 69 74 68 5f 73 74 61 74 75 73 28 0a ct_with_status(.
42a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 const char *zU
42b0: 52 4c 2c 0a 20 20 69 6e 74 20 69 53 74 61 74 2c RL,. int iStat,
42c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
42d0: 53 74 61 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a Stat.){. char *
42e0: 7a 4c 6f 63 61 74 69 6f 6e 3b 0a 20 20 43 47 49 zLocation;. CGI
42f0: 44 45 42 55 47 28 28 22 72 65 64 69 72 65 63 74 DEBUG(("redirect
4300: 20 74 6f 20 25 73 5c 6e 22 2c 20 7a 55 52 4c 29 to %s\n", zURL)
4310: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 );. if( strncmp
4320: 28 7a 55 52 4c 2c 22 68 74 74 70 3a 22 2c 35 29 (zURL,"http:",5)
4330: 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a ==0 || strncmp(z
4340: 55 52 4c 2c 22 68 74 74 70 73 3a 22 2c 36 29 3d URL,"https:",6)=
4350: 3d 30 20 29 7b 0a 20 20 20 20 7a 4c 6f 63 61 74 =0 ){. zLocat
4360: 69 6f 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 4c ion = mprintf("L
4370: 6f 63 61 74 69 6f 6e 3a 20 25 73 5c 72 5c 6e 22 ocation: %s\r\n"
4380: 2c 20 7a 55 52 4c 29 3b 0a 20 20 7d 65 6c 73 65 , zURL);. }else
4390: 20 69 66 28 20 2a 7a 55 52 4c 3d 3d 27 2f 27 20 if( *zURL=='/'
43a0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 31 20 3d 20 ){. int n1 =
43b0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 67 2e 7a 42 (int)strlen(g.zB
43c0: 61 73 65 55 52 4c 29 3b 0a 20 20 20 20 69 6e 74 aseURL);. int
43d0: 20 6e 32 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 n2 = (int)strle
43e0: 6e 28 67 2e 7a 54 6f 70 29 3b 0a 20 20 20 20 69 n(g.zTop);. i
43f0: 66 28 20 67 2e 7a 42 61 73 65 55 52 4c 5b 6e 31 f( g.zBaseURL[n1
4400: 2d 31 5d 3d 3d 27 2f 27 20 29 20 7a 55 52 4c 2b -1]=='/' ) zURL+
4410: 2b 3b 0a 20 20 20 20 7a 4c 6f 63 61 74 69 6f 6e +;. zLocation
4420: 20 3d 20 6d 70 72 69 6e 74 66 28 22 4c 6f 63 61 = mprintf("Loca
4430: 74 69 6f 6e 3a 20 25 2e 2a 73 25 73 5c 72 5c 6e tion: %.*s%s\r\n
4440: 22 2c 20 6e 31 2d 6e 32 2c 20 67 2e 7a 42 61 73 ", n1-n2, g.zBas
4450: 65 55 52 4c 2c 20 7a 55 52 4c 29 3b 0a 20 20 7d eURL, zURL);. }
4460: 65 6c 73 65 7b 0a 20 20 20 20 7a 4c 6f 63 61 74 else{. zLocat
4470: 69 6f 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 4c ion = mprintf("L
4480: 6f 63 61 74 69 6f 6e 3a 20 25 73 2f 25 73 5c 72 ocation: %s/%s\r
4490: 5c 6e 22 2c 20 67 2e 7a 42 61 73 65 55 52 4c 2c \n", g.zBaseURL,
44a0: 20 7a 55 52 4c 29 3b 0a 20 20 7d 0a 20 20 63 67 zURL);. }. cg
44b0: 69 5f 61 70 70 65 6e 64 5f 68 65 61 64 65 72 28 i_append_header(
44c0: 7a 4c 6f 63 61 74 69 6f 6e 29 3b 0a 20 20 63 67 zLocation);. cg
44d0: 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 i_reset_content(
44e0: 29 3b 0a 20 20 63 67 69 5f 70 72 69 6e 74 66 28 );. cgi_printf(
44f0: 22 3c 68 74 6d 6c 3e 5c 6e 3c 70 3e 52 65 64 69 "<html>\n<p>Redi
4500: 72 65 63 74 20 74 6f 20 25 68 3c 2f 70 3e 5c 6e rect to %h</p>\n
4510: 3c 2f 68 74 6d 6c 3e 5c 6e 22 2c 20 7a 4c 6f 63 </html>\n", zLoc
4520: 61 74 69 6f 6e 29 3b 0a 20 20 63 67 69 5f 73 65 ation);. cgi_se
4530: 74 5f 73 74 61 74 75 73 28 69 53 74 61 74 2c 20 t_status(iStat,
4540: 7a 53 74 61 74 29 3b 0a 20 20 66 72 65 65 28 7a zStat);. free(z
4550: 4c 6f 63 61 74 69 6f 6e 29 3b 0a 20 20 63 67 69 Location);. cgi
4560: 5f 72 65 70 6c 79 28 29 3b 0a 20 20 66 6f 73 73 _reply();. foss
4570: 69 6c 5f 65 78 69 74 28 30 29 3b 0a 7d 0a 4e 4f il_exit(0);.}.NO
4580: 52 45 54 55 52 4e 20 76 6f 69 64 20 63 67 69 5f RETURN void cgi_
4590: 72 65 64 69 72 65 63 74 28 63 6f 6e 73 74 20 63 redirect(const c
45a0: 68 61 72 20 2a 7a 55 52 4c 29 7b 0a 20 20 63 67 har *zURL){. cg
45b0: 69 5f 72 65 64 69 72 65 63 74 5f 77 69 74 68 5f i_redirect_with_
45c0: 73 74 61 74 75 73 28 7a 55 52 4c 2c 20 33 30 32 status(zURL, 302
45d0: 2c 20 22 4d 6f 76 65 64 20 54 65 6d 70 6f 72 61 , "Moved Tempora
45e0: 72 69 6c 79 22 29 3b 0a 7d 0a 4e 4f 52 45 54 55 rily");.}.NORETU
45f0: 52 4e 20 76 6f 69 64 20 63 67 69 5f 72 65 64 69 RN void cgi_redi
4600: 72 65 63 74 5f 77 69 74 68 5f 6d 65 74 68 6f 64 rect_with_method
4610: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 52 (const char *zUR
4620: 4c 29 7b 0a 20 20 63 67 69 5f 72 65 64 69 72 65 L){. cgi_redire
4630: 63 74 5f 77 69 74 68 5f 73 74 61 74 75 73 28 7a ct_with_status(z
4640: 55 52 4c 2c 20 33 30 37 2c 20 22 54 65 6d 70 6f URL, 307, "Tempo
4650: 72 61 72 79 20 52 65 64 69 72 65 63 74 22 29 3b rary Redirect");
4660: 0a 7d 0a 4e 4f 52 45 54 55 52 4e 20 76 6f 69 64 .}.NORETURN void
4670: 20 63 67 69 5f 72 65 64 69 72 65 63 74 66 28 63 cgi_redirectf(c
4680: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
4690: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c at, ...){. va_l
46a0: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 ist ap;. va_sta
46b0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b rt(ap, zFormat);
46c0: 0a 20 20 63 67 69 5f 72 65 64 69 72 65 63 74 28 . cgi_redirect(
46d0: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 vmprintf(zFormat
46e0: 2c 20 61 70 29 29 3b 0a 20 20 76 61 5f 65 6e 64 , ap));. va_end
46f0: 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 (ap);.}../*.** A
4700: 64 64 20 61 20 22 43 6f 6e 74 65 6e 74 2d 64 69 dd a "Content-di
4710: 73 70 6f 73 69 74 69 6f 6e 3a 20 61 74 74 61 63 sposition: attac
4720: 68 6d 65 6e 74 3b 20 66 69 6c 65 6e 61 6d 65 3d hment; filename=
4730: 25 73 22 20 68 65 61 64 65 72 20 74 6f 20 74 68 %s" header to th
4740: 65 20 72 65 70 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 e reply..*/.void
4750: 20 63 67 69 5f 63 6f 6e 74 65 6e 74 5f 64 69 73 cgi_content_dis
4760: 70 6f 73 69 74 69 6f 6e 5f 66 69 6c 65 6e 61 6d position_filenam
4770: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 e(const char *zF
4780: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 ilename){. char
4790: 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b *z;. int i, n;
47a0: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 .. /*
47b0: 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 0123456789 1234
47c0: 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 56789 123456789
47d0: 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 123456789 123456
47e0: 2a 2f 0a 20 20 7a 20 3d 20 6d 70 72 69 6e 74 66 */. z = mprintf
47f0: 28 22 43 6f 6e 74 65 6e 74 2d 44 69 73 70 6f 73 ("Content-Dispos
4800: 69 74 69 6f 6e 3a 20 61 74 74 61 63 68 6d 65 6e ition: attachmen
4810: 74 3b 20 66 69 6c 65 6e 61 6d 65 3d 5c 22 25 73 t; filename=\"%s
4820: 5c 22 3b 5c 72 5c 6e 22 2c 0a 20 20 20 20 20 20 \";\r\n",.
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 fi
4840: 6c 65 5f 74 61 69 6c 28 7a 46 69 6c 65 6e 61 6d le_tail(zFilenam
4850: 65 29 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 e));. n = (int)
4860: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 66 6f 72 strlen(z);. for
4870: 28 69 3d 34 33 3b 20 69 3c 6e 2d 34 3b 20 69 2b (i=43; i<n-4; i+
4880: 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d +){. char c =
4890: 20 7a 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 66 z[i];. if( f
48a0: 6f 73 73 69 6c 5f 69 73 61 6c 6e 75 6d 28 63 29 ossil_isalnum(c)
48b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ) continue;.
48c0: 20 69 66 28 20 63 3d 3d 27 2e 27 20 7c 7c 20 63 if( c=='.' || c
48d0: 3d 3d 27 2d 27 20 7c 7c 20 63 3d 3d 27 2f 27 20 =='-' || c=='/'
48e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
48f0: 7a 5b 69 5d 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a z[i] = '_';. }.
4900: 20 20 63 67 69 5f 61 70 70 65 6e 64 5f 68 65 61 cgi_append_hea
4910: 64 65 72 28 7a 29 3b 0a 20 20 66 6f 73 73 69 6c der(z);. fossil
4920: 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a _free(z);.}../*.
4930: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 55 52 ** Return the UR
4940: 4c 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 L for the caller
4950: 2e 20 20 54 68 69 73 20 69 73 20 6f 62 74 61 69 . This is obtai
4960: 6e 65 64 20 66 72 6f 6d 20 65 69 74 68 65 72 20 ned from either
4970: 74 68 65 0a 2a 2a 20 22 72 65 66 65 72 65 72 22 the.** "referer"
4980: 20 43 47 49 20 70 61 72 61 6d 65 74 65 72 2c 20 CGI parameter,
4990: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 6f 72 if it exists, or
49a0: 20 74 68 65 20 48 54 54 50 5f 52 45 46 45 52 45 the HTTP_REFERE
49b0: 52 20 48 54 54 50 20 70 61 72 61 6d 65 74 65 72 R HTTP parameter
49c0: 2e 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 ..** If neither
49d0: 65 78 69 73 74 2c 20 72 65 74 75 72 6e 20 7a 44 exist, return zD
49e0: 65 66 61 75 6c 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 efault..*/.const
49f0: 20 63 68 61 72 20 2a 63 67 69 5f 72 65 66 65 72 char *cgi_refer
4a00: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a er(const char *z
4a10: 44 65 66 61 75 6c 74 29 7b 0a 20 20 63 6f 6e 73 Default){. cons
4a20: 74 20 63 68 61 72 20 2a 7a 52 65 66 20 3d 20 50 t char *zRef = P
4a30: 28 22 72 65 66 65 72 65 72 22 29 3b 0a 20 20 69 ("referer");. i
4a40: 66 28 20 7a 52 65 66 3d 3d 30 20 29 7b 0a 20 20 f( zRef==0 ){.
4a50: 20 20 7a 52 65 66 20 3d 20 50 28 22 48 54 54 50 zRef = P("HTTP
4a60: 5f 52 45 46 45 52 45 52 22 29 3b 0a 20 20 20 20 _REFERER");.
4a70: 69 66 28 20 7a 52 65 66 3d 3d 30 20 29 20 7a 52 if( zRef==0 ) zR
4a80: 65 66 20 3d 20 7a 44 65 66 61 75 6c 74 3b 0a 20 ef = zDefault;.
4a90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 66 }. return zRef
4aa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
4ab0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75 n true if the cu
4ac0: 72 72 65 6e 74 20 72 65 71 75 65 73 74 20 61 70 rrent request ap
4ad0: 70 65 61 72 73 20 74 6f 20 62 65 20 73 61 66 65 pears to be safe
4ae0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 43 72 6f 73 73 from a.** Cross
4af0: 2d 53 69 74 65 20 52 65 71 75 65 73 74 20 46 6f -Site Request Fo
4b00: 72 67 65 72 79 20 28 43 53 52 46 29 20 61 74 74 rgery (CSRF) att
4b10: 61 63 6b 2e 20 20 43 6f 6e 64 69 74 69 6f 6e 73 ack. Conditions
4b20: 20 74 68 61 74 20 6d 75 73 74 0a 2a 2a 20 62 65 that must.** be
4b30: 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a met:.**.** *
4b40: 20 20 20 54 68 65 20 48 54 54 50 5f 52 45 46 45 The HTTP_REFE
4b50: 52 45 52 20 6d 75 73 74 20 68 61 76 65 20 74 68 RER must have th
4b60: 65 20 73 61 6d 65 20 6f 72 69 67 69 6e 0a 2a 2a e same origin.**
4b70: 20 20 20 20 2a 20 20 20 54 68 65 20 52 45 51 55 * The REQU
4b80: 45 53 54 5f 4d 45 54 48 4f 44 20 6d 75 73 74 20 EST_METHOD must
4b90: 62 65 20 50 4f 53 54 20 2d 20 6f 72 20 72 65 71 be POST - or req
4ba0: 75 69 72 65 50 6f 73 74 3d 3d 30 0a 2a 2f 0a 69 uirePost==0.*/.i
4bb0: 6e 74 20 63 67 69 5f 63 73 72 66 5f 73 61 66 65 nt cgi_csrf_safe
4bc0: 28 69 6e 74 20 72 65 71 75 69 72 65 50 6f 73 74 (int requirePost
4bd0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
4be0: 2a 7a 52 65 66 20 3d 20 50 28 22 48 54 54 50 5f *zRef = P("HTTP_
4bf0: 52 45 46 45 52 45 52 22 29 3b 0a 20 20 69 6e 74 REFERER");. int
4c00: 20 6e 42 61 73 65 3b 0a 20 20 69 66 28 20 7a 52 nBase;. if( zR
4c10: 65 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 ef==0 ) return 0
4c20: 3b 0a 20 20 69 66 28 20 72 65 71 75 69 72 65 50 ;. if( requireP
4c30: 6f 73 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 ost ){. const
4c40: 20 63 68 61 72 20 2a 7a 4d 65 74 68 6f 64 20 3d char *zMethod =
4c50: 20 50 28 22 52 45 51 55 45 53 54 5f 4d 45 54 48 P("REQUEST_METH
4c60: 4f 44 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d OD");. if( zM
4c70: 65 74 68 6f 64 3d 3d 30 20 29 20 72 65 74 75 72 ethod==0 ) retur
4c80: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 72 n 0;. if( str
4c90: 63 6d 70 28 7a 4d 65 74 68 6f 64 2c 22 50 4f 53 cmp(zMethod,"POS
4ca0: 54 22 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 T")!=0 ) return
4cb0: 30 3b 0a 20 20 7d 0a 20 20 6e 42 61 73 65 20 3d 0;. }. nBase =
4cc0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 67 2e 7a (int)strlen(g.z
4cd0: 42 61 73 65 55 52 4c 29 3b 0a 20 20 69 66 28 20 BaseURL);. if(
4ce0: 73 74 72 6e 63 6d 70 28 67 2e 7a 42 61 73 65 55 strncmp(g.zBaseU
4cf0: 52 4c 2c 7a 52 65 66 2c 6e 42 61 73 65 29 21 3d RL,zRef,nBase)!=
4d00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 0 ) return 0;.
4d10: 69 66 28 20 7a 52 65 66 5b 6e 42 61 73 65 5d 21 if( zRef[nBase]!
4d20: 3d 30 20 26 26 20 7a 52 65 66 5b 6e 42 61 73 65 =0 && zRef[nBase
4d30: 5d 21 3d 27 2f 27 20 29 20 72 65 74 75 72 6e 20 ]!='/' ) return
4d40: 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0;. return 1;.}
4d50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 ../*.** Informat
4d60: 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 71 75 ion about all qu
4d70: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2c 20 ery parameters,
4d80: 70 6f 73 74 20 70 61 72 61 6d 65 74 65 72 2c 20 post parameter,
4d90: 63 6f 6f 6b 69 65 73 20 61 6e 64 0a 2a 2a 20 43 cookies and.** C
4da0: 47 49 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 GI environment v
4db0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 73 74 6f ariables are sto
4dc0: 72 65 64 20 69 6e 20 61 20 68 61 73 68 20 74 61 red in a hash ta
4dd0: 62 6c 65 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a ble as follows:.
4de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 41 */.static int nA
4df0: 6c 6c 6f 63 51 50 20 3d 20 30 3b 20 2f 2a 20 53 llocQP = 0; /* S
4e00: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 pace allocated f
4e10: 6f 72 20 61 50 61 72 61 6d 51 50 5b 5d 20 2a 2f or aParamQP[] */
4e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 55 73 65 .static int nUse
4e30: 64 51 50 20 3d 20 30 3b 20 20 2f 2a 20 53 70 61 dQP = 0; /* Spa
4e40: 63 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 ce actually used
4e50: 20 69 6e 20 61 50 61 72 61 6d 51 50 5b 5d 20 2a in aParamQP[] *
4e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 /.static int sor
4e70: 74 51 50 20 3d 20 30 3b 20 20 20 2f 2a 20 54 72 tQP = 0; /* Tr
4e80: 75 65 20 69 66 20 61 50 61 72 61 6d 51 50 5b 5d ue if aParamQP[]
4e90: 20 6e 65 65 64 73 20 73 6f 72 74 69 6e 67 20 2a needs sorting *
4ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 71 /.static int seq
4eb0: 51 50 20 3d 20 30 3b 20 20 20 20 2f 2a 20 53 65 QP = 0; /* Se
4ec0: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 73 20 2a quence numbers *
4ed0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 /.static struct
4ee0: 51 50 61 72 61 6d 20 7b 20 20 20 2f 2a 20 4f 6e QParam { /* On
4ef0: 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 e entry for each
4f00: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 query parameter
4f10: 20 6f 72 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 or cookie */.
4f20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
4f30: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 e; /* Par
4f40: 61 6d 65 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 ameter or cookie
4f50: 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 name */. const
4f60: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b 20 20 char *zValue;
4f70: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 /* Value of
4f80: 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d the query param
4f90: 65 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 20 2a eter or cookie *
4fa0: 2f 0a 20 20 69 6e 74 20 73 65 71 3b 20 20 20 20 /. int seq;
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
4fc0: 20 4f 72 64 65 72 20 6f 66 20 69 6e 73 65 72 74 Order of insert
4fd0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 69 73 ion */. char is
4fe0: 51 50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 QP;
4ff0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 71 /* True for q
5000: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 uery parameters
5010: 2a 2f 0a 20 20 63 68 61 72 20 63 54 61 67 3b 20 */. char cTag;
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
5030: 2a 20 54 61 67 20 6f 6e 20 71 75 65 72 79 20 70 * Tag on query p
5040: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 7d 20 2a arameters */.} *
5050: 61 50 61 72 61 6d 51 50 3b 20 20 20 20 20 20 20 aParamQP;
5060: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 /* An arra
5070: 79 20 6f 66 20 61 6c 6c 20 70 61 72 61 6d 65 74 y of all paramet
5080: 65 72 73 20 61 6e 64 20 63 6f 6f 6b 69 65 73 20 ers and cookies
5090: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e */../*.** Add an
50a0: 6f 74 68 65 72 20 71 75 65 72 79 20 70 61 72 61 other query para
50b0: 6d 65 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 20 meter or cookie
50c0: 74 6f 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 to the parameter
50d0: 20 73 65 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 69 set..** zName i
50e0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 s the name of th
50f0: 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 e query paramete
5100: 72 20 6f 72 20 63 6f 6f 6b 69 65 20 61 6e 64 20 r or cookie and
5110: 7a 56 61 6c 75 65 0a 2a 2a 20 69 73 20 69 74 73 zValue.** is its
5120: 20 66 75 6c 6c 79 20 64 65 63 6f 64 65 64 20 76 fully decoded v
5130: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d alue..**.** zNam
5140: 65 20 61 6e 64 20 7a 56 61 6c 75 65 20 61 72 65 e and zValue are
5150: 20 6e 6f 74 20 63 6f 70 69 65 64 20 61 6e 64 20 not copied and
5160: 6d 75 73 74 20 6e 6f 74 20 63 68 61 6e 67 65 20 must not change
5170: 6f 72 20 62 65 0a 2a 2a 20 64 65 61 6c 6c 6f 63 or be.** dealloc
5180: 61 74 65 64 20 61 66 74 65 72 20 74 68 69 73 20 ated after this
5190: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e routine returns.
51a0: 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 74 .*/.void cgi_set
51b0: 5f 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 _parameter_nocop
51c0: 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e y(const char *zN
51d0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ame, const char
51e0: 2a 7a 56 61 6c 75 65 2c 20 69 6e 74 20 69 73 51 *zValue, int isQ
51f0: 50 29 7b 0a 20 20 69 66 28 20 6e 41 6c 6c 6f 63 P){. if( nAlloc
5200: 51 50 3c 3d 6e 55 73 65 64 51 50 20 29 7b 0a 20 QP<=nUsedQP ){.
5210: 20 20 20 6e 41 6c 6c 6f 63 51 50 20 3d 20 6e 41 nAllocQP = nA
5220: 6c 6c 6f 63 51 50 2a 32 20 2b 20 31 30 3b 0a 20 llocQP*2 + 10;.
5230: 20 20 20 69 66 28 20 6e 41 6c 6c 6f 63 51 50 3e if( nAllocQP>
5240: 31 30 30 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 1000 ){. /*
5250: 20 50 72 65 76 65 6e 74 20 61 20 44 4f 53 20 73 Prevent a DOS s
5260: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 61 67 ervice attack ag
5270: 61 69 6e 73 74 20 74 68 65 20 66 72 61 6d 65 77 ainst the framew
5280: 6f 72 6b 20 2a 2f 0a 20 20 20 20 20 20 66 6f 73 ork */. fos
5290: 73 69 6c 5f 66 61 74 61 6c 28 22 54 6f 6f 20 6d sil_fatal("Too m
52a0: 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 any query parame
52b0: 74 65 72 73 22 29 3b 0a 20 20 20 20 7d 0a 20 20 ters");. }.
52c0: 20 20 61 50 61 72 61 6d 51 50 20 3d 20 66 6f 73 aParamQP = fos
52d0: 73 69 6c 5f 72 65 61 6c 6c 6f 63 28 20 61 50 61 sil_realloc( aPa
52e0: 72 61 6d 51 50 2c 20 6e 41 6c 6c 6f 63 51 50 2a ramQP, nAllocQP*
52f0: 73 69 7a 65 6f 66 28 61 50 61 72 61 6d 51 50 5b sizeof(aParamQP[
5300: 30 5d 29 20 29 3b 0a 20 20 7d 0a 20 20 61 50 61 0]) );. }. aPa
5310: 72 61 6d 51 50 5b 6e 55 73 65 64 51 50 5d 2e 7a ramQP[nUsedQP].z
5320: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 Name = zName;.
5330: 61 50 61 72 61 6d 51 50 5b 6e 55 73 65 64 51 50 aParamQP[nUsedQP
5340: 5d 2e 7a 56 61 6c 75 65 20 3d 20 7a 56 61 6c 75 ].zValue = zValu
5350: 65 3b 0a 20 20 69 66 28 20 67 2e 66 48 74 74 70 e;. if( g.fHttp
5360: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 66 70 72 Trace ){. fpr
5370: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 23 20 intf(stderr, "#
5380: 63 67 69 3a 20 25 73 20 3d 20 5b 25 73 5d 5c 6e cgi: %s = [%s]\n
5390: 22 2c 20 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 ", zName, zValue
53a0: 29 3b 0a 20 20 7d 0a 20 20 61 50 61 72 61 6d 51 );. }. aParamQ
53b0: 50 5b 6e 55 73 65 64 51 50 5d 2e 73 65 71 20 3d P[nUsedQP].seq =
53c0: 20 73 65 71 51 50 2b 2b 3b 0a 20 20 61 50 61 72 seqQP++;. aPar
53d0: 61 6d 51 50 5b 6e 55 73 65 64 51 50 5d 2e 69 73 amQP[nUsedQP].is
53e0: 51 50 20 3d 20 69 73 51 50 3b 0a 20 20 61 50 61 QP = isQP;. aPa
53f0: 72 61 6d 51 50 5b 6e 55 73 65 64 51 50 5d 2e 63 ramQP[nUsedQP].c
5400: 54 61 67 20 3d 20 30 3b 0a 20 20 6e 55 73 65 64 Tag = 0;. nUsed
5410: 51 50 2b 2b 3b 0a 20 20 73 6f 72 74 51 50 20 3d QP++;. sortQP =
5420: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 1;.}../*.** Add
5430: 20 61 6e 6f 74 68 65 72 20 71 75 65 72 79 20 70 another query p
5440: 61 72 61 6d 65 74 65 72 20 6f 72 20 63 6f 6f 6b arameter or cook
5450: 69 65 20 74 6f 20 74 68 65 20 70 61 72 61 6d 65 ie to the parame
5460: 74 65 72 20 73 65 74 2e 0a 2a 2a 20 7a 4e 61 6d ter set..** zNam
5470: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 e is the name of
5480: 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d the query param
5490: 65 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 20 61 eter or cookie a
54a0: 6e 64 20 7a 56 61 6c 75 65 0a 2a 2a 20 69 73 20 nd zValue.** is
54b0: 69 74 73 20 66 75 6c 6c 79 20 64 65 63 6f 64 65 its fully decode
54c0: 64 20 76 61 6c 75 65 2e 20 20 7a 4e 61 6d 65 20 d value. zName
54d0: 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64 will be modified
54e0: 20 74 6f 20 62 65 20 61 6e 0a 2a 2a 20 61 6c 6c to be an.** all
54f0: 20 6c 6f 77 65 72 63 61 73 65 20 73 74 72 69 6e lowercase strin
5500: 67 2e 0a 2a 2a 0a 2a 2a 20 7a 4e 61 6d 65 20 61 g..**.** zName a
5510: 6e 64 20 7a 56 61 6c 75 65 20 61 72 65 20 6e 6f nd zValue are no
5520: 74 20 63 6f 70 69 65 64 20 61 6e 64 20 6d 75 73 t copied and mus
5530: 74 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f 72 20 t not change or
5540: 62 65 0a 2a 2a 20 64 65 61 6c 6c 6f 63 61 74 65 be.** deallocate
5550: 64 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 d after this rou
5560: 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 20 20 54 tine returns. T
5570: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e his routine chan
5580: 67 65 73 0a 2a 2a 20 61 6c 6c 20 41 53 43 49 49 ges.** all ASCII
5590: 20 61 6c 70 68 61 62 65 74 69 63 20 63 68 61 72 alphabetic char
55a0: 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 acters in zName
55b0: 74 6f 20 6c 6f 77 65 72 20 63 61 73 65 2e 20 20 to lower case.
55c0: 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 6d 75 The.** caller mu
55d0: 73 74 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 st not change th
55e0: 65 6d 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 em back..*/.void
55f0: 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 cgi_set_paramet
5600: 65 72 5f 6e 6f 63 6f 70 79 5f 74 6f 6c 6f 77 65 er_nocopy_tolowe
5610: 72 28 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 r(. char *zName
5620: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ,. const char *
5630: 7a 56 61 6c 75 65 2c 0a 20 20 69 6e 74 20 69 73 zValue,. int is
5640: 51 50 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 QP.){. int i;.
5650: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b for(i=0; zName[
5660: 69 5d 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b i]; i++){ zName[
5670: 69 5d 20 3d 20 66 6f 73 73 69 6c 5f 74 6f 6c 6f i] = fossil_tolo
5680: 77 65 72 28 7a 4e 61 6d 65 5b 69 5d 29 3b 20 7d wer(zName[i]); }
5690: 0a 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d . cgi_set_param
56a0: 65 74 65 72 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d eter_nocopy(zNam
56b0: 65 2c 20 7a 56 61 6c 75 65 2c 20 69 73 51 50 29 e, zValue, isQP)
56c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 ;.}../*.** Add a
56d0: 6e 6f 74 68 65 72 20 71 75 65 72 79 20 70 61 72 nother query par
56e0: 61 6d 65 74 65 72 20 6f 72 20 63 6f 6f 6b 69 65 ameter or cookie
56f0: 20 74 6f 20 74 68 65 20 70 61 72 61 6d 65 74 65 to the paramete
5700: 72 20 73 65 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 r set..** zName
5710: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 is the name of t
5720: 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 he query paramet
5730: 65 72 20 6f 72 20 63 6f 6f 6b 69 65 20 61 6e 64 er or cookie and
5740: 20 7a 56 61 6c 75 65 0a 2a 2a 20 69 73 20 69 74 zValue.** is it
5750: 73 20 66 75 6c 6c 79 20 64 65 63 6f 64 65 64 20 s fully decoded
5760: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 43 6f 70 value..**.** Cop
5770: 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 66 20 ies are made of
5780: 62 6f 74 68 20 74 68 65 20 7a 4e 61 6d 65 20 61 both the zName a
5790: 6e 64 20 7a 56 61 6c 75 65 20 70 61 72 61 6d 65 nd zValue parame
57a0: 74 65 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 ters..*/.void cg
57b0: 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 72 28 i_set_parameter(
57c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
57d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a e, const char *z
57e0: 56 61 6c 75 65 29 7b 0a 20 20 63 67 69 5f 73 65 Value){. cgi_se
57f0: 74 5f 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f t_parameter_noco
5800: 70 79 28 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 py(fossil_strdup
5810: 28 7a 4e 61 6d 65 29 2c 66 6f 73 73 69 6c 5f 73 (zName),fossil_s
5820: 74 72 64 75 70 28 7a 56 61 6c 75 65 29 2c 20 30 trdup(zValue), 0
5830: 29 3b 0a 7d 0a 76 6f 69 64 20 63 67 69 5f 73 65 );.}.void cgi_se
5840: 74 5f 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 t_query_paramete
5850: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e r(const char *zN
5860: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ame, const char
5870: 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63 67 69 5f *zValue){. cgi_
5880: 73 65 74 5f 70 61 72 61 6d 65 74 65 72 5f 6e 6f set_parameter_no
5890: 63 6f 70 79 28 66 6f 73 73 69 6c 5f 73 74 72 64 copy(fossil_strd
58a0: 75 70 28 7a 4e 61 6d 65 29 2c 66 6f 73 73 69 6c up(zName),fossil
58b0: 5f 73 74 72 64 75 70 28 7a 56 61 6c 75 65 29 2c _strdup(zValue),
58c0: 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 1);.}../*.** Re
58d0: 70 6c 61 63 65 20 61 20 70 61 72 61 6d 65 74 65 place a paramete
58e0: 72 20 77 69 74 68 20 61 20 6e 65 77 20 76 61 6c r with a new val
58f0: 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f ue..*/.void cgi_
5900: 72 65 70 6c 61 63 65 5f 70 61 72 61 6d 65 74 65 replace_paramete
5910: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e r(const char *zN
5920: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ame, const char
5930: 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 *zValue){. int
5940: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c i;. for(i=0; i<
5950: 6e 55 73 65 64 51 50 3b 20 69 2b 2b 29 7b 0a 20 nUsedQP; i++){.
5960: 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 if( fossil_st
5970: 72 63 6d 70 28 61 50 61 72 61 6d 51 50 5b 69 5d rcmp(aParamQP[i]
5980: 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 .zName,zName)==0
5990: 20 29 7b 0a 20 20 20 20 20 20 61 50 61 72 61 6d ){. aParam
59a0: 51 50 5b 69 5d 2e 7a 56 61 6c 75 65 20 3d 20 7a QP[i].zValue = z
59b0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 72 65 74 Value;. ret
59c0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 urn;. }. }.
59d0: 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 cgi_set_paramet
59e0: 65 72 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d 65 2c er_nocopy(zName,
59f0: 20 7a 56 61 6c 75 65 2c 20 30 29 3b 0a 7d 0a 76 zValue, 0);.}.v
5a00: 6f 69 64 20 63 67 69 5f 72 65 70 6c 61 63 65 5f oid cgi_replace_
5a10: 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 query_parameter(
5a20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
5a30: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a e, const char *z
5a40: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 69 3b Value){. int i;
5a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 55 . for(i=0; i<nU
5a60: 73 65 64 51 50 3b 20 69 2b 2b 29 7b 0a 20 20 20 sedQP; i++){.
5a70: 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 if( fossil_strc
5a80: 6d 70 28 61 50 61 72 61 6d 51 50 5b 69 5d 2e 7a mp(aParamQP[i].z
5a90: 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 Name,zName)==0 )
5aa0: 7b 0a 20 20 20 20 20 20 61 50 61 72 61 6d 51 50 {. aParamQP
5ab0: 5b 69 5d 2e 7a 56 61 6c 75 65 20 3d 20 7a 56 61 [i].zValue = zVa
5ac0: 6c 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 lue;. asser
5ad0: 74 28 20 61 50 61 72 61 6d 51 50 5b 69 5d 2e 69 t( aParamQP[i].i
5ae0: 73 51 50 20 29 3b 0a 20 20 20 20 20 20 72 65 74 sQP );. ret
5af0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 urn;. }. }.
5b00: 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 cgi_set_paramet
5b10: 65 72 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d 65 2c er_nocopy(zName,
5b20: 20 7a 56 61 6c 75 65 2c 20 31 29 3b 0a 7d 0a 76 zValue, 1);.}.v
5b30: 6f 69 64 20 63 67 69 5f 72 65 70 6c 61 63 65 5f oid cgi_replace_
5b40: 71 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 5f query_parameter_
5b50: 74 6f 6c 6f 77 65 72 28 63 68 61 72 20 2a 7a 4e tolower(char *zN
5b60: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ame, const char
5b70: 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 *zValue){. int
5b80: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e i;. for(i=0; zN
5b90: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 20 7a 4e ame[i]; i++){ zN
5ba0: 61 6d 65 5b 69 5d 20 3d 20 66 6f 73 73 69 6c 5f ame[i] = fossil_
5bb0: 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 69 5d tolower(zName[i]
5bc0: 29 3b 20 7d 0a 20 20 63 67 69 5f 72 65 70 6c 61 ); }. cgi_repla
5bd0: 63 65 5f 71 75 65 72 79 5f 70 61 72 61 6d 65 74 ce_query_paramet
5be0: 65 72 28 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 er(zName, zValue
5bf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 );.}../*.** Dele
5c00: 74 65 20 61 20 70 61 72 61 6d 65 74 65 72 2e 0a te a parameter..
5c10: 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 64 65 6c 65 */.void cgi_dele
5c20: 74 65 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e te_parameter(con
5c30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b st char *zName){
5c40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 . int i;. for(
5c50: 69 3d 30 3b 20 69 3c 6e 55 73 65 64 51 50 3b 20 i=0; i<nUsedQP;
5c60: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 66 6f i++){. if( fo
5c70: 73 73 69 6c 5f 73 74 72 63 6d 70 28 61 50 61 72 ssil_strcmp(aPar
5c80: 61 6d 51 50 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e amQP[i].zName,zN
5c90: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ame)==0 ){.
5ca0: 20 2d 2d 6e 55 73 65 64 51 50 3b 0a 20 20 20 20 --nUsedQP;.
5cb0: 20 20 69 66 28 20 69 3c 6e 55 73 65 64 51 50 20 if( i<nUsedQP
5cc0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f ){. memmo
5cd0: 76 65 28 61 50 61 72 61 6d 51 50 2b 69 2c 20 61 ve(aParamQP+i, a
5ce0: 50 61 72 61 6d 51 50 2b 69 2b 31 2c 20 73 69 7a ParamQP+i+1, siz
5cf0: 65 6f 66 28 2a 61 50 61 72 61 6d 51 50 29 2a 28 eof(*aParamQP)*(
5d00: 6e 55 73 65 64 51 50 2d 69 29 29 3b 0a 20 20 20 nUsedQP-i));.
5d10: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 }. retur
5d20: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 n;. }. }.}.v
5d30: 6f 69 64 20 63 67 69 5f 64 65 6c 65 74 65 5f 71 oid cgi_delete_q
5d40: 75 65 72 79 5f 70 61 72 61 6d 65 74 65 72 28 63 uery_parameter(c
5d50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
5d60: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f ){. int i;. fo
5d70: 72 28 69 3d 30 3b 20 69 3c 6e 55 73 65 64 51 50 r(i=0; i<nUsedQP
5d80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 ; i++){. if(
5d90: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 61 50 fossil_strcmp(aP
5da0: 61 72 61 6d 51 50 5b 69 5d 2e 7a 4e 61 6d 65 2c aramQP[i].zName,
5db0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 zName)==0 ){.
5dc0: 20 20 20 61 73 73 65 72 74 28 20 61 50 61 72 61 assert( aPara
5dd0: 6d 51 50 5b 69 5d 2e 69 73 51 50 20 29 3b 0a 20 mQP[i].isQP );.
5de0: 20 20 20 20 20 2d 2d 6e 55 73 65 64 51 50 3b 0a --nUsedQP;.
5df0: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 55 73 65 if( i<nUse
5e00: 64 51 50 20 29 7b 0a 20 20 20 20 20 20 20 20 6d dQP ){. m
5e10: 65 6d 6d 6f 76 65 28 61 50 61 72 61 6d 51 50 2b emmove(aParamQP+
5e20: 69 2c 20 61 50 61 72 61 6d 51 50 2b 69 2b 31 2c i, aParamQP+i+1,
5e30: 20 73 69 7a 65 6f 66 28 2a 61 50 61 72 61 6d 51 sizeof(*aParamQ
5e40: 50 29 2a 28 6e 55 73 65 64 51 50 2d 69 29 29 3b P)*(nUsedQP-i));
5e50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 . }. r
5e60: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d eturn;. }. }
5e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
5e80: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 environment var
5e90: 61 69 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 74 aible value to t
5ea0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 73 65 74 he parameter set
5eb0: 2e 20 20 54 68 65 20 7a 4e 61 6d 65 0a 2a 2a 20 . The zName.**
5ec0: 70 6f 72 74 69 6f 6e 20 69 73 20 66 69 78 65 64 portion is fixed
5ed0: 20 62 75 74 20 61 20 63 6f 70 79 20 69 73 20 62 but a copy is b
5ee0: 65 20 6d 61 64 65 20 6f 66 20 7a 56 61 6c 75 65 e made of zValue
5ef0: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 73 65 ..*/.void cgi_se
5f00: 74 65 6e 76 28 63 6f 6e 73 74 20 63 68 61 72 20 tenv(const char
5f10: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 *zName, const ch
5f20: 61 72 20 2a 7a 56 61 6c 75 65 29 7b 0a 20 20 63 ar *zValue){. c
5f30: 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 72 gi_set_parameter
5f40: 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d 65 2c 20 66 _nocopy(zName, f
5f50: 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 7a 56 61 ossil_strdup(zVa
5f60: 6c 75 65 29 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a lue), 0);.}../*.
5f70: 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 ** Add a list of
5f80: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 query parameter
5f90: 73 20 6f 72 20 63 6f 6f 6b 69 65 73 20 74 6f 20 s or cookies to
5fa0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 73 65 the parameter se
5fb0: 74 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 70 61 t..**.** Each pa
5fc0: 72 61 6d 65 74 65 72 20 69 73 20 6f 66 20 74 68 rameter is of th
5fd0: 65 20 66 6f 72 6d 20 4e 41 4d 45 3d 56 41 4c 55 e form NAME=VALU
5fe0: 45 2e 20 20 42 6f 74 68 20 74 68 65 20 4e 41 4d E. Both the NAM
5ff0: 45 20 61 6e 64 20 74 68 65 0a 2a 2a 20 56 41 4c E and the.** VAL
6000: 55 45 20 6d 61 79 20 62 65 20 75 72 6c 2d 65 6e UE may be url-en
6010: 63 6f 64 65 64 20 28 22 2b 22 20 66 6f 72 20 73 coded ("+" for s
6020: 70 61 63 65 2c 20 22 25 48 48 22 20 66 6f 72 20 pace, "%HH" for
6030: 6f 74 68 65 72 20 73 70 65 63 69 61 6c 0a 2a 2a other special.**
6040: 20 63 68 61 72 61 63 74 65 72 73 29 2e 20 20 42 characters). B
6050: 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 ut this routine
6060: 61 73 73 75 6d 65 73 20 74 68 61 74 20 4e 41 4d assumes that NAM
6070: 45 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a E contains no.**
6080: 20 73 70 65 63 69 61 6c 20 63 68 61 72 61 63 74 special charact
6090: 65 72 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 er and therefore
60a0: 20 64 6f 65 73 20 6e 6f 74 20 64 65 63 6f 64 65 does not decode
60b0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 41 it..**.** If NA
60c0: 4d 45 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 ME begins with a
60d0: 6e 6f 74 68 65 72 20 6f 74 68 65 72 20 74 68 61 nother other tha
60e0: 6e 20 61 20 6c 6f 77 65 72 2d 63 61 73 65 20 6c n a lower-case l
60f0: 65 74 74 65 72 20 74 68 65 6e 0a 2a 2a 20 74 68 etter then.** th
6100: 65 20 65 6e 74 69 72 65 20 4e 41 4d 45 3d 56 41 e entire NAME=VA
6110: 4c 55 45 20 74 65 72 6d 20 69 73 20 69 67 6e 6f LUE term is igno
6120: 72 65 64 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a red. Hence:.**.
6130: 2a 2a 20 20 20 20 20 20 2a 20 20 63 6f 6f 6b 69 ** * cooki
6140: 65 73 20 61 6e 64 20 71 75 65 72 79 20 70 61 72 es and query par
6150: 61 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 ameters that hav
6160: 65 20 75 70 70 65 72 63 61 73 65 20 6e 61 6d 65 e uppercase name
6170: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 72 65 s.** are
6180: 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 ignored..**.**
6190: 20 20 20 20 20 2a 20 20 69 74 20 69 73 20 69 6d * it is im
61a0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 possible for a c
61b0: 6f 6f 6b 69 65 20 6f 72 20 71 75 65 72 79 20 70 ookie or query p
61c0: 61 72 61 6d 65 74 65 72 20 74 6f 0a 2a 2a 20 20 arameter to.**
61d0: 20 20 20 20 20 20 20 6f 76 65 72 72 69 64 65 20 override
61e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 the value of an
61f0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 environment vari
6200: 61 62 6c 65 20 73 69 6e 63 65 0a 2a 2a 20 20 20 able since.**
6210: 20 20 20 20 20 20 65 6e 76 69 72 6f 6e 6d 65 6e environmen
6220: 74 20 76 61 72 69 61 62 6c 65 73 20 61 6c 77 61 t variables alwa
6230: 79 73 20 68 61 76 65 20 75 70 70 65 72 63 61 73 ys have uppercas
6240: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 32 e names..**.** 2
6250: 30 31 38 2d 30 33 2d 32 39 3a 20 20 41 6c 73 6f 018-03-29: Also
6260: 20 69 67 6e 6f 72 65 20 74 68 65 20 65 6e 74 72 ignore the entr
6270: 79 20 69 66 20 4e 41 4d 45 20 74 68 61 74 20 63 y if NAME that c
6280: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72 ontains any char
6290: 61 63 74 65 72 73 0a 2a 2a 20 6f 74 68 65 72 20 acters.** other
62a0: 74 68 61 6e 20 5b 61 2d 7a 41 2d 5a 30 2d 39 5f than [a-zA-Z0-9_
62b0: 5d 2e 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f ]. There are no
62c0: 20 6b 6e 6f 77 6e 20 65 78 70 6c 6f 69 74 73 20 known exploits
62d0: 69 6e 76 6f 6c 76 69 6e 67 20 75 6e 75 73 75 61 involving unusua
62e0: 6c 0a 2a 2a 20 6e 61 6d 65 73 20 74 68 61 74 20 l.** names that
62f0: 63 6f 6e 74 61 69 6e 20 63 68 61 72 61 63 74 65 contain characte
6300: 72 73 20 6f 75 74 73 69 64 65 20 74 68 61 74 20 rs outside that
6310: 73 65 74 2c 20 62 75 74 20 69 74 20 6e 65 76 65 set, but it neve
6320: 72 20 68 75 72 74 73 20 74 6f 0a 2a 2a 20 62 65 r hurts to.** be
6330: 20 65 78 74 72 61 20 63 61 75 74 69 6f 75 73 20 extra cautious
6340: 77 68 65 6e 20 73 61 6e 69 74 69 7a 69 6e 67 20 when sanitizing
6350: 69 6e 70 75 74 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 inputs..**.** Pa
6360: 72 61 6d 65 74 65 72 73 20 61 72 65 20 73 65 70 rameters are sep
6370: 61 72 61 74 65 64 20 62 79 20 74 68 65 20 22 74 arated by the "t
6380: 65 72 6d 69 6e 61 74 6f 72 22 20 63 68 61 72 61 erminator" chara
6390: 63 74 65 72 2e 20 20 57 68 69 74 65 73 70 61 63 cter. Whitespac
63a0: 65 0a 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 e.** before the
63b0: 4e 41 4d 45 20 69 73 20 69 67 6e 6f 72 65 64 2e NAME is ignored.
63c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 .**.** The input
63d0: 20 73 74 72 69 6e 67 20 22 7a 22 20 69 73 20 6d string "z" is m
63e0: 6f 64 69 66 69 65 64 20 62 75 74 20 6e 6f 20 63 odified but no c
63f0: 6f 70 69 65 73 20 69 73 20 6d 61 64 65 2e 20 20 opies is made.
6400: 22 7a 22 0a 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f "z".** should no
6410: 74 20 62 65 20 64 65 61 6c 6c 6f 63 61 74 65 64 t be deallocated
6420: 20 6f 72 20 63 68 61 6e 67 65 64 20 61 67 61 69 or changed agai
6430: 6e 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 n after this rou
6440: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 tine.** returns
6450: 6f 72 20 69 74 20 77 69 6c 6c 20 63 6f 72 72 75 or it will corru
6460: 70 74 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 pt the parameter
6470: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 table..*/.stati
6480: 63 20 76 6f 69 64 20 61 64 64 5f 70 61 72 61 6d c void add_param
6490: 5f 6c 69 73 74 28 63 68 61 72 20 2a 7a 2c 20 69 _list(char *z, i
64a0: 6e 74 20 74 65 72 6d 69 6e 61 74 6f 72 29 7b 0a nt terminator){.
64b0: 20 20 69 6e 74 20 69 73 51 50 20 3d 20 74 65 72 int isQP = ter
64c0: 6d 69 6e 61 74 6f 72 3d 3d 27 26 27 3b 0a 20 20 minator=='&';.
64d0: 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 while( *z ){.
64e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 char *zName;.
64f0: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b 0a char *zValue;.
6500: 20 20 20 20 77 68 69 6c 65 28 20 66 6f 73 73 69 while( fossi
6510: 6c 5f 69 73 73 70 61 63 65 28 2a 7a 29 20 29 7b l_isspace(*z) ){
6520: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7a 4e 61 6d z++; }. zNam
6530: 65 20 3d 20 7a 3b 0a 20 20 20 20 77 68 69 6c 65 e = z;. while
6540: 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 20 ( *z && *z!='='
6550: 26 26 20 2a 7a 21 3d 74 65 72 6d 69 6e 61 74 6f && *z!=terminato
6560: 72 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 r ){ z++; }.
6570: 69 66 28 20 2a 7a 3d 3d 27 3d 27 20 29 7b 0a 20 if( *z=='=' ){.
6580: 20 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 *z = 0;.
6590: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7a 56 z++;. zV
65a0: 61 6c 75 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 alue = z;.
65b0: 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 while( *z && *z!
65c0: 3d 74 65 72 6d 69 6e 61 74 6f 72 20 29 7b 20 7a =terminator ){ z
65d0: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 ++; }. if(
65e0: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 7a *z ){. *z
65f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 2b = 0;. z+
6600: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 +;. }.
6610: 20 64 65 68 74 74 70 69 7a 65 28 7a 56 61 6c 75 dehttpize(zValu
6620: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 e);. }else{.
6630: 20 20 20 20 20 69 66 28 20 2a 7a 20 29 7b 20 2a if( *z ){ *
6640: 7a 2b 2b 20 3d 20 30 3b 20 7d 0a 20 20 20 20 20 z++ = 0; }.
6650: 20 7a 56 61 6c 75 65 20 3d 20 22 22 3b 0a 20 20 zValue = "";.
6660: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d }. if( zNam
6670: 65 5b 30 5d 20 26 26 20 66 6f 73 73 69 6c 5f 6e e[0] && fossil_n
6680: 6f 5f 73 74 72 61 6e 67 65 5f 63 68 61 72 61 63 o_strange_charac
6690: 74 65 72 73 28 7a 4e 61 6d 65 2b 31 29 20 29 7b ters(zName+1) ){
66a0: 0a 20 20 20 20 20 20 69 66 28 20 66 6f 73 73 69 . if( fossi
66b0: 6c 5f 69 73 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b l_islower(zName[
66c0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 0]) ){. c
66d0: 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 72 gi_set_parameter
66e0: 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d 65 2c 20 7a _nocopy(zName, z
66f0: 56 61 6c 75 65 2c 20 69 73 51 50 29 3b 0a 20 20 Value, isQP);.
6700: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6f }else if( fo
6710: 73 73 69 6c 5f 69 73 75 70 70 65 72 28 7a 4e 61 ssil_isupper(zNa
6720: 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 me[0]) ){.
6730: 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 cgi_set_parame
6740: 74 65 72 5f 6e 6f 63 6f 70 79 5f 74 6f 6c 6f 77 ter_nocopy_tolow
6750: 65 72 28 7a 4e 61 6d 65 2c 20 7a 56 61 6c 75 65 er(zName, zValue
6760: 2c 20 69 73 51 50 29 3b 0a 20 20 20 20 20 20 7d , isQP);. }
6770: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 46 4f . }.#ifdef FO
6780: 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e SSIL_ENABLE_JSON
6790: 0a 20 20 20 20 6a 73 6f 6e 5f 73 65 74 65 6e 76 . json_setenv
67a0: 28 20 7a 4e 61 6d 65 2c 20 63 73 6f 6e 5f 76 61 ( zName, cson_va
67b0: 6c 75 65 5f 6e 65 77 5f 73 74 72 69 6e 67 28 7a lue_new_string(z
67c0: 56 61 6c 75 65 2c 73 74 72 6c 65 6e 28 7a 56 61 Value,strlen(zVa
67d0: 6c 75 65 29 29 20 29 3b 0a 23 65 6e 64 69 66 20 lue)) );.#endif
67e0: 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 /* FOSSIL_ENABLE
67f0: 5f 4a 53 4f 4e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a _JSON */. }.}..
6800: 2f 2a 0a 2a 2a 20 2a 70 7a 20 69 73 20 61 20 73 /*.** *pz is a s
6810: 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 tring that consi
6820: 73 74 73 20 6f 66 20 6d 75 6c 74 69 70 6c 65 20 sts of multiple
6830: 6c 69 6e 65 73 20 6f 66 20 74 65 78 74 2e 20 20 lines of text.
6840: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 This.** routine
6850: 66 69 6e 64 73 20 74 68 65 20 65 6e 64 20 6f 66 finds the end of
6860: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 69 6e the current lin
6870: 65 20 6f 66 20 74 65 78 74 20 61 6e 64 20 63 6f e of text and co
6880: 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 20 22 5c nverts.** the "\
6890: 6e 22 20 6f 72 20 22 5c 72 5c 6e 22 20 74 68 61 n" or "\r\n" tha
68a0: 74 20 65 6e 64 73 20 74 68 61 74 20 6c 69 6e 65 t ends that line
68b0: 20 69 6e 74 6f 20 61 20 22 5c 30 30 30 22 2e 20 into a "\000".
68c0: 20 49 74 20 74 68 65 6e 0a 2a 2a 20 61 64 76 61 It then.** adva
68d0: 6e 63 65 73 20 2a 70 7a 20 74 6f 20 74 68 65 20 nces *pz to the
68e0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 beginning of the
68f0: 20 6e 65 78 74 20 6c 69 6e 65 20 61 6e 64 20 72 next line and r
6900: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 70 72 eturns the.** pr
6910: 65 76 69 6f 75 73 20 76 61 6c 75 65 20 6f 66 20 evious value of
6920: 2a 70 7a 20 28 77 68 69 63 68 20 69 73 20 74 68 *pz (which is th
6930: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 e start of the c
6940: 75 72 72 65 6e 74 20 6c 69 6e 65 2e 29 0a 2a 2f urrent line.).*/
6950: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 67 65 .static char *ge
6960: 74 5f 6c 69 6e 65 5f 66 72 6f 6d 5f 73 74 72 69 t_line_from_stri
6970: 6e 67 28 63 68 61 72 20 2a 2a 70 7a 2c 20 69 6e ng(char **pz, in
6980: 74 20 2a 70 4c 65 6e 29 7b 0a 20 20 63 68 61 72 t *pLen){. char
6990: 20 2a 7a 20 3d 20 2a 70 7a 3b 0a 20 20 69 6e 74 *z = *pz;. int
69a0: 20 69 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d i;. if( z[0]==
69b0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 0 ) return 0;.
69c0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 for(i=0; z[i]; i
69d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 ++){. if( z[i
69e0: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 ]=='\n' ){.
69f0: 20 69 66 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d if( i>0 && z[i-
6a00: 31 5d 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 1]=='\r' ){.
6a10: 20 20 20 20 7a 5b 69 2d 31 5d 20 3d 20 30 3b 0a z[i-1] = 0;.
6a20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
6a30: 20 20 20 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 z[i] = 0;.
6a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 2b 2b }. i++
6a50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
6a60: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 20 3d }. }. *pz =
6a70: 20 26 7a 5b 69 5d 3b 0a 20 20 2a 70 4c 65 6e 20 &z[i];. *pLen
6a80: 2d 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 7a -= i;. return z
6a90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 ;.}../*.** The i
6aa0: 6e 70 75 74 20 2a 70 7a 20 70 6f 69 6e 74 73 20 nput *pz points
6ab0: 74 6f 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 to content that
6ac0: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 20 62 79 is terminated by
6ad0: 20 61 20 22 5c 72 5c 6e 22 0a 2a 2a 20 66 6f 6c a "\r\n".** fol
6ae0: 6c 6f 77 65 64 20 62 79 20 74 68 65 20 62 6f 75 lowed by the bou
6af0: 6e 64 61 72 79 20 6d 61 72 6b 65 72 20 7a 42 6f ndary marker zBo
6b00: 75 6e 64 61 72 79 2e 20 20 41 6e 20 65 78 74 72 undary. An extr
6b10: 61 20 22 2d 2d 22 20 6d 61 79 20 6f 72 0a 2a 2a a "--" may or.**
6b20: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 70 70 65 may not be appe
6b30: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 6f 75 6e nded to the boun
6b40: 64 61 72 79 20 6d 61 72 6b 65 72 2e 20 20 54 68 dary marker. Th
6b50: 65 72 65 20 61 72 65 20 2a 70 4c 65 6e 20 63 68 ere are *pLen ch
6b60: 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 2a aracters.** in *
6b70: 70 7a 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 pz..**.** This r
6b80: 6f 75 74 69 6e 65 20 61 64 64 73 20 61 20 22 5c outine adds a "\
6b90: 30 30 30 22 20 74 6f 20 74 68 65 20 65 6e 64 20 000" to the end
6ba0: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 28 of the content (
6bb0: 6f 76 65 72 77 72 69 74 69 6e 67 0a 2a 2a 20 74 overwriting.** t
6bc0: 68 65 20 22 5c 72 5c 6e 22 29 20 61 6e 64 20 72 he "\r\n") and r
6bd0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 eturns a pointer
6be0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e to the content.
6bf0: 20 20 54 68 65 20 2a 70 7a 20 69 6e 70 75 74 0a The *pz input.
6c00: 2a 2a 20 69 73 20 61 64 6a 75 73 74 65 64 20 74 ** is adjusted t
6c10: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 o point to the f
6c20: 69 72 73 74 20 6c 69 6e 65 20 66 6f 6c 6c 6f 77 irst line follow
6c30: 69 6e 67 20 74 68 65 20 62 6f 75 6e 64 61 72 79 ing the boundary
6c40: 2e 0a 2a 2a 20 54 68 65 20 6c 65 6e 67 74 68 20 ..** The length
6c50: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 of the content i
6c60: 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 43 s stored in *pnC
6c70: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 ontent..*/.stati
6c80: 63 20 63 68 61 72 20 2a 67 65 74 5f 62 6f 75 6e c char *get_boun
6c90: 64 65 64 5f 63 6f 6e 74 65 6e 74 28 0a 20 20 63 ded_content(. c
6ca0: 68 61 72 20 2a 2a 70 7a 2c 20 20 20 20 20 20 20 har **pz,
6cb0: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 74 61 6b /* Content tak
6cc0: 65 6e 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a en from here */.
6cd0: 20 20 69 6e 74 20 2a 70 4c 65 6e 2c 20 20 20 20 int *pLen,
6ce0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
6cf0: 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 f bytes of data
6d00: 69 6e 20 28 2a 70 7a 29 5b 5d 20 2a 2f 0a 20 20 in (*pz)[] */.
6d10: 63 68 61 72 20 2a 7a 42 6f 75 6e 64 61 72 79 2c char *zBoundary,
6d20: 20 20 20 20 2f 2a 20 42 6f 75 6e 64 61 72 79 20 /* Boundary
6d30: 74 65 78 74 20 6d 61 72 6b 69 6e 67 20 74 68 65 text marking the
6d40: 20 65 6e 64 20 6f 66 20 63 6f 6e 74 65 6e 74 20 end of content
6d50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6f 6e 74 */. int *pnCont
6d60: 65 6e 74 20 20 20 20 20 2f 2a 20 57 72 69 74 65 ent /* Write
6d70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 the size of the
6d80: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f content here */
6d90: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 20 3d 20 .){. char *z =
6da0: 2a 70 7a 3b 0a 20 20 69 6e 74 20 6c 65 6e 20 3d *pz;. int len =
6db0: 20 2a 70 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b *pLen;. int i;
6dc0: 0a 20 20 69 6e 74 20 6e 42 6f 75 6e 64 61 72 79 . int nBoundary
6dd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 6f 75 6e 64 = strlen(zBound
6de0: 61 72 79 29 3b 0a 20 20 2a 70 6e 43 6f 6e 74 65 ary);. *pnConte
6df0: 6e 74 20 3d 20 6c 65 6e 3b 0a 20 20 66 6f 72 28 nt = len;. for(
6e00: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 i=0; i<len; i++)
6e10: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d {. if( z[i]==
6e20: 27 5c 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 '\n' && strncmp(
6e30: 7a 42 6f 75 6e 64 61 72 79 2c 20 26 7a 5b 69 2b zBoundary, &z[i+
6e40: 31 5d 2c 20 6e 42 6f 75 6e 64 61 72 79 29 3d 3d 1], nBoundary)==
6e50: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 0 ){. if( i
6e60: 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27 5c >0 && z[i-1]=='\
6e70: 72 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 r' ) i--;.
6e80: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 z[i] = 0;.
6e90: 2a 70 6e 43 6f 6e 74 65 6e 74 20 3d 20 69 3b 0a *pnContent = i;.
6ea0: 20 20 20 20 20 20 69 20 2b 3d 20 6e 42 6f 75 6e i += nBoun
6eb0: 64 61 72 79 3b 0a 20 20 20 20 20 20 62 72 65 61 dary;. brea
6ec0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a k;. }. }. *
6ed0: 70 7a 20 3d 20 26 7a 5b 69 5d 3b 0a 20 20 67 65 pz = &z[i];. ge
6ee0: 74 5f 6c 69 6e 65 5f 66 72 6f 6d 5f 73 74 72 69 t_line_from_stri
6ef0: 6e 67 28 70 7a 2c 20 70 4c 65 6e 29 3b 0a 20 20 ng(pz, pLen);.
6f00: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a return z;.}../*.
6f10: 2a 2a 20 54 6f 6b 65 6e 69 7a 65 20 61 20 6c 69 ** Tokenize a li
6f20: 6e 65 20 6f 66 20 74 65 78 74 20 69 6e 74 6f 20 ne of text into
6f30: 61 73 20 6d 61 6e 79 20 61 73 20 6e 41 72 67 20 as many as nArg
6f40: 74 6f 6b 65 6e 73 2e 20 20 4d 61 6b 65 0a 2a 2a tokens. Make.**
6f50: 20 61 7a 41 72 67 5b 5d 20 70 6f 69 6e 74 20 74 azArg[] point t
6f60: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 o the start of e
6f70: 61 63 68 20 74 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a ach token..**.**
6f80: 20 54 6f 6b 65 6e 73 20 63 6f 6e 73 69 73 74 20 Tokens consist
6f90: 6f 66 20 73 70 61 63 65 20 6f 72 20 73 65 6d 69 of space or semi
6fa0: 2d 63 6f 6c 6f 6e 20 64 65 6c 69 6d 69 74 65 64 -colon delimited
6fb0: 20 77 6f 72 64 73 20 6f 72 0a 2a 2a 20 73 74 72 words or.** str
6fc0: 69 6e 67 73 20 69 6e 73 69 64 65 20 64 6f 75 62 ings inside doub
6fd0: 6c 65 2d 71 75 6f 74 65 73 2e 20 20 45 78 61 6d le-quotes. Exam
6fe0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 63 6f ple:.**.** co
6ff0: 6e 74 65 6e 74 2d 64 69 73 70 6f 73 69 74 69 6f ntent-dispositio
7000: 6e 3a 20 66 6f 72 6d 2d 64 61 74 61 3b 20 6e 61 n: form-data; na
7010: 6d 65 3d 22 66 6e 22 3b 20 66 69 6c 65 6e 61 6d me="fn"; filenam
7020: 65 3d 22 69 6e 64 65 78 2e 68 74 6d 6c 22 0a 2a e="index.html".*
7030: 2a 0a 2a 2a 20 54 68 65 20 6c 69 6e 65 20 61 62 *.** The line ab
7040: 6f 76 65 20 69 73 20 74 6f 6b 65 6e 69 7a 65 64 ove is tokenized
7050: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a as follows:.**.
7060: 2a 2a 20 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d ** azArg[0] =
7070: 20 22 63 6f 6e 74 65 6e 74 2d 64 69 73 70 6f 73 "content-dispos
7080: 69 74 69 6f 6e 3a 22 0a 2a 2a 20 20 20 20 61 7a ition:".** az
7090: 41 72 67 5b 31 5d 20 3d 20 22 66 6f 72 6d 2d 64 Arg[1] = "form-d
70a0: 61 74 61 22 0a 2a 2a 20 20 20 20 61 7a 41 72 67 ata".** azArg
70b0: 5b 32 5d 20 3d 20 22 6e 61 6d 65 3d 22 0a 2a 2a [2] = "name=".**
70c0: 20 20 20 20 61 7a 41 72 67 5b 33 5d 20 3d 20 22 azArg[3] = "
70d0: 66 6e 22 0a 2a 2a 20 20 20 20 61 7a 41 72 67 5b fn".** azArg[
70e0: 34 5d 20 3d 20 22 66 69 6c 65 6e 61 6d 65 3d 22 4] = "filename="
70f0: 0a 2a 2a 20 20 20 20 61 7a 41 72 67 5b 35 5d 20 .** azArg[5]
7100: 3d 20 22 69 6e 64 65 78 2e 68 74 6d 6c 22 0a 2a = "index.html".*
7110: 2a 20 20 20 20 61 7a 41 72 67 5b 36 5d 20 3d 20 * azArg[6] =
7120: 30 3b 0a 2a 2a 0a 2a 2a 20 27 5c 30 30 30 27 20 0;.**.** '\000'
7130: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 69 characters are i
7140: 6e 73 65 72 74 65 64 20 69 6e 20 7a 5b 5d 20 61 nserted in z[] a
7150: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 t the end of eac
7160: 68 20 74 6f 6b 65 6e 2e 0a 2a 2a 20 54 68 69 73 h token..** This
7170: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 routine returns
7180: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 the total numbe
7190: 72 20 6f 66 20 74 6f 6b 65 6e 73 20 6f 6e 20 74 r of tokens on t
71a0: 68 65 20 6c 69 6e 65 2c 20 36 0a 2a 2a 20 69 6e he line, 6.** in
71b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f the example abo
71c0: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ve..*/.static in
71d0: 74 20 74 6f 6b 65 6e 69 7a 65 5f 6c 69 6e 65 28 t tokenize_line(
71e0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6d 78 41 char *z, int mxA
71f0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 rg, char **azArg
7200: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a ){. int i = 0;.
7210: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 while( *z ){.
7220: 20 20 20 77 68 69 6c 65 28 20 66 6f 73 73 69 6c while( fossil
7230: 5f 69 73 73 70 61 63 65 28 2a 7a 29 20 7c 7c 20 _isspace(*z) ||
7240: 2a 7a 3d 3d 27 3b 27 20 29 7b 20 7a 2b 2b 3b 20 *z==';' ){ z++;
7250: 7d 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 }. if( *z=='"
7260: 27 20 26 26 20 7a 5b 31 5d 20 29 7b 0a 20 20 20 ' && z[1] ){.
7270: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 *z = 0;.
7280: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 z++;. if(
7290: 69 3c 6d 78 41 72 67 2d 31 20 29 7b 20 61 7a 41 i<mxArg-1 ){ azA
72a0: 72 67 5b 69 2b 2b 5d 20 3d 20 7a 3b 20 7d 0a 20 rg[i++] = z; }.
72b0: 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 while( *z &
72c0: 26 20 2a 7a 21 3d 27 22 27 20 29 7b 20 7a 2b 2b & *z!='"' ){ z++
72d0: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a ; }. if( *z
72e0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 ==0 ) break;.
72f0: 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 *z = 0;.
7300: 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b z++;. }else{
7310: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6d 78 41 . if( i<mxA
7320: 72 67 2d 31 20 29 7b 20 61 7a 41 72 67 5b 69 2b rg-1 ){ azArg[i+
7330: 2b 5d 20 3d 20 7a 3b 20 7d 0a 20 20 20 20 20 20 +] = z; }.
7340: 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 21 66 6f while( *z && !fo
7350: 73 73 69 6c 5f 69 73 73 70 61 63 65 28 2a 7a 29 ssil_isspace(*z)
7360: 20 26 26 20 2a 7a 21 3d 27 3b 27 20 26 26 20 2a && *z!=';' && *
7370: 7a 21 3d 27 22 27 20 29 7b 20 7a 2b 2b 3b 20 7d z!='"' ){ z++; }
7380: 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 20 26 26 . if( *z &&
7390: 20 2a 7a 21 3d 27 22 27 20 29 7b 0a 20 20 20 20 *z!='"' ){.
73a0: 20 20 20 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 *z = 0;.
73b0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 7d z++;. }
73c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 7a 41 . }. }. azA
73d0: 72 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 rg[i] = 0;. ret
73e0: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn i;.}../*.**
73f0: 53 63 61 6e 20 74 68 65 20 6d 75 6c 74 69 70 61 Scan the multipa
7400: 72 74 2d 66 6f 72 6d 20 63 6f 6e 74 65 6e 74 20 rt-form content
7410: 61 6e 64 20 6d 61 6b 65 20 61 70 70 72 6f 70 72 and make appropr
7420: 69 61 74 65 20 65 6e 74 72 69 65 73 0a 2a 2a 20 iate entries.**
7430: 69 6e 74 6f 20 74 68 65 20 70 61 72 61 6d 65 74 into the paramet
7440: 65 72 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 er table..**.**
7450: 54 68 65 20 63 6f 6e 74 65 6e 74 20 73 74 72 69 The content stri
7460: 6e 67 20 22 7a 22 20 69 73 20 6d 6f 64 69 66 69 ng "z" is modifi
7470: 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 ed by this routi
7480: 6e 65 20 62 75 74 20 69 74 20 69 73 0a 2a 2a 20 ne but it is.**
7490: 6e 6f 74 20 63 6f 70 69 65 64 2e 20 20 54 68 65 not copied. The
74a0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f calling functio
74b0: 6e 20 6d 75 73 74 20 6e 6f 74 20 64 65 61 6c 6c n must not deall
74c0: 6f 63 61 74 65 20 6f 72 20 6d 6f 64 69 66 79 0a ocate or modify.
74d0: 2a 2a 20 22 7a 22 20 61 66 74 65 72 20 74 68 69 ** "z" after thi
74e0: 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 69 73 68 s routine finish
74f0: 65 73 20 6f 72 20 69 74 20 63 6f 75 6c 64 20 63 es or it could c
7500: 6f 72 72 75 70 74 20 74 68 65 20 70 61 72 61 6d orrupt the param
7510: 65 74 65 72 0a 2a 2a 20 74 61 62 6c 65 2e 0a 2a eter.** table..*
7520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 /.static void pr
7530: 6f 63 65 73 73 5f 6d 75 6c 74 69 70 61 72 74 5f ocess_multipart_
7540: 66 6f 72 6d 5f 64 61 74 61 28 63 68 61 72 20 2a form_data(char *
7550: 7a 2c 20 69 6e 74 20 6c 65 6e 29 7b 0a 20 20 63 z, int len){. c
7560: 68 61 72 20 2a 7a 4c 69 6e 65 3b 0a 20 20 69 6e har *zLine;. in
7570: 74 20 6e 41 72 67 2c 20 69 3b 0a 20 20 63 68 61 t nArg, i;. cha
7580: 72 20 2a 7a 42 6f 75 6e 64 61 72 79 3b 0a 20 20 r *zBoundary;.
7590: 63 68 61 72 20 2a 7a 56 61 6c 75 65 3b 0a 20 20 char *zValue;.
75a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b char *zName = 0;
75b0: 0a 20 20 69 6e 74 20 73 68 6f 77 42 79 74 65 73 . int showBytes
75c0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a = 0;. char *az
75d0: 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 7a 42 6f 75 Arg[50];.. zBou
75e0: 6e 64 61 72 79 20 3d 20 67 65 74 5f 6c 69 6e 65 ndary = get_line
75f0: 5f 66 72 6f 6d 5f 73 74 72 69 6e 67 28 26 7a 2c _from_string(&z,
7600: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 7a 42 &len);. if( zB
7610: 6f 75 6e 64 61 72 79 3d 3d 30 20 29 20 72 65 74 oundary==0 ) ret
7620: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a urn;. while( (z
7630: 4c 69 6e 65 20 3d 20 67 65 74 5f 6c 69 6e 65 5f Line = get_line_
7640: 66 72 6f 6d 5f 73 74 72 69 6e 67 28 26 7a 2c 20 from_string(&z,
7650: 26 6c 65 6e 29 29 21 3d 30 20 29 7b 0a 20 20 20 &len))!=0 ){.
7660: 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 30 if( zLine[0]==0
7670: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 ){. int nC
7680: 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 ontent = 0;.
7690: 20 20 7a 56 61 6c 75 65 20 3d 20 67 65 74 5f 62 zValue = get_b
76a0: 6f 75 6e 64 65 64 5f 63 6f 6e 74 65 6e 74 28 26 ounded_content(&
76b0: 7a 2c 20 26 6c 65 6e 2c 20 7a 42 6f 75 6e 64 61 z, &len, zBounda
76c0: 72 79 2c 20 26 6e 43 6f 6e 74 65 6e 74 29 3b 0a ry, &nContent);.
76d0: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 if( zName
76e0: 26 26 20 7a 56 61 6c 75 65 20 29 7b 0a 20 20 20 && zValue ){.
76f0: 20 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f if( fossil_
7700: 69 73 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b 30 5d islower(zName[0]
7710: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 ) ){. c
7720: 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 72 gi_set_parameter
7730: 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d 65 2c 20 7a _nocopy(zName, z
7740: 56 61 6c 75 65 2c 20 31 29 3b 0a 20 20 20 20 20 Value, 1);.
7750: 20 20 20 20 20 69 66 28 20 73 68 6f 77 42 79 74 if( showByt
7760: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 es ){.
7770: 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 cgi_set_parame
7780: 74 65 72 5f 6e 6f 63 6f 70 79 28 6d 70 72 69 6e ter_nocopy(mprin
7790: 74 66 28 22 25 73 3a 62 79 74 65 73 22 2c 20 7a tf("%s:bytes", z
77a0: 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 Name),.
77b0: 20 20 20 20 20 20 20 20 6d 70 72 69 6e 74 66 28 mprintf(
77c0: 22 25 64 22 2c 6e 43 6f 6e 74 65 6e 74 29 2c 20 "%d",nContent),
77d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 1);. }.
77e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 }else if
77f0: 28 20 66 6f 73 73 69 6c 5f 69 73 75 70 70 65 72 ( fossil_isupper
7800: 28 7a 4e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 (zName[0]) ){.
7810: 20 20 20 20 20 20 20 20 63 67 69 5f 73 65 74 5f cgi_set_
7820: 70 61 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 parameter_nocopy
7830: 5f 74 6f 6c 6f 77 65 72 28 7a 4e 61 6d 65 2c 20 _tolower(zName,
7840: 7a 56 61 6c 75 65 2c 20 31 29 3b 0a 20 20 20 20 zValue, 1);.
7850: 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 42 79 if( showBy
7860: 74 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 tes ){.
7870: 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d cgi_set_param
7880: 65 74 65 72 5f 6e 6f 63 6f 70 79 5f 74 6f 6c 6f eter_nocopy_tolo
7890: 77 65 72 28 6d 70 72 69 6e 74 66 28 22 25 73 3a wer(mprintf("%s:
78a0: 62 79 74 65 73 22 2c 20 7a 4e 61 6d 65 29 2c 0a bytes", zName),.
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
78c0: 20 6d 70 72 69 6e 74 66 28 22 25 64 22 2c 6e 43 mprintf("%d",nC
78d0: 6f 6e 74 65 6e 74 29 2c 20 31 29 3b 0a 20 20 20 ontent), 1);.
78e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
78f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }. }.
7900: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 zName = 0;.
7910: 20 20 73 68 6f 77 42 79 74 65 73 20 3d 20 30 3b showBytes = 0;
7920: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
7930: 20 20 6e 41 72 67 20 3d 20 74 6f 6b 65 6e 69 7a nArg = tokeniz
7940: 65 5f 6c 69 6e 65 28 7a 4c 69 6e 65 2c 20 63 6f e_line(zLine, co
7950: 75 6e 74 28 61 7a 41 72 67 29 2c 20 61 7a 41 72 unt(azArg), azAr
7960: 67 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d g);. for(i=
7970: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0; i<nArg; i++){
7980: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 20 3d . int c =
7990: 20 66 6f 73 73 69 6c 5f 74 6f 6c 6f 77 65 72 28 fossil_tolower(
79a0: 61 7a 41 72 67 5b 69 5d 5b 30 5d 29 3b 0a 20 20 azArg[i][0]);.
79b0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 int n = st
79c0: 72 6c 65 6e 28 61 7a 41 72 67 5b 69 5d 29 3b 0a rlen(azArg[i]);.
79d0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 if( c=='
79e0: 63 27 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 c' && sqlite3_st
79f0: 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c rnicmp(azArg[i],
7a00: 22 63 6f 6e 74 65 6e 74 2d 64 69 73 70 6f 73 69 "content-disposi
7a10: 74 69 6f 6e 3a 22 2c 6e 29 3d 3d 30 20 29 7b 0a tion:",n)==0 ){.
7a20: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 i++;.
7a30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
7a40: 20 63 3d 3d 27 6e 27 20 26 26 20 73 71 6c 69 74 c=='n' && sqlit
7a50: 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 e3_strnicmp(azAr
7a60: 67 5b 69 5d 2c 22 6e 61 6d 65 3d 22 2c 6e 29 3d g[i],"name=",n)=
7a70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
7a80: 7a 4e 61 6d 65 20 3d 20 61 7a 41 72 67 5b 2b 2b zName = azArg[++
7a90: 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 i];. }els
7aa0: 65 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 e if( c=='f' &&
7ab0: 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 sqlite3_strnicmp
7ac0: 28 61 7a 41 72 67 5b 69 5d 2c 22 66 69 6c 65 6e (azArg[i],"filen
7ad0: 61 6d 65 3d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 ame=",n)==0 ){.
7ae0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a char *z
7af0: 20 3d 20 61 7a 41 72 67 5b 2b 2b 69 5d 3b 0a 20 = azArg[++i];.
7b00: 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 if( zNa
7b10: 6d 65 20 26 26 20 7a 20 29 7b 0a 20 20 20 20 20 me && z ){.
7b20: 20 20 20 20 20 20 20 69 66 28 20 66 6f 73 73 69 if( fossi
7b30: 6c 5f 69 73 6c 6f 77 65 72 28 7a 4e 61 6d 65 5b l_islower(zName[
7b40: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 0]) ){.
7b50: 20 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 cgi_set_par
7b60: 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 6d 70 ameter_nocopy(mp
7b70: 72 69 6e 74 66 28 22 25 73 3a 66 69 6c 65 6e 61 rintf("%s:filena
7b80: 6d 65 22 2c 7a 4e 61 6d 65 29 2c 20 7a 2c 20 31 me",zName), z, 1
7b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d );. }
7ba0: 65 6c 73 65 20 69 66 28 20 66 6f 73 73 69 6c 5f else if( fossil_
7bb0: 69 73 75 70 70 65 72 28 7a 4e 61 6d 65 5b 30 5d isupper(zName[0]
7bc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 ) ){.
7bd0: 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d cgi_set_param
7be0: 65 74 65 72 5f 6e 6f 63 6f 70 79 5f 74 6f 6c 6f eter_nocopy_tolo
7bf0: 77 65 72 28 6d 70 72 69 6e 74 66 28 22 25 73 3a wer(mprintf("%s:
7c00: 66 69 6c 65 6e 61 6d 65 22 2c 7a 4e 61 6d 65 29 filename",zName)
7c10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c40: 20 7a 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 z, 1);.
7c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
7c60: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 }. show
7c70: 42 79 74 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 Bytes = 1;.
7c80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d }else if( c==
7c90: 27 63 27 20 26 26 20 73 71 6c 69 74 65 33 5f 73 'c' && sqlite3_s
7ca0: 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d trnicmp(azArg[i]
7cb0: 2c 22 63 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 22 ,"content-type:"
7cc0: 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ,n)==0 ){.
7cd0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a char *z = az
7ce0: 41 72 67 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 Arg[++i];.
7cf0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 if( zName &&
7d00: 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 z ){.
7d10: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 6c if( fossil_isl
7d20: 6f 77 65 72 28 7a 4e 61 6d 65 5b 30 5d 29 20 29 ower(zName[0]) )
7d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
7d40: 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 cgi_set_paramete
7d50: 72 5f 6e 6f 63 6f 70 79 28 6d 70 72 69 6e 74 66 r_nocopy(mprintf
7d60: 28 22 25 73 3a 6d 69 6d 65 74 79 70 65 22 2c 7a ("%s:mimetype",z
7d70: 4e 61 6d 65 29 2c 20 7a 2c 20 31 29 3b 0a 20 20 Name), z, 1);.
7d80: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 }else
7d90: 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 75 70 70 if( fossil_isupp
7da0: 65 72 28 7a 4e 61 6d 65 5b 30 5d 29 20 29 7b 0a er(zName[0]) ){.
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 67 cg
7dc0: 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 72 5f i_set_parameter_
7dd0: 6e 6f 63 6f 70 79 5f 74 6f 6c 6f 77 65 72 28 6d nocopy_tolower(m
7de0: 70 72 69 6e 74 66 28 22 25 73 3a 6d 69 6d 65 74 printf("%s:mimet
7df0: 79 70 65 22 2c 7a 4e 61 6d 65 29 2c 0a 20 20 20 ype",zName),.
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 2c 20 31 z, 1
7e30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d );. }
7e40: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
7e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
7e60: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 }. }.}...#if
7e70: 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c def FOSSIL_ENABL
7e80: 45 5f 4a 53 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 61 E_JSON./*.** Rea
7e90: 64 73 20 61 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 ds a JSON object
7ea0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 from the given
7eb0: 62 6c 6f 62 2c 20 77 68 69 63 68 20 69 73 20 61 blob, which is a
7ec0: 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 0a 2a ssumed to have.*
7ed0: 2a 20 62 65 65 6e 20 70 6f 70 75 6c 61 74 65 64 * been populated
7ee0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 66 by the caller f
7ef0: 72 6f 6d 20 73 74 64 69 6e 2c 20 74 68 65 20 53 rom stdin, the S
7f00: 53 4c 20 41 50 49 2c 20 6f 72 20 61 20 66 69 6c SL API, or a fil
7f10: 65 2c 20 61 73 0a 2a 2a 20 61 70 70 72 6f 70 72 e, as.** appropr
7f20: 69 61 74 65 20 66 6f 72 20 74 68 65 20 70 61 72 iate for the par
7f30: 74 69 63 75 6c 61 72 20 75 73 65 20 63 61 73 65 ticular use case
7f40: 2e 20 4f 6e 20 73 75 63 63 65 73 73 20 67 2e 6a . On success g.j
7f50: 73 6f 6e 2e 70 6f 73 74 20 69 73 0a 2a 2a 20 75 son.post is.** u
7f60: 70 64 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 pdated to hold t
7f70: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 4f 6e 20 65 he content. On e
7f80: 72 72 6f 72 20 61 20 46 53 4c 5f 4a 53 4f 4e 5f rror a FSL_JSON_
7f90: 45 5f 49 4e 56 41 4c 49 44 5f 52 45 51 55 45 53 E_INVALID_REQUES
7fa0: 54 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 T.** response is
7fb0: 20 6f 75 74 70 75 74 20 61 6e 64 20 66 6f 73 73 output and foss
7fc0: 69 6c 5f 65 78 69 74 28 29 20 69 73 20 63 61 6c il_exit() is cal
7fd0: 6c 65 64 20 28 69 6e 20 48 54 54 50 20 6d 6f 64 led (in HTTP mod
7fe0: 65 20 65 78 69 74 0a 2a 2a 20 63 6f 64 65 20 30 e exit.** code 0
7ff0: 20 69 73 20 75 73 65 64 29 2e 0a 2a 2f 0a 76 6f is used)..*/.vo
8000: 69 64 20 63 67 69 5f 70 61 72 73 65 5f 50 4f 53 id cgi_parse_POS
8010: 54 5f 4a 53 4f 4e 28 20 42 6c 6f 62 20 2a 20 70 T_JSON( Blob * p
8020: 49 6e 20 29 7b 0a 20 20 63 73 6f 6e 5f 76 61 6c In ){. cson_val
8030: 75 65 20 2a 20 6a 76 20 3d 20 4e 55 4c 4c 3b 0a ue * jv = NULL;.
8040: 20 20 63 73 6f 6e 5f 70 61 72 73 65 5f 69 6e 66 cson_parse_inf
8050: 6f 20 70 69 6e 66 6f 20 3d 20 63 73 6f 6e 5f 70 o pinfo = cson_p
8060: 61 72 73 65 5f 69 6e 66 6f 5f 65 6d 70 74 79 3b arse_info_empty;
8070: 0a 20 20 61 73 73 65 72 74 28 67 2e 6a 73 6f 6e . assert(g.json
8080: 2e 67 63 2e 61 20 26 26 20 22 6a 73 6f 6e 5f 62 .gc.a && "json_b
8090: 6f 6f 74 73 74 72 61 70 5f 65 61 72 6c 79 28 29 ootstrap_early()
80a0: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 21 was not called!
80b0: 22 29 3b 0a 20 20 6a 76 20 3d 20 63 73 6f 6e 5f ");. jv = cson_
80c0: 70 61 72 73 65 5f 42 6c 6f 62 28 70 49 6e 2c 20 parse_Blob(pIn,
80d0: 26 70 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 6a &pinfo);. if( j
80e0: 76 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 67 v==NULL ){. g
80f0: 6f 74 6f 20 69 6e 76 61 6c 69 64 52 65 71 75 65 oto invalidReque
8100: 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 st;. }else{.
8110: 20 6a 73 6f 6e 5f 67 63 5f 61 64 64 28 20 22 50 json_gc_add( "P
8120: 4f 53 54 2e 4a 53 4f 4e 22 2c 20 6a 76 20 29 3b OST.JSON", jv );
8130: 0a 20 20 20 20 67 2e 6a 73 6f 6e 2e 70 6f 73 74 . g.json.post
8140: 2e 76 20 3d 20 6a 76 3b 0a 20 20 20 20 67 2e 6a .v = jv;. g.j
8150: 73 6f 6e 2e 70 6f 73 74 2e 6f 20 3d 20 63 73 6f son.post.o = cso
8160: 6e 5f 76 61 6c 75 65 5f 67 65 74 5f 6f 62 6a 65 n_value_get_obje
8170: 63 74 28 20 6a 76 20 29 3b 0a 20 20 20 20 69 66 ct( jv );. if
8180: 28 20 21 67 2e 6a 73 6f 6e 2e 70 6f 73 74 2e 6f ( !g.json.post.o
8190: 20 29 7b 20 2f 2a 20 77 65 20 64 6f 6e 27 74 20 ){ /* we don't
81a0: 73 75 70 70 6f 72 74 20 6e 6f 6e 2d 4f 62 6a 65 support non-Obje
81b0: 63 74 20 28 41 72 72 61 79 29 20 72 65 71 75 65 ct (Array) reque
81c0: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 sts */. got
81d0: 6f 20 69 6e 76 61 6c 69 64 52 65 71 75 65 73 74 o invalidRequest
81e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 ;. }. }. re
81f0: 74 75 72 6e 3b 0a 20 20 69 6e 76 61 6c 69 64 52 turn;. invalidR
8200: 65 71 75 65 73 74 3a 0a 20 20 63 67 69 5f 73 65 equest:. cgi_se
8210: 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 6a t_content_type(j
8220: 73 6f 6e 5f 67 75 65 73 73 5f 63 6f 6e 74 65 6e son_guess_conten
8230: 74 5f 74 79 70 65 28 29 29 3b 0a 20 20 69 66 28 t_type());. if(
8240: 30 20 21 3d 20 70 69 6e 66 6f 2e 65 72 72 6f 72 0 != pinfo.error
8250: 43 6f 64 65 29 7b 20 2f 2a 20 66 61 6e 63 79 20 Code){ /* fancy
8260: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f error message */
8270: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 20 6d 73 . char * ms
8280: 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 4a 53 4f g = mprintf("JSO
8290: 4e 20 70 61 72 73 65 20 65 72 72 6f 72 20 61 74 N parse error at
82a0: 20 6c 69 6e 65 20 25 75 2c 20 63 6f 6c 75 6d 6e line %u, column
82b0: 20 25 75 2c 20 22 0a 20 20 20 20 20 20 20 20 20 %u, ".
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82d0: 20 20 22 62 79 74 65 20 6f 66 66 73 65 74 20 25 "byte offset %
82e0: 75 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 u: %s",.
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8300: 20 20 20 70 69 6e 66 6f 2e 6c 69 6e 65 2c 20 70 pinfo.line, p
8310: 69 6e 66 6f 2e 63 6f 6c 2c 20 70 69 6e 66 6f 2e info.col, pinfo.
8320: 6c 65 6e 67 74 68 2c 0a 20 20 20 20 20 20 20 20 length,.
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8340: 20 20 20 63 73 6f 6e 5f 72 63 5f 73 74 72 69 6e cson_rc_strin
8350: 67 28 70 69 6e 66 6f 2e 65 72 72 6f 72 43 6f 64 g(pinfo.errorCod
8360: 65 29 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 5f e));. json_
8370: 65 72 72 28 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f err( FSL_JSON_E_
8380: 49 4e 56 41 4c 49 44 5f 52 45 51 55 45 53 54 2c INVALID_REQUEST,
8390: 20 6d 73 67 2c 20 31 20 29 3b 0a 20 20 20 20 20 msg, 1 );.
83a0: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 6d 73 67 fossil_free(msg
83b0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 6a 76 );. }else if(jv
83c0: 20 26 26 20 21 67 2e 6a 73 6f 6e 2e 70 6f 73 74 && !g.json.post
83d0: 2e 6f 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 5f .o){. json_
83e0: 65 72 72 28 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f err( FSL_JSON_E_
83f0: 49 4e 56 41 4c 49 44 5f 52 45 51 55 45 53 54 2c INVALID_REQUEST,
8400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
8410: 20 22 52 65 71 75 65 73 74 20 65 6e 76 65 6c 6f "Request envelo
8420: 70 65 20 6d 75 73 74 20 62 65 20 61 20 4a 53 4f pe must be a JSO
8430: 4e 20 4f 62 6a 65 63 74 20 28 6e 6f 74 20 61 72 N Object (not ar
8440: 72 61 79 29 2e 22 2c 20 31 20 29 3b 0a 20 20 7d ray).", 1 );. }
8450: 65 6c 73 65 7b 20 2f 2a 20 67 65 6e 65 72 69 63 else{ /* generic
8460: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a error message *
8470: 2f 0a 20 20 20 20 20 20 6a 73 6f 6e 5f 65 72 72 /. json_err
8480: 28 20 46 53 4c 5f 4a 53 4f 4e 5f 45 5f 49 4e 56 ( FSL_JSON_E_INV
8490: 41 4c 49 44 5f 52 45 51 55 45 53 54 2c 20 4e 55 ALID_REQUEST, NU
84a0: 4c 4c 2c 20 31 20 29 3b 0a 20 20 7d 0a 20 20 66 LL, 1 );. }. f
84b0: 6f 73 73 69 6c 5f 65 78 69 74 28 20 67 2e 69 73 ossil_exit( g.is
84c0: 48 54 54 50 20 3f 20 30 20 3a 20 31 29 3b 0a 7d HTTP ? 0 : 1);.}
84d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 .#endif /* FOSSI
84e0: 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 20 2a 2f L_ENABLE_JSON */
84f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 48 54 54 50 ../*.** Log HTTP
8500: 20 74 72 61 66 66 69 63 20 74 6f 20 61 20 66 69 traffic to a fi
8510: 6c 65 2e 20 20 42 65 67 69 6e 20 74 68 65 20 6c le. Begin the l
8520: 6f 67 20 6f 6e 20 66 69 72 73 74 20 75 73 65 2e og on first use.
8530: 20 20 43 6c 6f 73 65 20 74 68 65 20 6c 6f 67 0a Close the log.
8540: 2a 2a 20 77 68 65 6e 20 74 68 65 20 61 72 67 75 ** when the argu
8550: 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2f ment is NULL..*/
8560: 0a 76 6f 69 64 20 63 67 69 5f 74 72 61 63 65 28 .void cgi_trace(
8570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a const char *z){.
8580: 20 20 73 74 61 74 69 63 20 46 49 4c 45 20 2a 70 static FILE *p
8590: 4c 6f 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 67 Log = 0;. if( g
85a0: 2e 66 48 74 74 70 54 72 61 63 65 3d 3d 30 20 29 .fHttpTrace==0 )
85b0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a return;. if( z
85c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 ==0 ){. if( p
85d0: 4c 6f 67 20 29 20 66 63 6c 6f 73 65 28 70 4c 6f Log ) fclose(pLo
85e0: 67 29 3b 0a 20 20 20 20 70 4c 6f 67 20 3d 20 30 g);. pLog = 0
85f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 ;. return;.
8600: 7d 0a 20 20 69 66 28 20 70 4c 6f 67 3d 3d 30 20 }. if( pLog==0
8610: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 46 69 6c ){. char zFil
8620: 65 5b 35 30 5d 3b 0a 23 69 66 20 64 65 66 69 6e e[50];.#if defin
8630: 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 75 ed(_WIN32). u
8640: 6e 73 69 67 6e 65 64 20 72 3b 0a 20 20 20 20 73 nsigned r;. s
8650: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 qlite3_randomnes
8660: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 s(sizeof(r), &r)
8670: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e ;. sqlite3_sn
8680: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 46 printf(sizeof(zF
8690: 69 6c 65 29 2c 20 7a 46 69 6c 65 2c 20 22 68 74 ile), zFile, "ht
86a0: 74 70 6c 6f 67 2d 25 30 38 78 2e 74 78 74 22 2c tplog-%08x.txt",
86b0: 20 72 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 r);.#else. s
86c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
86d0: 73 69 7a 65 6f 66 28 7a 46 69 6c 65 29 2c 20 7a sizeof(zFile), z
86e0: 46 69 6c 65 2c 20 22 68 74 74 70 6c 6f 67 2d 25 File, "httplog-%
86f0: 30 35 64 2e 74 78 74 22 2c 20 67 65 74 70 69 64 05d.txt", getpid
8700: 28 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 ());.#endif.
8710: 70 4c 6f 67 20 3d 20 66 6f 73 73 69 6c 5f 66 6f pLog = fossil_fo
8720: 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77 62 22 29 pen(zFile, "wb")
8730: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 67 20 29 ;. if( pLog )
8740: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 {. fprintf(
8750: 73 74 64 65 72 72 2c 20 22 23 20 6f 70 65 6e 20 stderr, "# open
8760: 6c 6f 67 20 6f 6e 20 25 73 5c 6e 22 2c 20 7a 46 log on %s\n", zF
8770: 69 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b ile);. }else{
8780: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 . fprintf(s
8790: 74 64 65 72 72 2c 20 22 23 20 66 61 69 6c 65 64 tderr, "# failed
87a0: 20 74 6f 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 to open %s\n",
87b0: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 zFile);. re
87c0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a turn;. }. }.
87d0: 20 20 66 70 75 74 73 28 7a 2c 20 70 4c 6f 67 29 fputs(z, pLog)
87e0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 ;.}../* Forward
87f0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 declaration */.s
8800: 74 61 74 69 63 20 4e 4f 52 45 54 55 52 4e 20 76 tatic NORETURN v
8810: 6f 69 64 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 oid malformed_re
8820: 71 75 65 73 74 28 63 6f 6e 73 74 20 63 68 61 72 quest(const char
8830: 20 2a 7a 4d 73 67 29 3b 0a 0a 2f 2a 0a 2a 2a 20 *zMsg);../*.**
8840: 43 68 65 63 6b 73 20 74 68 65 20 51 55 45 52 59 Checks the QUERY
8850: 5f 53 54 52 49 4e 47 20 65 6e 76 69 72 6f 6e 6d _STRING environm
8860: 65 6e 74 20 76 61 72 69 61 62 6c 65 2c 20 73 65 ent variable, se
8870: 74 73 20 69 74 20 75 70 0a 2a 2a 20 76 69 61 20 ts it up.** via
8880: 61 64 64 5f 70 61 72 61 6d 5f 6c 69 73 74 28 29 add_param_list()
8890: 20 61 6e 64 2c 20 69 66 20 66 6f 75 6e 64 2c 20 and, if found,
88a0: 61 70 70 6c 69 65 73 20 69 74 73 20 22 73 6b 69 applies its "ski
88b0: 6e 22 0a 2a 2a 20 73 65 74 74 69 6e 67 2e 20 52 n".** setting. R
88c0: 65 74 75 72 6e 73 20 30 20 69 66 20 6e 6f 20 51 eturns 0 if no Q
88d0: 55 45 52 59 5f 53 54 52 49 4e 47 20 69 73 20 73 UERY_STRING is s
88e0: 65 74 2c 20 31 20 69 66 20 69 74 20 69 73 2c 0a et, 1 if it is,.
88f0: 2a 2a 20 61 6e 64 20 32 20 69 66 20 69 74 20 73 ** and 2 if it s
8900: 65 74 73 20 74 68 65 20 73 6b 69 6e 20 28 69 6e ets the skin (in
8910: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 which case the
8920: 63 6f 6f 6b 69 65 20 6d 61 79 0a 2a 2a 20 73 74 cookie may.** st
8930: 69 6c 6c 20 6e 65 65 64 20 66 6c 75 73 68 69 6e ill need flushin
8940: 67 20 62 79 20 74 68 65 20 70 61 67 65 2c 20 76 g by the page, v
8950: 69 61 20 63 6f 6f 6b 69 65 5f 72 65 6e 64 65 72 ia cookie_render
8960: 28 29 29 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f ())..*/.int cgi_
8970: 73 65 74 75 70 5f 71 75 65 72 79 5f 73 74 72 69 setup_query_stri
8980: 6e 67 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 ng(void){. int
8990: 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a rc = 0;. char *
89a0: 20 7a 20 3d 20 28 63 68 61 72 2a 29 50 28 22 51 z = (char*)P("Q
89b0: 55 45 52 59 5f 53 54 52 49 4e 47 22 29 3b 0a 20 UERY_STRING");.
89c0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 2b 2b if( z ){. ++
89d0: 72 63 3b 0a 20 20 20 20 7a 20 3d 20 66 6f 73 73 rc;. z = foss
89e0: 69 6c 5f 73 74 72 64 75 70 28 7a 29 3b 0a 20 20 il_strdup(z);.
89f0: 20 20 61 64 64 5f 70 61 72 61 6d 5f 6c 69 73 74 add_param_list
8a00: 28 7a 2c 20 27 26 27 29 3b 0a 20 20 20 20 7a 20 (z, '&');. z
8a10: 3d 20 28 63 68 61 72 2a 29 50 28 22 73 6b 69 6e = (char*)P("skin
8a20: 22 29 3b 0a 20 20 20 20 69 66 28 7a 29 7b 0a 20 ");. if(z){.
8a30: 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 char *zErr
8a40: 3d 20 73 6b 69 6e 5f 75 73 65 5f 61 6c 74 65 72 = skin_use_alter
8a50: 6e 61 74 69 76 65 28 7a 2c 20 32 29 3b 0a 20 20 native(z, 2);.
8a60: 20 20 20 20 2b 2b 72 63 3b 0a 20 20 20 20 20 20 ++rc;.
8a70: 69 66 28 21 7a 45 72 72 20 26 26 20 21 50 28 22 if(!zErr && !P("
8a80: 6f 6e 63 65 22 29 29 7b 0a 20 20 20 20 20 20 20 once")){.
8a90: 20 63 6f 6f 6b 69 65 5f 77 72 69 74 65 5f 70 61 cookie_write_pa
8aa0: 72 61 6d 65 74 65 72 28 22 73 6b 69 6e 22 2c 22 rameter("skin","
8ab0: 73 6b 69 6e 22 2c 7a 29 3b 0a 20 20 20 20 20 20 skin",z);.
8ac0: 7d 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 }. fossil_f
8ad0: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 7d ree(zErr);. }
8ae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 . }. return rc
8af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 ;.}../*.** Initi
8b00: 61 6c 69 7a 65 20 74 68 65 20 71 75 65 72 79 20 alize the query
8b10: 70 61 72 61 6d 65 74 65 72 20 64 61 74 61 62 61 parameter databa
8b20: 73 65 2e 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e se. Information
8b30: 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a is pulled from.
8b40: 2a 2a 20 74 68 65 20 51 55 45 52 59 5f 53 54 52 ** the QUERY_STR
8b50: 49 4e 47 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 ING environment
8b60: 76 61 72 69 61 62 6c 65 20 28 69 66 20 69 74 20 variable (if it
8b70: 65 78 69 73 74 73 29 2c 20 66 72 6f 6d 20 73 74 exists), from st
8b80: 61 6e 64 61 72 64 0a 2a 2a 20 69 6e 70 75 74 20 andard.** input
8b90: 69 66 20 74 68 65 72 65 20 69 73 20 50 4f 53 54 if there is POST
8ba0: 20 64 61 74 61 2c 20 61 6e 64 20 66 72 6f 6d 20 data, and from
8bb0: 48 54 54 50 5f 43 4f 4f 4b 49 45 2e 0a 2a 2a 0a HTTP_COOKIE..**.
8bc0: 2a 2a 20 52 45 51 55 45 53 54 5f 55 52 49 2c 20 ** REQUEST_URI,
8bd0: 50 41 54 48 5f 49 4e 46 4f 2c 20 61 6e 64 20 53 PATH_INFO, and S
8be0: 43 52 49 50 54 5f 4e 41 4d 45 20 61 72 65 20 72 CRIPT_NAME are r
8bf0: 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 elated as follow
8c00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 52 45 s:.**.** RE
8c10: 51 55 45 53 54 5f 55 52 49 20 3d 3d 20 53 43 52 QUEST_URI == SCR
8c20: 49 50 54 5f 4e 41 4d 45 20 2b 20 50 41 54 48 5f IPT_NAME + PATH_
8c30: 49 4e 46 4f 0a 2a 2a 0a 2a 2a 20 4f 72 20 69 66 INFO.**.** Or if
8c40: 20 51 55 45 52 59 5f 53 54 52 49 4e 47 20 69 73 QUERY_STRING is
8c50: 20 6e 6f 74 20 65 6d 70 74 79 3a 0a 2a 2a 0a 2a not empty:.**.*
8c60: 2a 20 20 20 20 20 20 52 45 51 55 45 53 54 5f 55 * REQUEST_U
8c70: 52 49 20 3d 3d 20 53 43 52 49 50 54 5f 4e 41 4d RI == SCRIPT_NAM
8c80: 45 20 2b 20 50 41 54 48 5f 49 4e 46 4f 20 2b 20 E + PATH_INFO +
8c90: 27 3f 27 20 2b 20 51 55 45 52 59 5f 53 54 52 49 '?' + QUERY_STRI
8ca0: 4e 47 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 22 NG.**.** Where "
8cb0: 2b 22 20 6d 65 61 6e 73 20 63 6f 6e 63 61 74 65 +" means concate
8cc0: 6e 61 74 65 2e 20 20 46 6f 73 73 69 6c 20 72 65 nate. Fossil re
8cd0: 71 75 69 72 65 73 20 53 43 52 49 50 54 5f 4e 41 quires SCRIPT_NA
8ce0: 4d 45 2e 20 20 49 66 0a 2a 2a 20 52 45 51 55 45 ME. If.** REQUE
8cf0: 53 54 5f 55 52 49 20 69 73 20 70 72 6f 76 69 64 ST_URI is provid
8d00: 65 64 20 62 75 74 20 50 41 54 48 5f 49 4e 46 4f ed but PATH_INFO
8d10: 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 50 41 is not, then PA
8d20: 54 48 5f 49 4e 46 4f 20 69 73 0a 2a 2a 20 63 6f TH_INFO is.** co
8d30: 6d 70 75 74 65 64 20 66 72 6f 6d 20 52 45 51 55 mputed from REQU
8d40: 45 53 54 5f 55 52 49 20 61 6e 64 20 53 43 52 49 EST_URI and SCRI
8d50: 50 54 5f 4e 41 4d 45 2e 20 20 49 66 20 50 41 54 PT_NAME. If PAT
8d60: 48 5f 49 4e 46 4f 20 69 73 20 70 72 6f 76 69 64 H_INFO is provid
8d70: 65 64 0a 2a 2a 20 62 75 74 20 52 45 51 55 45 53 ed.** but REQUES
8d80: 54 5f 55 52 49 20 69 73 20 6e 6f 74 2c 20 74 68 T_URI is not, th
8d90: 65 6e 20 63 6f 6d 70 75 74 65 20 52 45 51 55 45 en compute REQUE
8da0: 53 54 5f 55 52 49 20 66 72 6f 6d 20 50 41 54 48 ST_URI from PATH
8db0: 5f 49 4e 46 4f 20 61 6e 64 0a 2a 2a 20 53 43 52 _INFO and.** SCR
8dc0: 49 50 54 5f 4e 41 4d 45 2e 20 20 49 66 20 6e 65 IPT_NAME. If ne
8dd0: 69 74 68 65 72 20 52 45 51 55 45 53 54 5f 55 52 ither REQUEST_UR
8de0: 49 20 6e 6f 72 20 50 41 54 48 5f 49 4e 46 4f 20 I nor PATH_INFO
8df0: 61 72 65 20 70 72 6f 76 69 64 65 64 2c 20 74 68 are provided, th
8e00: 65 6e 0a 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 en.** assume tha
8e10: 74 20 50 41 54 48 5f 49 4e 46 4f 20 69 73 20 61 t PATH_INFO is a
8e20: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 61 n empty string a
8e30: 6e 64 20 73 65 74 20 52 45 51 55 45 53 54 5f 55 nd set REQUEST_U
8e40: 52 49 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 50 RI equal.** to P
8e50: 41 54 48 5f 49 4e 46 4f 2e 0a 2a 2a 0a 2a 2a 20 ATH_INFO..**.**
8e60: 53 6f 6d 65 74 69 6d 65 73 20 50 41 54 48 5f 49 Sometimes PATH_I
8e70: 4e 46 4f 20 69 73 20 6d 69 73 73 69 6e 67 20 61 NFO is missing a
8e80: 6e 64 20 53 43 52 49 50 54 5f 4e 41 4d 45 20 69 nd SCRIPT_NAME i
8e90: 73 20 6e 6f 74 20 61 20 70 72 65 66 69 78 20 6f s not a prefix o
8ea0: 66 0a 2a 2a 20 52 45 51 55 45 53 54 5f 55 52 49 f.** REQUEST_URI
8eb0: 2e 20 20 28 53 65 65 20 68 74 74 70 73 3a 2f 2f . (See https://
8ec0: 66 6f 73 73 69 6c 2d 73 63 6d 2e 6f 72 67 2f 66 fossil-scm.org/f
8ed0: 6f 72 75 6d 2f 66 6f 72 75 6d 70 6f 73 74 2f 30 orum/forumpost/0
8ee0: 34 39 65 38 36 35 30 65 64 29 0a 2a 2a 20 49 6e 49e8650ed).** In
8ef0: 20 74 68 61 74 20 63 61 73 65 2c 20 74 72 75 6e that case, trun
8f00: 63 61 74 65 20 53 43 52 49 50 54 5f 4e 41 4d 45 cate SCRIPT_NAME
8f10: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 so that it is a
8f20: 20 70 72 6f 70 65 72 20 70 72 65 66 69 78 0a 2a proper prefix.*
8f30: 2a 20 6f 66 20 52 45 51 55 45 53 54 5f 55 52 49 * of REQUEST_URI
8f40: 2e 0a 2a 2a 0a 2a 2a 20 53 43 47 49 20 74 79 70 ..**.** SCGI typ
8f50: 69 63 61 6c 6c 79 20 6f 6d 69 74 73 20 50 41 54 ically omits PAT
8f60: 48 5f 49 4e 46 4f 2e 20 20 43 47 49 20 73 6f 6d H_INFO. CGI som
8f70: 65 74 69 6d 65 73 20 6f 6d 69 74 73 20 52 45 51 etimes omits REQ
8f80: 55 45 53 54 5f 55 52 49 20 61 6e 64 0a 2a 2a 20 UEST_URI and.**
8f90: 50 41 54 48 5f 49 4e 46 4f 20 77 68 65 6e 20 69 PATH_INFO when i
8fa0: 74 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a t is empty..**.*
8fb0: 2a 20 43 47 49 20 50 61 72 61 6d 65 74 65 72 20 * CGI Parameter
8fc0: 71 75 69 63 6b 20 72 65 66 65 72 65 6e 63 65 3a quick reference:
8fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 .**.**
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8ff0: 20 20 20 20 20 20 20 20 20 52 45 51 55 45 53 54 REQUEST
9000: 5f 55 52 49 0a 2a 2a 20 20 20 20 20 20 20 20 20 _URI.**
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9020: 20 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 7c _____________|
9030: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
9040: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 20 20 /
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9070: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 2a 2a \.**
9080: 20 20 20 20 68 74 74 70 73 3a 2f 2f 66 6f 73 73 https://foss
9090: 69 6c 2d 73 63 6d 2e 6f 72 67 2f 66 6f 72 75 6d il-scm.org/forum
90a0: 2f 69 6e 66 6f 2f 31 32 37 33 36 62 33 30 63 30 /info/12736b30c0
90b0: 37 32 35 35 31 61 3f 74 3d 63 0a 2a 2a 20 20 20 72551a?t=c.**
90c0: 20 5c 5f 5f 5f 2f 20 20 20 5c 5f 5f 5f 5f 5f 5f \___/ \______
90d0: 5f 5f 5f 5f 5f 5f 2f 5c 5f 5f 5f 5f 2f 5c 5f 5f ______/\____/\__
90e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
90f0: 5f 5f 2f 20 5c 5f 2f 0a 2a 2a 20 20 20 20 20 20 __/ \_/.**
9100: 7c 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 | |
9110: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 |
9120: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 |
9130: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 7c 20 20 20 |.** |
9140: 20 20 20 20 48 54 54 50 5f 48 4f 53 54 20 20 20 HTTP_HOST
9150: 20 20 20 7c 20 20 20 20 20 20 20 20 50 41 54 48 | PATH
9160: 5f 49 4e 46 4f 20 20 20 20 20 51 55 45 52 59 5f _INFO QUERY_
9170: 53 54 52 49 4e 47 0a 2a 2a 20 20 20 20 20 20 7c STRING.** |
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9190: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 52 45 |.** RE
91a0: 51 55 45 53 54 5f 53 43 48 45 4d 41 20 20 20 20 QUEST_SCHEMA
91b0: 20 20 20 20 20 53 43 52 49 50 54 5f 4e 41 4d 45 SCRIPT_NAME
91c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
91d0: 20 20 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 69 .*/.void cgi_i
91e0: 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 63 68 61 nit(void){. cha
91f0: 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 r *z;. const ch
9200: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 68 61 ar *zType;. cha
9210: 72 20 2a 7a 53 65 6d 69 3b 0a 20 20 69 6e 74 20 r *zSemi;. int
9220: 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 len;. const cha
9230: 72 20 2a 7a 52 65 71 75 65 73 74 55 72 69 20 3d r *zRequestUri =
9240: 20 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 22 cgi_parameter("
9250: 52 45 51 55 45 53 54 5f 55 52 49 22 2c 30 29 3b REQUEST_URI",0);
9260: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
9270: 53 63 72 69 70 74 4e 61 6d 65 20 3d 20 63 67 69 ScriptName = cgi
9280: 5f 70 61 72 61 6d 65 74 65 72 28 22 53 43 52 49 _parameter("SCRI
9290: 50 54 5f 4e 41 4d 45 22 2c 30 29 3b 0a 20 20 63 PT_NAME",0);. c
92a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 onst char *zPath
92b0: 49 6e 66 6f 20 3d 20 63 67 69 5f 70 61 72 61 6d Info = cgi_param
92c0: 65 74 65 72 28 22 50 41 54 48 5f 49 4e 46 4f 22 eter("PATH_INFO"
92d0: 2c 30 29 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e ,0);.#ifdef _WIN
92e0: 33 32 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 32. const char
92f0: 2a 7a 53 65 72 76 65 72 53 6f 66 74 77 61 72 65 *zServerSoftware
9300: 20 3d 20 63 67 69 5f 70 61 72 61 6d 65 74 65 72 = cgi_parameter
9310: 28 22 53 45 52 56 45 52 5f 53 4f 46 54 57 41 52 ("SERVER_SOFTWAR
9320: 45 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 E",0);.#endif..#
9330: 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 ifdef FOSSIL_ENA
9340: 42 4c 45 5f 4a 53 4f 4e 0a 20 20 63 6f 6e 73 74 BLE_JSON. const
9350: 20 69 6e 74 20 6e 6f 4a 73 6f 6e 20 3d 20 50 28 int noJson = P(
9360: 22 6e 6f 5f 6a 73 6f 6e 22 29 21 3d 30 3b 0a 23 "no_json")!=0;.#
9370: 65 6e 64 69 66 0a 20 20 67 2e 69 73 48 54 54 50 endif. g.isHTTP
9380: 20 3d 20 31 3b 0a 20 20 63 67 69 5f 64 65 73 74 = 1;. cgi_dest
9390: 69 6e 61 74 69 6f 6e 28 43 47 49 5f 42 4f 44 59 ination(CGI_BODY
93a0: 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 6d 75 73 74 );.. /* We must
93b0: 20 68 61 76 65 20 53 43 52 49 50 54 5f 4e 41 4d have SCRIPT_NAM
93c0: 45 2e 20 49 66 20 74 68 65 20 77 65 62 20 73 65 E. If the web se
93d0: 72 76 65 72 20 64 69 64 20 6e 6f 74 20 73 75 70 rver did not sup
93e0: 70 6c 79 20 69 74 2c 20 74 72 79 0a 20 20 2a 2a ply it, try. **
93f0: 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20 66 to compute it f
9400: 72 6f 6d 20 52 45 51 55 45 53 54 5f 55 52 49 20 rom REQUEST_URI
9410: 61 6e 64 20 50 41 54 48 5f 49 4e 46 4f 2e 20 2a and PATH_INFO. *
9420: 2f 0a 20 20 69 66 28 20 7a 53 63 72 69 70 74 4e /. if( zScriptN
9430: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 ame==0 ){. if
9440: 28 20 7a 52 65 71 75 65 73 74 55 72 69 3d 3d 30 ( zRequestUri==0
9450: 20 7c 7c 20 7a 50 61 74 68 49 6e 66 6f 3d 3d 30 || zPathInfo==0
9460: 20 29 7b 0a 20 20 20 20 20 20 6d 61 6c 66 6f 72 ){. malfor
9470: 6d 65 64 5f 72 65 71 75 65 73 74 28 22 6d 69 73 med_request("mis
9480: 73 69 6e 67 20 53 43 52 49 50 54 5f 4e 41 4d 45 sing SCRIPT_NAME
9490: 22 29 3b 20 20 2f 2a 20 44 6f 65 73 20 6e 6f 74 "); /* Does not
94a0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 7d return */. }
94b0: 0a 20 20 20 20 7a 20 3d 20 73 74 72 73 74 72 28 . z = strstr(
94c0: 7a 52 65 71 75 65 73 74 55 72 69 2c 7a 50 61 74 zRequestUri,zPat
94d0: 68 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 hInfo);. if(
94e0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 z==0 ){. ma
94f0: 6c 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 74 28 lformed_request(
9500: 22 50 41 54 48 5f 49 4e 46 4f 20 6e 6f 74 20 66 "PATH_INFO not f
9510: 6f 75 6e 64 20 69 6e 20 52 45 51 55 45 53 54 5f ound in REQUEST_
9520: 55 52 49 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 URI");. }.
9530: 20 7a 53 63 72 69 70 74 4e 61 6d 65 20 3d 20 66 zScriptName = f
9540: 6f 73 73 69 6c 5f 73 74 72 6e 64 75 70 28 7a 52 ossil_strndup(zR
9550: 65 71 75 65 73 74 55 72 69 2c 28 69 6e 74 29 28 equestUri,(int)(
9560: 7a 2d 7a 52 65 71 75 65 73 74 55 72 69 29 29 3b z-zRequestUri));
9570: 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 . cgi_set_par
9580: 61 6d 65 74 65 72 28 22 53 43 52 49 50 54 5f 4e ameter("SCRIPT_N
9590: 41 4d 45 22 2c 20 7a 53 63 72 69 70 74 4e 61 6d AME", zScriptNam
95a0: 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 e);. }..#ifdef
95b0: 5f 57 49 4e 33 32 0a 20 20 2f 2a 20 54 68 65 20 _WIN32. /* The
95c0: 4d 69 63 72 6f 73 6f 66 74 20 49 49 53 20 77 65 Microsoft IIS we
95d0: 62 20 73 65 72 76 65 72 20 64 6f 65 73 20 6e 6f b server does no
95e0: 74 20 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 t define REQUEST
95f0: 5f 55 52 49 2c 20 69 6e 73 74 65 61 64 20 69 74 _URI, instead it
9600: 20 75 73 65 73 0a 20 20 2a 2a 20 50 41 54 48 5f uses. ** PATH_
9610: 49 4e 46 4f 20 66 6f 72 20 76 69 72 74 75 61 6c INFO for virtual
9620: 6c 79 20 74 68 65 20 73 61 6d 65 20 70 75 72 70 ly the same purp
9630: 6f 73 65 2e 20 20 44 65 66 69 6e 65 20 52 45 51 ose. Define REQ
9640: 55 45 53 54 5f 55 52 49 20 74 68 65 20 73 61 6d UEST_URI the sam
9650: 65 20 61 73 0a 20 20 2a 2a 20 50 41 54 48 5f 49 e as. ** PATH_I
9660: 4e 46 4f 20 61 6e 64 20 72 65 64 65 66 69 6e 65 NFO and redefine
9670: 20 50 41 54 48 5f 49 4e 46 4f 20 77 69 74 68 20 PATH_INFO with
9680: 53 43 52 49 50 54 5f 4e 41 4d 45 20 72 65 6d 6f SCRIPT_NAME remo
9690: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 ved from the .
96a0: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 2e 20 2a 2f ** beginning. */
96b0: 0a 20 20 69 66 28 20 7a 53 65 72 76 65 72 53 6f . if( zServerSo
96c0: 66 74 77 61 72 65 20 26 26 20 73 74 72 73 74 72 ftware && strstr
96d0: 28 7a 53 65 72 76 65 72 53 6f 66 74 77 61 72 65 (zServerSoftware
96e0: 2c 20 22 4d 69 63 72 6f 73 6f 66 74 2d 49 49 53 , "Microsoft-IIS
96f0: 22 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c ") ){. int i,
9700: 20 6a 3b 0a 20 20 20 20 63 67 69 5f 73 65 74 5f j;. cgi_set_
9710: 70 61 72 61 6d 65 74 65 72 28 22 52 45 51 55 45 parameter("REQUE
9720: 53 54 5f 55 52 49 22 2c 20 7a 50 61 74 68 49 6e ST_URI", zPathIn
9730: 66 6f 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 fo);. for(i=0
9740: 3b 20 7a 50 61 74 68 49 6e 66 6f 5b 69 5d 3d 3d ; zPathInfo[i]==
9750: 7a 53 63 72 69 70 74 4e 61 6d 65 5b 69 5d 20 26 zScriptName[i] &
9760: 26 20 7a 50 61 74 68 49 6e 66 6f 5b 69 5d 3b 20 & zPathInfo[i];
9770: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a i++){}. for(j
9780: 3d 69 3b 20 7a 50 61 74 68 49 6e 66 6f 5b 6a 5d =i; zPathInfo[j]
9790: 20 26 26 20 7a 50 61 74 68 49 6e 66 6f 5b 6a 5d && zPathInfo[j]
97a0: 21 3d 27 3f 27 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 !='?'; j++){}.
97b0: 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20 66 6f zPathInfo = fo
97c0: 73 73 69 6c 5f 73 74 72 6e 64 75 70 28 7a 50 61 ssil_strndup(zPa
97d0: 74 68 49 6e 66 6f 2b 69 2c 20 6a 2d 69 29 3b 0a thInfo+i, j-i);.
97e0: 20 20 20 20 63 67 69 5f 72 65 70 6c 61 63 65 5f cgi_replace_
97f0: 70 61 72 61 6d 65 74 65 72 28 22 50 41 54 48 5f parameter("PATH_
9800: 49 4e 46 4f 22 2c 20 7a 50 61 74 68 49 6e 66 6f INFO", zPathInfo
9810: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 );. }.#endif.
9820: 69 66 28 20 7a 52 65 71 75 65 73 74 55 72 69 3d if( zRequestUri=
9830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 =0 ){. const
9840: 63 68 61 72 20 2a 7a 20 3d 20 7a 50 61 74 68 49 char *z = zPathI
9850: 6e 66 6f 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 nfo;. const c
9860: 68 61 72 20 2a 7a 51 53 20 3d 20 63 67 69 5f 70 har *zQS = cgi_p
9870: 61 72 61 6d 65 74 65 72 28 22 51 55 45 52 59 5f arameter("QUERY_
9880: 53 54 52 49 4e 47 22 2c 30 29 3b 0a 20 20 20 20 STRING",0);.
9890: 69 66 28 20 7a 50 61 74 68 49 6e 66 6f 3d 3d 30 if( zPathInfo==0
98a0: 20 29 7b 0a 20 20 20 20 20 20 6d 61 6c 66 6f 72 ){. malfor
98b0: 6d 65 64 5f 72 65 71 75 65 73 74 28 22 6d 69 73 med_request("mis
98c0: 73 69 6e 67 20 50 41 54 48 5f 49 4e 46 4f 20 61 sing PATH_INFO a
98d0: 6e 64 2f 6f 72 20 52 45 51 55 45 53 54 5f 55 52 nd/or REQUEST_UR
98e0: 49 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 I");. }. i
98f0: 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 29 20 7a f( z[0]=='/' ) z
9900: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 51 53 20 ++;. if( zQS
9910: 26 26 20 7a 51 53 5b 30 5d 20 29 7b 0a 20 20 20 && zQS[0] ){.
9920: 20 20 20 7a 52 65 71 75 65 73 74 55 72 69 20 3d zRequestUri =
9930: 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 25 73 3f mprintf("%s/%s?
9940: 25 73 22 2c 20 7a 53 63 72 69 70 74 4e 61 6d 65 %s", zScriptName
9950: 2c 20 7a 2c 20 7a 51 53 29 3b 0a 20 20 20 20 7d , z, zQS);. }
9960: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 52 65 71 else{. zReq
9970: 75 65 73 74 55 72 69 20 3d 20 6d 70 72 69 6e 74 uestUri = mprint
9980: 66 28 22 25 73 2f 25 73 22 2c 20 7a 53 63 72 69 f("%s/%s", zScri
9990: 70 74 4e 61 6d 65 2c 20 7a 29 3b 0a 20 20 20 20 ptName, z);.
99a0: 7d 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 }. cgi_set_pa
99b0: 72 61 6d 65 74 65 72 28 22 52 45 51 55 45 53 54 rameter("REQUEST
99c0: 5f 55 52 49 22 2c 20 7a 52 65 71 75 65 73 74 55 _URI", zRequestU
99d0: 72 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a ri);. }. if( z
99e0: 50 61 74 68 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 PathInfo==0 ){.
99f0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 int i, j;.
9a00: 20 66 6f 72 28 69 3d 30 3b 20 7a 52 65 71 75 65 for(i=0; zReque
9a10: 73 74 55 72 69 5b 69 5d 3d 3d 7a 53 63 72 69 70 stUri[i]==zScrip
9a20: 74 4e 61 6d 65 5b 69 5d 20 26 26 20 7a 52 65 71 tName[i] && zReq
9a30: 75 65 73 74 55 72 69 5b 69 5d 3b 20 69 2b 2b 29 uestUri[i]; i++)
9a40: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 {}. for(j=i;
9a50: 7a 52 65 71 75 65 73 74 55 72 69 5b 6a 5d 20 26 zRequestUri[j] &
9a60: 26 20 7a 52 65 71 75 65 73 74 55 72 69 5b 6a 5d & zRequestUri[j]
9a70: 21 3d 27 3f 27 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 !='?'; j++){}.
9a80: 20 20 7a 50 61 74 68 49 6e 66 6f 20 3d 20 66 6f zPathInfo = fo
9a90: 73 73 69 6c 5f 73 74 72 6e 64 75 70 28 7a 52 65 ssil_strndup(zRe
9aa0: 71 75 65 73 74 55 72 69 2b 69 2c 20 6a 2d 69 29 questUri+i, j-i)
9ab0: 3b 0a 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 ;. cgi_set_pa
9ac0: 72 61 6d 65 74 65 72 5f 6e 6f 63 6f 70 79 28 22 rameter_nocopy("
9ad0: 50 41 54 48 5f 49 4e 46 4f 22 2c 20 7a 50 61 74 PATH_INFO", zPat
9ae0: 68 49 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 hInfo, 0);. i
9af0: 66 28 20 6a 3e 69 20 26 26 20 7a 53 63 72 69 70 f( j>i && zScrip
9b00: 74 4e 61 6d 65 5b 69 5d 21 3d 30 20 29 7b 0a 20 tName[i]!=0 ){.
9b10: 20 20 20 20 20 2f 2a 20 49 66 20 53 43 52 49 50 /* If SCRIP
9b20: 54 5f 4e 41 4d 45 20 69 73 20 6e 6f 74 20 61 20 T_NAME is not a
9b30: 70 72 65 66 69 78 20 6f 66 20 52 45 51 55 45 53 prefix of REQUES
9b40: 54 5f 55 52 49 2c 20 74 72 75 6e 63 61 74 65 20 T_URI, truncate
9b50: 69 74 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 74 it so. ** t
9b60: 68 61 74 20 69 74 20 69 73 2e 20 20 53 65 65 20 hat it is. See
9b70: 68 74 74 70 73 3a 2f 2f 66 6f 73 73 69 6c 2d 73 https://fossil-s
9b80: 63 6d 2e 6f 72 67 2f 66 6f 72 75 6d 2f 66 6f 72 cm.org/forum/for
9b90: 75 6d 70 6f 73 74 2f 30 34 39 65 38 36 35 30 65 umpost/049e8650e
9ba0: 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 d. */.
9bb0: 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20 66 6f char *zNew = fo
9bc0: 73 73 69 6c 5f 73 74 72 6e 64 75 70 28 7a 53 63 ssil_strndup(zSc
9bd0: 72 69 70 74 4e 61 6d 65 2c 20 69 29 3b 0a 20 20 riptName, i);.
9be0: 20 20 20 20 63 67 69 5f 72 65 70 6c 61 63 65 5f cgi_replace_
9bf0: 70 61 72 61 6d 65 74 65 72 28 22 53 43 52 49 50 parameter("SCRIP
9c00: 54 5f 4e 41 4d 45 22 2c 20 7a 4e 65 77 29 3b 0a T_NAME", zNew);.
9c10: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 }. }.#ifdef
9c20: 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a FOSSIL_ENABLE_J
9c30: 53 4f 4e 0a 20 20 69 66 28 6e 6f 4a 73 6f 6e 3d SON. if(noJson=
9c40: 3d 30 20 26 26 20 6a 73 6f 6e 5f 72 65 71 75 65 =0 && json_reque
9c50: 73 74 5f 69 73 5f 6a 73 6f 6e 5f 61 70 69 28 7a st_is_json_api(z
9c60: 50 61 74 68 49 6e 66 6f 29 29 7b 0a 20 20 20 20 PathInfo)){.
9c70: 2f 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 63 68 /* We need to ch
9c80: 61 6e 67 65 20 73 6f 6d 65 20 66 6f 6c 6c 6f 77 ange some follow
9c90: 69 6e 67 20 62 65 68 61 76 69 6f 75 72 20 64 65 ing behaviour de
9ca0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 pending on wheth
9cb0: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 er. ** we are
9cc0: 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 4a 53 operating in JS
9cd0: 4f 4e 20 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e 20 ON mode or not.
9ce0: 57 65 20 63 61 6e 6e 6f 74 2c 20 68 6f 77 65 76 We cannot, howev
9cf0: 65 72 2c 20 62 65 0a 20 20 20 20 2a 2a 20 63 65 er, be. ** ce
9d00: 72 74 61 69 6e 20 77 68 65 74 68 65 72 20 77 65 rtain whether we
9d10: 20 73 68 6f 75 6c 64 2f 6e 65 65 64 20 74 6f 20 should/need to
9d20: 62 65 20 69 6e 20 4a 53 4f 4e 20 6d 6f 64 65 20 be in JSON mode
9d30: 75 6e 74 69 6c 20 74 68 65 0a 20 20 20 20 2a 2a until the. **
9d40: 20 50 41 54 48 5f 49 4e 46 4f 20 69 73 20 73 65 PATH_INFO is se
9d50: 74 20 75 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 t up.. */.
9d60: 20 67 2e 6a 73 6f 6e 2e 69 73 4a 73 6f 6e 4d 6f g.json.isJsonMo
9d70: 64 65 20 3d 20 31 3b 0a 20 20 20 20 6a 73 6f 6e de = 1;. json
9d80: 5f 62 6f 6f 74 73 74 72 61 70 5f 65 61 72 6c 79 _bootstrap_early
9d90: 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ();. }else{.
9da0: 20 61 73 73 65 72 74 28 21 67 2e 6a 73 6f 6e 2e assert(!g.json.
9db0: 69 73 4a 73 6f 6e 4d 6f 64 65 20 26 26 0a 20 20 isJsonMode &&.
9dc0: 20 20 20 20 20 20 20 20 20 22 49 6e 74 65 72 6e "Intern
9dd0: 61 6c 20 6d 69 73 63 6f 6e 66 69 67 75 72 61 74 al misconfigurat
9de0: 69 6f 6e 20 6f 66 20 67 2e 6a 73 6f 6e 2e 69 73 ion of g.json.is
9df0: 4a 73 6f 6e 4d 6f 64 65 22 29 3b 0a 20 20 7d 0a JsonMode");. }.
9e00: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 28 63 68 #endif. z = (ch
9e10: 61 72 2a 29 50 28 22 48 54 54 50 5f 43 4f 4f 4b ar*)P("HTTP_COOK
9e20: 49 45 22 29 3b 0a 20 20 69 66 28 20 7a 20 29 7b IE");. if( z ){
9e30: 0a 20 20 20 20 7a 20 3d 20 66 6f 73 73 69 6c 5f . z = fossil_
9e40: 73 74 72 64 75 70 28 7a 29 3b 0a 20 20 20 20 61 strdup(z);. a
9e50: 64 64 5f 70 61 72 61 6d 5f 6c 69 73 74 28 7a 2c dd_param_list(z,
9e60: 20 27 3b 27 29 3b 0a 20 20 20 20 7a 20 3d 20 28 ';');. z = (
9e70: 63 68 61 72 2a 29 63 6f 6f 6b 69 65 5f 76 61 6c char*)cookie_val
9e80: 75 65 28 22 73 6b 69 6e 22 2c 30 29 3b 0a 20 20 ue("skin",0);.
9e90: 20 20 69 66 28 7a 29 7b 0a 20 20 20 20 20 20 73 if(z){. s
9ea0: 6b 69 6e 5f 75 73 65 5f 61 6c 74 65 72 6e 61 74 kin_use_alternat
9eb0: 69 76 65 28 7a 2c 20 32 29 3b 0a 20 20 20 20 7d ive(z, 2);. }
9ec0: 0a 20 20 7d 0a 0a 20 20 63 67 69 5f 73 65 74 75 . }.. cgi_setu
9ed0: 70 5f 71 75 65 72 79 5f 73 74 72 69 6e 67 28 29 p_query_string()
9ee0: 3b 0a 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 ;.. z = (char*)
9ef0: 50 28 22 52 45 4d 4f 54 45 5f 41 44 44 52 22 29 P("REMOTE_ADDR")
9f00: 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 ;. if( z ){.
9f10: 20 67 2e 7a 49 70 41 64 64 72 20 3d 20 66 6f 73 g.zIpAddr = fos
9f20: 73 69 6c 5f 73 74 72 64 75 70 28 7a 29 3b 0a 20 sil_strdup(z);.
9f30: 20 7d 0a 0a 20 20 6c 65 6e 20 3d 20 61 74 6f 69 }.. len = atoi
9f40: 28 50 44 28 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e (PD("CONTENT_LEN
9f50: 47 54 48 22 2c 20 22 30 22 29 29 3b 0a 20 20 7a GTH", "0"));. z
9f60: 54 79 70 65 20 3d 20 50 28 22 43 4f 4e 54 45 4e Type = P("CONTEN
9f70: 54 5f 54 59 50 45 22 29 3b 0a 20 20 7a 53 65 6d T_TYPE");. zSem
9f80: 69 20 3d 20 7a 54 79 70 65 20 3f 20 73 74 72 63 i = zType ? strc
9f90: 68 72 28 7a 54 79 70 65 2c 20 27 3b 27 29 20 3a hr(zType, ';') :
9fa0: 20 30 3b 0a 20 20 69 66 28 20 7a 53 65 6d 69 20 0;. if( zSemi
9fb0: 29 7b 0a 20 20 20 20 67 2e 7a 43 6f 6e 74 65 6e ){. g.zConten
9fc0: 74 54 79 70 65 20 3d 20 66 6f 73 73 69 6c 5f 73 tType = fossil_s
9fd0: 74 72 6e 64 75 70 28 7a 54 79 70 65 2c 20 28 69 trndup(zType, (i
9fe0: 6e 74 29 28 7a 53 65 6d 69 2d 7a 54 79 70 65 29 nt)(zSemi-zType)
9ff0: 29 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 67 );. zType = g
a000: 2e 7a 43 6f 6e 74 65 6e 74 54 79 70 65 3b 0a 20 .zContentType;.
a010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e 7a 43 }else{. g.zC
a020: 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 7a 54 79 ontentType = zTy
a030: 70 65 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a pe;. }. blob_z
a040: 65 72 6f 28 26 67 2e 63 67 69 49 6e 29 3b 0a 20 ero(&g.cgiIn);.
a050: 20 69 66 28 20 6c 65 6e 3e 30 20 26 26 20 7a 54 if( len>0 && zT
a060: 79 70 65 20 29 7b 0a 20 20 20 20 69 66 28 20 62 ype ){. if( b
a070: 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63 67 lob_read_from_cg
a080: 69 28 26 67 2e 63 67 69 49 6e 2c 20 6c 65 6e 29 i(&g.cgiIn, len)
a090: 3c 6c 65 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 <len ){. ch
a0a0: 61 72 20 2a 7a 4d 73 67 20 3d 20 6d 70 72 69 6e ar *zMsg = mprin
a0b0: 74 66 28 22 43 47 49 20 63 6f 6e 74 65 6e 74 2d tf("CGI content-
a0c0: 6c 65 6e 67 74 68 20 6d 69 73 6d 61 74 63 68 3a length mismatch:
a0d0: 20 20 57 61 6e 74 65 64 20 25 64 20 62 79 74 65 Wanted %d byte
a0e0: 73 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 s".
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 "
a100: 62 75 74 20 67 6f 74 20 6f 6e 6c 79 20 25 64 5c but got only %d\
a110: 6e 22 2c 20 6c 65 6e 2c 20 62 6c 6f 62 5f 73 69 n", len, blob_si
a120: 7a 65 28 26 67 2e 63 67 69 49 6e 29 29 3b 0a 20 ze(&g.cgiIn));.
a130: 20 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 malformed_r
a140: 65 71 75 65 73 74 28 7a 4d 73 67 29 3b 0a 20 20 equest(zMsg);.
a150: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 6f 73 73 }. if( foss
a160: 69 6c 5f 73 74 72 63 6d 70 28 7a 54 79 70 65 2c il_strcmp(zType,
a170: 20 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d "application/x-
a180: 66 6f 73 73 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 fossil")==0 ){.
a190: 20 20 20 20 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 blob_uncomp
a1a0: 72 65 73 73 28 26 67 2e 63 67 69 49 6e 2c 20 26 ress(&g.cgiIn, &
a1b0: 67 2e 63 67 69 49 6e 29 3b 0a 20 20 20 20 7d 0a g.cgiIn);. }.
a1c0: 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e #ifdef FOSSIL_EN
a1d0: 41 42 4c 45 5f 4a 53 4f 4e 0a 20 20 20 20 69 66 ABLE_JSON. if
a1e0: 28 20 6e 6f 4a 73 6f 6e 3d 3d 30 20 26 26 20 67 ( noJson==0 && g
a1f0: 2e 6a 73 6f 6e 2e 69 73 4a 73 6f 6e 4d 6f 64 65 .json.isJsonMode
a200: 21 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6a !=0. && j
a210: 73 6f 6e 5f 63 61 6e 5f 63 6f 6e 73 75 6d 65 5f son_can_consume_
a220: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 7a 54 79 content_type(zTy
a230: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 pe)!=0 ){.
a240: 63 67 69 5f 70 61 72 73 65 5f 50 4f 53 54 5f 4a cgi_parse_POST_J
a250: 53 4f 4e 28 26 67 2e 63 67 69 49 6e 29 3b 0a 20 SON(&g.cgiIn);.
a260: 20 20 20 20 20 63 67 69 5f 73 65 74 5f 63 6f 6e cgi_set_con
a270: 74 65 6e 74 5f 74 79 70 65 28 6a 73 6f 6e 5f 67 tent_type(json_g
a280: 75 65 73 73 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 uess_content_typ
a290: 65 28 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 e());. }.#end
a2a0: 69 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 45 4e 41 if /* FOSSIL_ENA
a2b0: 42 4c 45 5f 4a 53 4f 4e 20 2a 2f 0a 20 20 7d 0a BLE_JSON */. }.
a2c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 }../*.** Decode
a2d0: 50 4f 53 54 20 70 61 72 61 6d 65 74 65 72 20 69 POST parameter i
a2e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 nformation in th
a2f0: 65 20 63 67 69 49 6e 20 63 6f 6e 74 65 6e 74 2c e cgiIn content,
a300: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 76 6f 69 64 if any..*/.void
a310: 20 63 67 69 5f 64 65 63 6f 64 65 5f 70 6f 73 74 cgi_decode_post
a320: 5f 70 61 72 61 6d 65 74 65 72 73 28 76 6f 69 64 _parameters(void
a330: 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 62 ){. int len = b
a340: 6c 6f 62 5f 73 69 7a 65 28 26 67 2e 63 67 69 49 lob_size(&g.cgiI
a350: 6e 29 3b 0a 20 20 69 66 28 20 6c 65 6e 3d 3d 30 n);. if( len==0
a360: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 ) return;. if(
a370: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 67 fossil_strcmp(g
a380: 2e 7a 43 6f 6e 74 65 6e 74 54 79 70 65 2c 22 61 .zContentType,"a
a390: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 77 77 77 pplication/x-www
a3a0: 2d 66 6f 72 6d 2d 75 72 6c 65 6e 63 6f 64 65 64 -form-urlencoded
a3b0: 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 6e ")==0. || strn
a3c0: 63 6d 70 28 67 2e 7a 43 6f 6e 74 65 6e 74 54 79 cmp(g.zContentTy
a3d0: 70 65 2c 22 6d 75 6c 74 69 70 61 72 74 2f 66 6f pe,"multipart/fo
a3e0: 72 6d 2d 64 61 74 61 22 2c 31 39 29 3d 3d 30 0a rm-data",19)==0.
a3f0: 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a ){. char *z
a400: 20 3d 20 62 6c 6f 62 5f 73 74 72 28 26 67 2e 63 = blob_str(&g.c
a410: 67 69 49 6e 29 3b 0a 20 20 20 20 63 67 69 5f 74 giIn);. cgi_t
a420: 72 61 63 65 28 7a 29 3b 0a 20 20 20 20 69 66 28 race(z);. if(
a430: 20 67 2e 7a 43 6f 6e 74 65 6e 74 54 79 70 65 5b g.zContentType[
a440: 30 5d 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20 20 0]=='a' ){.
a450: 20 61 64 64 5f 70 61 72 61 6d 5f 6c 69 73 74 28 add_param_list(
a460: 7a 2c 20 27 26 27 29 3b 0a 20 20 20 20 7d 65 6c z, '&');. }el
a470: 73 65 7b 0a 20 20 20 20 20 20 70 72 6f 63 65 73 se{. proces
a480: 73 5f 6d 75 6c 74 69 70 61 72 74 5f 66 6f 72 6d s_multipart_form
a490: 5f 64 61 74 61 28 7a 2c 20 6c 65 6e 29 3b 0a 20 _data(z, len);.
a4a0: 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 69 6e }. blob_in
a4b0: 69 74 28 26 67 2e 63 67 69 49 6e 2c 20 30 2c 20 it(&g.cgiIn, 0,
a4c0: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 0);. }.}../*.**
a4d0: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d This is the com
a4e0: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e parison function
a4f0: 20 75 73 65 64 20 74 6f 20 73 6f 72 74 20 74 68 used to sort th
a500: 65 20 61 50 61 72 61 6d 51 50 5b 5d 20 61 72 72 e aParamQP[] arr
a510: 61 79 20 6f 66 0a 2a 2a 20 71 75 65 72 79 20 70 ay of.** query p
a520: 61 72 61 6d 65 74 65 72 73 20 61 6e 64 20 63 6f arameters and co
a530: 6f 6b 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 okies..*/.static
a540: 20 69 6e 74 20 71 70 61 72 61 6d 5f 63 6f 6d 70 int qparam_comp
a550: 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a are(const void *
a560: 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 a, const void *b
a570: 29 7b 0a 20 20 73 74 72 75 63 74 20 51 50 61 72 ){. struct QPar
a580: 61 6d 20 2a 70 41 20 3d 20 28 73 74 72 75 63 74 am *pA = (struct
a590: 20 51 50 61 72 61 6d 2a 29 61 3b 0a 20 20 73 74 QParam*)a;. st
a5a0: 72 75 63 74 20 51 50 61 72 61 6d 20 2a 70 42 20 ruct QParam *pB
a5b0: 3d 20 28 73 74 72 75 63 74 20 51 50 61 72 61 6d = (struct QParam
a5c0: 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 *)b;. int c;.
a5d0: 63 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d c = fossil_strcm
a5e0: 70 28 70 41 2d 3e 7a 4e 61 6d 65 2c 20 70 42 2d p(pA->zName, pB-
a5f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 >zName);. if( c
a600: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 ==0 ){. c = p
a610: 41 2d 3e 73 65 71 20 2d 20 70 42 2d 3e 73 65 71 A->seq - pB->seq
a620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 ;. }. return c
a630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
a640: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 n the value of a
a650: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 query parameter
a660: 20 6f 72 20 63 6f 6f 6b 69 65 20 77 68 6f 73 65 or cookie whose
a670: 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 2e 0a name is zName..
a680: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e ** If there is n
a690: 6f 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 o query paramete
a6a0: 72 20 6f 72 20 63 6f 6f 6b 69 65 20 6e 61 6d 65 r or cookie name
a6b0: 64 20 7a 4e 61 6d 65 20 61 6e 64 20 74 68 65 20 d zName and the
a6c0: 66 69 72 73 74 0a 2a 2a 20 63 68 61 72 61 63 74 first.** charact
a6d0: 65 72 20 6f 66 20 7a 4e 61 6d 65 20 69 73 20 75 er of zName is u
a6e0: 70 70 65 72 63 61 73 65 2c 20 74 68 65 6e 20 63 ppercase, then c
a6f0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 heck to see if t
a700: 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 65 6e here is an.** en
a710: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 vironment variab
a720: 6c 65 20 62 79 20 74 68 61 74 20 6e 61 6d 65 20 le by that name
a730: 61 6e 64 20 72 65 74 75 72 6e 20 69 74 20 69 66 and return it if
a740: 20 74 68 65 72 65 20 69 73 2e 20 20 41 73 0a 2a there is. As.*
a750: 2a 20 61 20 6c 61 73 74 20 72 65 73 6f 72 74 20 * a last resort
a760: 77 68 65 6e 20 6e 6f 74 68 69 6e 67 20 65 6c 73 when nothing els
a770: 65 20 6d 61 74 63 68 65 73 2c 20 72 65 74 75 72 e matches, retur
a780: 6e 20 7a 44 65 66 61 75 6c 74 2e 0a 2a 2f 0a 63 n zDefault..*/.c
a790: 6f 6e 73 74 20 63 68 61 72 20 2a 63 67 69 5f 70 onst char *cgi_p
a7a0: 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 arameter(const c
a7b0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 har *zName, cons
a7c0: 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 t char *zDefault
a7d0: 29 7b 0a 20 20 69 6e 74 20 6c 6f 2c 20 68 69 2c ){. int lo, hi,
a7e0: 20 6d 69 64 2c 20 63 3b 0a 0a 20 20 2f 2a 20 54 mid, c;.. /* T
a7f0: 68 65 20 73 6f 72 74 51 50 20 66 6c 61 67 20 69 he sortQP flag i
a800: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61 s set whenever a
a810: 20 6e 65 77 20 71 75 65 72 79 20 70 61 72 61 6d new query param
a820: 65 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 eter is inserted
a830: 2e 0a 20 20 2a 2a 20 49 74 20 69 6e 64 69 63 61 .. ** It indica
a840: 74 65 73 20 74 68 61 74 20 77 65 20 6e 65 65 64 tes that we need
a850: 20 74 6f 20 72 65 73 6f 72 74 20 74 68 65 20 71 to resort the q
a860: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e uery parameters.
a870: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 6f 72 74 . */. if( sort
a880: 51 50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c QP ){. int i,
a890: 20 6a 3b 0a 20 20 20 20 71 73 6f 72 74 28 61 50 j;. qsort(aP
a8a0: 61 72 61 6d 51 50 2c 20 6e 55 73 65 64 51 50 2c aramQP, nUsedQP,
a8b0: 20 73 69 7a 65 6f 66 28 61 50 61 72 61 6d 51 50 sizeof(aParamQP
a8c0: 5b 30 5d 29 2c 20 71 70 61 72 61 6d 5f 63 6f 6d [0]), qparam_com
a8d0: 70 61 72 65 29 3b 0a 20 20 20 20 73 6f 72 74 51 pare);. sortQ
a8e0: 50 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 41 66 P = 0;. /* Af
a8f0: 74 65 72 20 73 6f 72 74 69 6e 67 2c 20 72 65 6d ter sorting, rem
a900: 6f 76 65 20 64 75 70 6c 69 63 61 74 65 20 70 61 ove duplicate pa
a910: 72 61 6d 65 74 65 72 73 2e 20 20 54 68 65 20 73 rameters. The s
a920: 65 63 6f 6e 64 61 72 79 20 73 6f 72 74 0a 20 20 econdary sort.
a930: 20 20 2a 2a 20 6b 65 79 20 69 73 20 61 50 61 72 ** key is aPar
a940: 61 6d 51 50 5b 5d 2e 73 65 71 20 61 6e 64 20 77 amQP[].seq and w
a950: 65 20 6b 65 65 70 20 74 68 65 20 66 69 72 73 74 e keep the first
a960: 20 65 6e 74 72 79 2e 20 20 54 68 61 74 20 6d 65 entry. That me
a970: 61 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 ans. ** with
a980: 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 73 20 duplicate calls
a990: 74 6f 20 63 67 69 5f 73 65 74 5f 70 61 72 61 6d to cgi_set_param
a9a0: 65 74 65 72 28 29 20 74 68 65 20 73 65 63 6f 6e eter() the secon
a9b0: 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 75 62 d and. ** sub
a9c0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 61 72 sequent calls ar
a9d0: 65 20 65 66 66 65 63 74 69 76 65 6c 79 20 6e 6f e effectively no
a9e0: 2d 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 -ops. */. for
a9f0: 28 69 3d 6a 3d 31 3b 20 69 3c 6e 55 73 65 64 51 (i=j=1; i<nUsedQ
aa00: 50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 P; i++){. i
aa10: 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 f( fossil_strcmp
aa20: 28 61 50 61 72 61 6d 51 50 5b 69 5d 2e 7a 4e 61 (aParamQP[i].zNa
aa30: 6d 65 2c 61 50 61 72 61 6d 51 50 5b 69 2d 31 5d me,aParamQP[i-1]
aa40: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 .zName)==0 ){.
aa50: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a continue;.
aa60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 }. if
aa70: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 20 ( j<i ){.
aa80: 20 6d 65 6d 63 70 79 28 26 61 50 61 72 61 6d 51 memcpy(&aParamQ
aa90: 50 5b 6a 5d 2c 20 26 61 50 61 72 61 6d 51 50 5b P[j], &aParamQP[
aaa0: 69 5d 2c 20 73 69 7a 65 6f 66 28 61 50 61 72 61 i], sizeof(aPara
aab0: 6d 51 50 5b 6a 5d 29 29 3b 0a 20 20 20 20 20 20 mQP[j]));.
aac0: 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 }. j++;.
aad0: 20 7d 0a 20 20 20 20 6e 55 73 65 64 51 50 20 3d }. nUsedQP =
aae0: 20 6a 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e j;. }.. /* In
aaf0: 76 6f 6b 69 6e 67 20 77 69 74 68 20 61 20 4e 55 voking with a NU
ab00: 4c 4c 20 7a 4e 61 6d 65 20 69 73 20 6a 75 73 74 LL zName is just
ab10: 20 61 20 77 61 79 20 74 6f 20 63 61 75 73 65 20 a way to cause
ab20: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 0a 20 the parameters.
ab30: 20 2a 2a 20 74 6f 20 62 65 20 73 6f 72 74 65 64 ** to be sorted
ab40: 2e 20 20 53 6f 20 67 6f 20 61 68 65 61 64 20 61 . So go ahead a
ab50: 6e 64 20 62 61 69 6c 20 6f 75 74 20 69 6e 20 74 nd bail out in t
ab60: 68 61 74 20 63 61 73 65 20 2a 2f 0a 20 20 69 66 hat case */. if
ab70: 28 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 4e ( zName==0 || zN
ab80: 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 ame[0]==0 ) retu
ab90: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 rn 0;.. /* Do a
aba0: 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 66 binary search f
abb0: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 71 75 or a matching qu
abc0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 2a 2f ery parameter */
abd0: 0a 20 20 6c 6f 20 3d 20 30 3b 0a 20 20 68 69 20 . lo = 0;. hi
abe0: 3d 20 6e 55 73 65 64 51 50 2d 31 3b 0a 20 20 77 = nUsedQP-1;. w
abf0: 68 69 6c 65 28 20 6c 6f 3c 3d 68 69 20 29 7b 0a hile( lo<=hi ){.
ac00: 20 20 20 20 6d 69 64 20 3d 20 28 6c 6f 2b 68 69 mid = (lo+hi
ac10: 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 66 6f 73 )/2;. c = fos
ac20: 73 69 6c 5f 73 74 72 63 6d 70 28 61 50 61 72 61 sil_strcmp(aPara
ac30: 6d 51 50 5b 6d 69 64 5d 2e 7a 4e 61 6d 65 2c 20 mQP[mid].zName,
ac40: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 zName);. if(
ac50: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 43 47 c==0 ){. CG
ac60: 49 44 45 42 55 47 28 28 22 6d 65 6d 2d 6d 61 74 IDEBUG(("mem-mat
ac70: 63 68 20 5b 25 73 5d 20 3d 20 5b 25 73 5d 5c 6e ch [%s] = [%s]\n
ac80: 22 2c 20 7a 4e 61 6d 65 2c 20 61 50 61 72 61 6d ", zName, aParam
ac90: 51 50 5b 6d 69 64 5d 2e 7a 56 61 6c 75 65 29 29 QP[mid].zValue))
aca0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 ;. return a
acb0: 50 61 72 61 6d 51 50 5b 6d 69 64 5d 2e 7a 56 61 ParamQP[mid].zVa
acc0: 6c 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 lue;. }else i
acd0: 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 f( c>0 ){.
ace0: 68 69 20 3d 20 6d 69 64 2d 31 3b 0a 20 20 20 20 hi = mid-1;.
acf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 20 }else{. lo
ad00: 3d 20 6d 69 64 2b 31 3b 0a 20 20 20 20 7d 0a 20 = mid+1;. }.
ad10: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d }.. /* If no m
ad20: 61 74 63 68 20 69 73 20 66 6f 75 6e 64 20 61 6e atch is found an
ad30: 64 20 74 68 65 20 6e 61 6d 65 20 62 65 67 69 6e d the name begin
ad40: 73 20 77 69 74 68 20 61 6e 20 75 70 70 65 72 2d s with an upper-
ad50: 63 61 73 65 0a 20 20 2a 2a 20 6c 65 74 74 65 72 case. ** letter
ad60: 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 , then check to
ad70: 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 see if there is
ad80: 61 6e 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 an environment v
ad90: 61 72 69 61 62 6c 65 0a 20 20 2a 2a 20 77 69 74 ariable. ** wit
ada0: 68 20 74 68 65 20 67 69 76 65 6e 20 6e 61 6d 65 h the given name
adb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 66 6f 73 .. */. if( fos
adc0: 73 69 6c 5f 69 73 75 70 70 65 72 28 7a 4e 61 6d sil_isupper(zNam
add0: 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 63 6f 6e e[0]) ){. con
ade0: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 20 st char *zValue
adf0: 3d 20 66 6f 73 73 69 6c 5f 67 65 74 65 6e 76 28 = fossil_getenv(
ae00: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 zName);. if(
ae10: 7a 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20 20 zValue ){.
ae20: 63 67 69 5f 73 65 74 5f 70 61 72 61 6d 65 74 65 cgi_set_paramete
ae30: 72 5f 6e 6f 63 6f 70 79 28 7a 4e 61 6d 65 2c 20 r_nocopy(zName,
ae40: 7a 56 61 6c 75 65 2c 20 30 29 3b 0a 20 20 20 20 zValue, 0);.
ae50: 20 20 43 47 49 44 45 42 55 47 28 28 22 65 6e 76 CGIDEBUG(("env
ae60: 2d 6d 61 74 63 68 20 5b 25 73 5d 20 3d 20 5b 25 -match [%s] = [%
ae70: 73 5d 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 7a 56 s]\n", zName, zV
ae80: 61 6c 75 65 29 29 3b 0a 20 20 20 20 20 20 72 65 alue));. re
ae90: 74 75 72 6e 20 7a 56 61 6c 75 65 3b 0a 20 20 20 turn zValue;.
aea0: 20 7d 0a 20 20 7d 0a 20 20 43 47 49 44 45 42 55 }. }. CGIDEBU
aeb0: 47 28 28 22 6e 6f 2d 6d 61 74 63 68 20 5b 25 73 G(("no-match [%s
aec0: 5d 5c 6e 22 2c 20 7a 4e 61 6d 65 29 29 3b 0a 20 ]\n", zName));.
aed0: 20 72 65 74 75 72 6e 20 7a 44 65 66 61 75 6c 74 return zDefault
aee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
aef0: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 n the value of t
af00: 68 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 he first defined
af10: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 query parameter
af20: 20 6f 72 20 63 6f 6f 6b 69 65 20 77 68 6f 73 65 or cookie whose
af30: 0a 2a 2a 20 6e 61 6d 65 20 61 70 70 65 61 72 73 .** name appears
af40: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 in the list of
af50: 61 72 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20 69 arguments. Or i
af60: 66 20 6e 6f 20 70 61 72 61 6d 65 74 65 72 20 69 f no parameter i
af70: 73 20 66 6f 75 6e 64 2c 0a 2a 2a 20 72 65 74 75 s found,.** retu
af80: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e 73 rn NULL..*/.cons
af90: 74 20 63 68 61 72 20 2a 63 67 69 5f 63 6f 61 6c t char *cgi_coal
afa0: 65 73 63 65 28 63 6f 6e 73 74 20 63 68 61 72 20 esce(const char
afb0: 2a 7a 4e 61 6d 65 2c 20 2e 2e 2e 29 7b 0a 20 20 *zName, ...){.
afc0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 6f va_list ap;. co
afd0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 nst char *z;. c
afe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 3b 0a 20 onst char *zX;.
aff0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 if( zName==0 )
b000: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 return 0;. z =
b010: 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4e cgi_parameter(zN
b020: 61 6d 65 2c 20 30 29 3b 0a 20 20 76 61 5f 73 74 ame, 0);. va_st
b030: 61 72 74 28 61 70 2c 20 7a 4e 61 6d 65 29 3b 0a art(ap, zName);.
b040: 20 20 77 68 69 6c 65 28 20 7a 3d 3d 30 20 26 26 while( z==0 &&
b050: 20 28 7a 58 20 3d 20 76 61 5f 61 72 67 28 61 70 (zX = va_arg(ap
b060: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d ,const char*))!=
b070: 30 20 29 7b 0a 20 20 20 20 7a 20 3d 20 63 67 69 0 ){. z = cgi
b080: 5f 70 61 72 61 6d 65 74 65 72 28 7a 58 2c 20 30 _parameter(zX, 0
b090: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 );. }. va_end(
b0a0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b ap);. return z;
b0b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
b0c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 the value of a
b0d0: 43 47 49 20 70 61 72 61 6d 65 74 65 72 20 77 69 CGI parameter wi
b0e0: 74 68 20 6c 65 61 64 69 6e 67 20 61 6e 64 20 74 th leading and t
b0f0: 72 61 69 6c 69 6e 67 0a 2a 2a 20 73 70 61 63 65 railing.** space
b100: 73 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 77 69 s removed and wi
b110: 74 68 20 69 6e 74 65 72 6e 61 6c 20 5c 72 5c 6e th internal \r\n
b120: 20 63 68 61 6e 67 65 64 20 74 6f 20 6a 75 73 74 changed to just
b130: 20 5c 6e 0a 2a 2f 0a 63 68 61 72 20 2a 63 67 69 \n.*/.char *cgi
b140: 5f 70 61 72 61 6d 65 74 65 72 5f 74 72 69 6d 6d _parameter_trimm
b150: 65 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a ed(const char *z
b160: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 Name, const char
b170: 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20 63 *zDefault){. c
b180: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 3b 0a onst char *zIn;.
b190: 20 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 63 3b char *zOut, c;
b1a0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 7a . int i, j;. z
b1b0: 49 6e 20 3d 20 63 67 69 5f 70 61 72 61 6d 65 74 In = cgi_paramet
b1c0: 65 72 28 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 er(zName, 0);.
b1d0: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 7a 49 6e if( zIn==0 ) zIn
b1e0: 20 3d 20 7a 44 65 66 61 75 6c 74 3b 0a 20 20 69 = zDefault;. i
b1f0: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 f( zIn==0 ) retu
b200: 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 66 rn 0;. while( f
b210: 6f 73 73 69 6c 5f 69 73 73 70 61 63 65 28 7a 49 ossil_isspace(zI
b220: 6e 5b 30 5d 29 20 29 20 7a 49 6e 2b 2b 3b 0a 20 n[0]) ) zIn++;.
b230: 20 7a 4f 75 74 20 3d 20 66 6f 73 73 69 6c 5f 73 zOut = fossil_s
b240: 74 72 64 75 70 28 7a 49 6e 29 3b 0a 20 20 66 6f trdup(zIn);. fo
b250: 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 4f r(i=j=0; (c = zO
b260: 75 74 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b ut[i])!=0; i++){
b270: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 72 27 . if( c=='\r'
b280: 20 26 26 20 7a 4f 75 74 5b 69 2b 31 5d 3d 3d 27 && zOut[i+1]=='
b290: 5c 6e 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a \n' ) continue;.
b2a0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 zOut[j++] =
b2b0: 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6a 5d c;. }. zOut[j]
b2c0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6a = 0;. while( j
b2d0: 3e 30 20 26 26 20 66 6f 73 73 69 6c 5f 69 73 73 >0 && fossil_iss
b2e0: 70 61 63 65 28 7a 4f 75 74 5b 6a 2d 31 5d 29 20 pace(zOut[j-1])
b2f0: 29 20 7a 4f 75 74 5b 2d 2d 6a 5d 20 3d 20 30 3b ) zOut[--j] = 0;
b300: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a . return zOut;.
b310: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
b320: 74 72 75 65 20 69 66 20 74 68 65 20 43 47 49 20 true if the CGI
b330: 70 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 parameter zName
b340: 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f exists and is no
b350: 74 20 65 71 75 61 6c 20 74 6f 20 30 2c 0a 2a 2a t equal to 0,.**
b360: 20 6f 72 20 22 6e 6f 22 20 6f 72 20 22 6f 66 66 or "no" or "off
b370: 22 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f 70 61 "..*/.int cgi_pa
b380: 72 61 6d 65 74 65 72 5f 62 6f 6f 6c 65 61 6e 28 rameter_boolean(
b390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
b3a0: 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 e){. const char
b3b0: 20 2a 7a 49 6e 20 3d 20 63 67 69 5f 70 61 72 61 *zIn = cgi_para
b3c0: 6d 65 74 65 72 28 7a 4e 61 6d 65 2c 20 30 29 3b meter(zName, 0);
b3d0: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 . if( zIn==0 )
b3e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 return 0;. retu
b3f0: 72 6e 20 7a 49 6e 5b 30 5d 3d 3d 30 20 7c 7c 20 rn zIn[0]==0 ||
b400: 69 73 5f 74 72 75 74 68 28 7a 49 6e 29 3b 0a 7d is_truth(zIn);.}
b410: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 65 ../*.** Return e
b420: 69 74 68 65 72 20 61 6e 20 65 6d 70 74 79 20 73 ither an empty s
b430: 74 72 69 6e 67 20 22 22 20 6f 72 20 74 68 65 20 tring "" or the
b440: 73 74 72 69 6e 67 20 22 63 68 65 63 6b 65 64 22 string "checked"
b450: 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e depending.** on
b460: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 whether or not
b470: 70 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 parameter zName
b480: 68 61 73 20 76 61 6c 75 65 20 69 56 61 6c 75 65 has value iValue
b490: 2e 20 20 49 66 20 70 61 72 61 6d 65 74 65 72 0a . If parameter.
b4a0: 2a 2a 20 7a 4e 61 6d 65 20 64 6f 65 73 20 6e 6f ** zName does no
b4b0: 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 69 73 t exist, that is
b4c0: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 74 assumed to be t
b4d0: 68 65 20 73 61 6d 65 20 61 73 20 76 61 6c 75 65 he same as value
b4e0: 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 0..**.** This r
b4f0: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 outine implement
b500: 73 20 74 68 65 20 50 43 4b 28 78 29 20 61 6e 64 s the PCK(x) and
b510: 20 50 49 46 28 78 2c 79 29 20 6d 61 63 72 6f 73 PIF(x,y) macros
b520: 2e 20 20 54 68 65 20 50 49 46 28 78 2c 79 29 0a . The PIF(x,y).
b530: 2a 2a 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 ** macro generat
b540: 65 64 73 20 22 20 63 68 65 63 6b 65 64 22 20 69 eds " checked" i
b550: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 f the value of p
b560: 61 72 61 6d 65 74 65 72 20 78 20 65 71 75 61 6c arameter x equal
b570: 73 20 69 6e 74 65 67 65 72 20 79 2e 0a 2a 2a 20 s integer y..**
b580: 50 43 4b 28 78 29 20 69 73 20 74 68 65 20 73 61 PCK(x) is the sa
b590: 6d 65 20 61 73 20 50 49 46 28 78 2c 31 29 2e 20 me as PIF(x,1).
b5a0: 20 54 68 65 73 65 20 6d 61 63 72 6f 73 20 61 72 These macros ar
b5b0: 65 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 e used to genera
b5c0: 74 65 0a 2a 2a 20 74 68 65 20 22 63 68 65 63 6b te.** the "check
b5d0: 65 64 22 20 61 74 74 72 69 62 75 74 65 20 6f 6e ed" attribute on
b5e0: 20 63 68 65 63 6b 62 6f 78 20 61 6e 64 20 72 61 checkbox and ra
b5f0: 64 69 6f 20 63 6f 6e 74 72 6f 6c 73 20 6f 66 20 dio controls of
b600: 66 6f 72 6d 73 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 forms..*/.const
b610: 63 68 61 72 20 2a 63 67 69 5f 70 61 72 61 6d 65 char *cgi_parame
b620: 74 65 72 5f 63 68 65 63 6b 65 64 28 63 6f 6e 73 ter_checked(cons
b630: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 t char *zName, i
b640: 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 63 6f nt iValue){. co
b650: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 nst char *zIn =
b660: 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4e cgi_parameter(zN
b670: 61 6d 65 2c 30 29 3b 0a 20 20 69 6e 74 20 78 3b ame,0);. int x;
b680: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 7b . if( zIn==0 ){
b690: 0a 20 20 20 20 78 20 3d 20 30 3b 0a 20 20 7d 65 . x = 0;. }e
b6a0: 6c 73 65 20 69 66 28 20 21 66 6f 73 73 69 6c 5f lse if( !fossil_
b6b0: 69 73 64 69 67 69 74 28 7a 49 6e 5b 30 5d 29 20 isdigit(zIn[0])
b6c0: 29 7b 0a 20 20 20 20 78 20 3d 20 69 73 5f 74 72 ){. x = is_tr
b6d0: 75 74 68 28 7a 49 6e 29 3b 0a 20 20 7d 65 6c 73 uth(zIn);. }els
b6e0: 65 7b 0a 20 20 20 20 78 20 3d 20 61 74 6f 69 28 e{. x = atoi(
b6f0: 7a 49 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 zIn);. }. retu
b700: 72 6e 20 78 3d 3d 69 56 61 6c 75 65 20 3f 20 22 rn x==iValue ? "
b710: 63 68 65 63 6b 65 64 22 20 3a 20 22 22 3b 0a 7d checked" : "";.}
b720: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
b730: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 he name of the i
b740: 2d 74 68 20 43 47 49 20 70 61 72 61 6d 65 74 65 -th CGI paramete
b750: 72 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 r. Return NULL
b760: 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 if there.** are
b770: 66 65 77 65 72 20 74 68 61 6e 20 69 20 72 65 67 fewer than i reg
b780: 69 73 74 65 72 65 64 20 43 47 49 20 70 61 72 61 istered CGI para
b790: 6d 65 74 65 72 73 2e 0a 2a 2f 0a 63 6f 6e 73 74 meters..*/.const
b7a0: 20 63 68 61 72 20 2a 63 67 69 5f 70 61 72 61 6d char *cgi_param
b7b0: 65 74 65 72 5f 6e 61 6d 65 28 69 6e 74 20 69 29 eter_name(int i)
b7c0: 7b 0a 20 20 69 66 28 20 69 3e 3d 30 20 26 26 20 {. if( i>=0 &&
b7d0: 69 3c 6e 55 73 65 64 51 50 20 29 7b 0a 20 20 20 i<nUsedQP ){.
b7e0: 20 72 65 74 75 72 6e 20 61 50 61 72 61 6d 51 50 return aParamQP
b7f0: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c [i].zName;. }el
b800: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 se{. return 0
b810: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 ;. }.}../*.** P
b820: 72 69 6e 74 20 43 47 49 20 64 65 62 75 67 67 69 rint CGI debuggi
b830: 6e 67 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a ng messages..*/.
b840: 76 6f 69 64 20 63 67 69 5f 64 65 62 75 67 28 63 void cgi_debug(c
b850: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
b860: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c at, ...){. va_l
b870: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 67 2e ist ap;. if( g.
b880: 66 44 65 62 75 67 20 29 7b 0a 20 20 20 20 76 61 fDebug ){. va
b890: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d _start(ap, zForm
b8a0: 61 74 29 3b 0a 20 20 20 20 76 66 70 72 69 6e 74 at);. vfprint
b8b0: 66 28 67 2e 66 44 65 62 75 67 2c 20 7a 46 6f 72 f(g.fDebug, zFor
b8c0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 mat, ap);. va
b8d0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 20 20 66 66 _end(ap);. ff
b8e0: 6c 75 73 68 28 67 2e 66 44 65 62 75 67 29 3b 0a lush(g.fDebug);.
b8f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 }.}../*.** Ret
b900: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20 urn true if any
b910: 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72 of the query par
b920: 61 6d 65 74 65 72 73 20 69 6e 20 74 68 65 20 61 ameters in the a
b930: 72 67 75 6d 65 6e 74 0a 2a 2a 20 6c 69 73 74 20 rgument.** list
b940: 61 72 65 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a are defined..*/.
b950: 69 6e 74 20 63 67 69 5f 61 6e 79 28 63 6f 6e 73 int cgi_any(cons
b960: 74 20 63 68 61 72 20 2a 7a 2c 20 2e 2e 2e 29 7b t char *z, ...){
b970: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
b980: 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 69 66 28 char *z2;. if(
b990: 20 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 7a cgi_parameter(z
b9a0: 2c 30 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 ,0)!=0 ) return
b9b0: 31 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 1;. va_start(ap
b9c0: 2c 20 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 , z);. while( (
b9d0: 7a 32 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 z2 = va_arg(ap,
b9e0: 63 68 61 72 2a 29 29 21 3d 30 20 29 7b 0a 20 20 char*))!=0 ){.
b9f0: 20 20 69 66 28 20 63 67 69 5f 70 61 72 61 6d 65 if( cgi_parame
ba00: 74 65 72 28 7a 32 2c 30 29 21 3d 30 20 29 20 72 ter(z2,0)!=0 ) r
ba10: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 76 eturn 1;. }. v
ba20: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 a_end(ap);. ret
ba30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn 0;.}../*.**
ba40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 Return true if a
ba50: 6c 6c 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 ll of the query
ba60: 70 61 72 61 6d 65 74 65 72 73 20 69 6e 20 74 68 parameters in th
ba70: 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 0a e argument list.
ba80: 2a 2a 20 61 72 65 20 64 65 66 69 6e 65 64 2e 0a ** are defined..
ba90: 2a 2f 0a 69 6e 74 20 63 67 69 5f 61 6c 6c 28 63 */.int cgi_all(c
baa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 2e 2e onst char *z, ..
bab0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 .){. va_list ap
bac0: 3b 0a 20 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 ;. char *z2;.
bad0: 69 66 28 20 63 67 69 5f 70 61 72 61 6d 65 74 65 if( cgi_paramete
bae0: 72 28 7a 2c 30 29 3d 3d 30 20 29 20 72 65 74 75 r(z,0)==0 ) retu
baf0: 72 6e 20 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 rn 0;. va_start
bb00: 28 61 70 2c 20 7a 29 3b 0a 20 20 77 68 69 6c 65 (ap, z);. while
bb10: 28 20 28 7a 32 20 3d 20 76 61 5f 61 72 67 28 61 ( (z2 = va_arg(a
bb20: 70 2c 20 63 68 61 72 2a 29 29 3d 3d 30 20 29 7b p, char*))==0 ){
bb30: 0a 20 20 20 20 69 66 28 20 63 67 69 5f 70 61 72 . if( cgi_par
bb40: 61 6d 65 74 65 72 28 7a 32 2c 30 29 3d 3d 30 20 ameter(z2,0)==0
bb50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a ) return 0;. }.
bb60: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 va_end(ap);.
bb70: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a return 1;.}../*.
bb80: 2a 2a 20 4c 6f 61 64 20 61 6c 6c 20 72 65 6c 65 ** Load all rele
bb90: 76 61 6e 74 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 vant environment
bba0: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 74 6f 20 variables into
bbb0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 62 75 the parameter bu
bbc0: 66 66 65 72 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 ffer..** Invoke
bbd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 69 this routine pri
bbe0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 63 67 or to calling cg
bbf0: 69 5f 70 72 69 6e 74 5f 61 6c 6c 28 29 20 69 6e i_print_all() in
bc00: 20 6f 72 64 65 72 20 74 6f 20 73 65 65 0a 2a 2a order to see.**
bc10: 20 74 68 65 20 66 75 6c 6c 20 43 47 49 20 65 6e the full CGI en
bc20: 76 69 72 6f 6e 6d 65 6e 74 2e 20 20 54 68 69 73 vironment. This
bc30: 20 72 6f 75 74 69 6e 65 20 69 6e 74 65 6e 64 65 routine intende
bc40: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 d for debugging
bc50: 70 75 72 70 6f 73 65 73 0a 2a 2a 20 6f 6e 6c 79 purposes.** only
bc60: 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 6c 6f ..*/.void cgi_lo
bc70: 61 64 5f 65 6e 76 69 72 6f 6e 6d 65 6e 74 28 76 ad_environment(v
bc80: 6f 69 64 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 oid){. /* The f
bc90: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6c 69 ollowing is a li
bca0: 73 74 20 6f 66 20 65 6e 76 69 72 6f 6e 6d 65 6e st of environmen
bcb0: 74 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 t variables that
bcc0: 20 46 6f 73 73 69 6c 20 63 6f 6e 73 69 64 65 72 Fossil consider
bcd0: 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 22 72 65 s. ** to be "re
bce0: 6c 65 76 61 6e 74 22 2e 20 2a 2f 0a 20 20 73 74 levant". */. st
bcf0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
bd00: 2a 63 6f 6e 73 74 20 61 7a 43 67 69 56 61 72 73 *const azCgiVars
bd10: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 43 4f 4d 53 [] = {. "COMS
bd20: 50 45 43 22 2c 20 22 44 4f 43 55 4d 45 4e 54 5f PEC", "DOCUMENT_
bd30: 52 4f 4f 54 22 2c 20 22 47 41 54 45 57 41 59 5f ROOT", "GATEWAY_
bd40: 49 4e 54 45 52 46 41 43 45 22 2c 20 22 53 43 47 INTERFACE", "SCG
bd50: 49 22 2c 0a 20 20 20 20 22 48 54 54 50 5f 41 43 I",. "HTTP_AC
bd60: 43 45 50 54 22 2c 20 22 48 54 54 50 5f 41 43 43 CEPT", "HTTP_ACC
bd70: 45 50 54 5f 43 48 41 52 53 45 54 22 2c 20 22 48 EPT_CHARSET", "H
bd80: 54 54 50 5f 41 43 43 45 50 54 5f 45 4e 43 4f 44 TTP_ACCEPT_ENCOD
bd90: 49 4e 47 22 2c 0a 20 20 20 20 22 48 54 54 50 5f ING",. "HTTP_
bda0: 41 43 43 45 50 54 5f 4c 41 4e 47 55 41 47 45 22 ACCEPT_LANGUAGE"
bdb0: 2c 20 22 48 54 54 50 5f 41 55 54 48 45 4e 49 43 , "HTTP_AUTHENIC
bdc0: 41 54 49 4f 4e 22 2c 0a 20 20 20 20 22 48 54 54 ATION",. "HTT
bdd0: 50 5f 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 P_CONNECTION", "
bde0: 48 54 54 50 5f 48 4f 53 54 22 2c 0a 20 20 20 20 HTTP_HOST",.
bdf0: 22 48 54 54 50 5f 49 46 5f 4e 4f 4e 45 5f 4d 41 "HTTP_IF_NONE_MA
be00: 54 43 48 22 2c 20 22 48 54 54 50 5f 49 46 5f 4d TCH", "HTTP_IF_M
be10: 4f 44 49 46 49 45 44 5f 53 49 4e 43 45 22 2c 0a ODIFIED_SINCE",.
be20: 20 20 20 20 22 48 54 54 50 5f 55 53 45 52 5f 41 "HTTP_USER_A
be30: 47 45 4e 54 22 2c 20 22 48 54 54 50 5f 52 45 46 GENT", "HTTP_REF
be40: 45 52 45 52 22 2c 20 22 50 41 54 48 5f 49 4e 46 ERER", "PATH_INF
be50: 4f 22 2c 20 22 50 41 54 48 5f 54 52 41 4e 53 4c O", "PATH_TRANSL
be60: 41 54 45 44 22 2c 0a 20 20 20 20 22 51 55 45 52 ATED",. "QUER
be70: 59 5f 53 54 52 49 4e 47 22 2c 20 22 52 45 4d 4f Y_STRING", "REMO
be80: 54 45 5f 41 44 44 52 22 2c 20 22 52 45 4d 4f 54 TE_ADDR", "REMOT
be90: 45 5f 50 4f 52 54 22 2c 0a 20 20 20 20 22 52 45 E_PORT",. "RE
bea0: 4d 4f 54 45 5f 55 53 45 52 22 2c 20 22 52 45 51 MOTE_USER", "REQ
beb0: 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c 20 22 52 UEST_METHOD", "R
bec0: 45 51 55 45 53 54 5f 53 43 48 45 4d 45 22 2c 0a EQUEST_SCHEME",.
bed0: 20 20 20 20 22 52 45 51 55 45 53 54 5f 55 52 49 "REQUEST_URI
bee0: 22 2c 20 22 53 43 52 49 50 54 5f 46 49 4c 45 4e ", "SCRIPT_FILEN
bef0: 41 4d 45 22 2c 20 22 53 43 52 49 50 54 5f 4e 41 AME", "SCRIPT_NA
bf00: 4d 45 22 2c 20 22 53 45 52 56 45 52 5f 4e 41 4d ME", "SERVER_NAM
bf10: 45 22 2c 0a 20 20 20 20 22 53 45 52 56 45 52 5f E",. "SERVER_
bf20: 50 52 4f 54 4f 43 4f 4c 22 2c 20 22 48 4f 4d 45 PROTOCOL", "HOME
bf30: 22 2c 20 22 46 4f 53 53 49 4c 5f 48 4f 4d 45 22 ", "FOSSIL_HOME"
bf40: 2c 20 22 55 53 45 52 4e 41 4d 45 22 2c 20 22 55 , "USERNAME", "U
bf50: 53 45 52 22 2c 0a 20 20 20 20 22 46 4f 53 53 49 SER",. "FOSSI
bf60: 4c 5f 55 53 45 52 22 2c 20 22 53 51 4c 49 54 45 L_USER", "SQLITE
bf70: 5f 54 4d 50 44 49 52 22 2c 20 22 54 4d 50 44 49 _TMPDIR", "TMPDI
bf80: 52 22 2c 0a 20 20 20 20 22 54 45 4d 50 22 2c 20 R",. "TEMP",
bf90: 22 54 4d 50 22 2c 20 22 46 4f 53 53 49 4c 5f 56 "TMP", "FOSSIL_V
bfa0: 46 53 22 2c 0a 20 20 20 20 22 46 4f 53 53 49 4c FS",. "FOSSIL
bfb0: 5f 46 4f 52 43 45 5f 54 49 43 4b 45 54 5f 4d 4f _FORCE_TICKET_MO
bfc0: 44 45 52 41 54 49 4f 4e 22 2c 20 22 46 4f 53 53 DERATION", "FOSS
bfd0: 49 4c 5f 46 4f 52 43 45 5f 57 49 4b 49 5f 4d 4f IL_FORCE_WIKI_MO
bfe0: 44 45 52 41 54 49 4f 4e 22 2c 0a 20 20 20 20 22 DERATION",. "
bff0: 46 4f 53 53 49 4c 5f 54 43 4c 5f 50 41 54 48 22 FOSSIL_TCL_PATH"
c000: 2c 20 22 54 48 31 5f 44 45 4c 45 54 45 5f 49 4e , "TH1_DELETE_IN
c010: 54 45 52 50 22 2c 20 22 54 48 31 5f 45 4e 41 42 TERP", "TH1_ENAB
c020: 4c 45 5f 44 4f 43 53 22 2c 0a 20 20 20 20 22 54 LE_DOCS",. "T
c030: 48 31 5f 45 4e 41 42 4c 45 5f 48 4f 4f 4b 53 22 H1_ENABLE_HOOKS"
c040: 2c 20 22 54 48 31 5f 45 4e 41 42 4c 45 5f 54 43 , "TH1_ENABLE_TC
c050: 4c 22 2c 20 22 52 45 4d 4f 54 45 5f 48 4f 53 54 L", "REMOTE_HOST
c060: 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b ",. };. int i;
c070: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f . for(i=0; i<co
c080: 75 6e 74 28 61 7a 43 67 69 56 61 72 73 29 3b 20 unt(azCgiVars);
c090: 69 2b 2b 29 20 28 76 6f 69 64 29 50 28 61 7a 43 i++) (void)P(azC
c0a0: 67 69 56 61 72 73 5b 69 5d 29 3b 0a 7d 0a 0a 2f giVars[i]);.}../
c0b0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6c 6c 20 71 *.** Print all q
c0c0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 uery parameters
c0d0: 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 on standard outp
c0e0: 75 74 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 ut..** This is u
c0f0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 sed for testing
c100: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a and debugging..*
c110: 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 65 20 76 61 *.** Omit the va
c120: 6c 75 65 73 20 6f 66 20 74 68 65 20 63 6f 6f 6b lues of the cook
c130: 69 65 73 20 75 6e 6c 65 73 73 20 73 68 6f 77 41 ies unless showA
c140: 6c 6c 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a ll is true..**.*
c150: 2a 20 54 68 65 20 65 44 65 73 74 20 70 61 72 61 * The eDest para
c160: 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 meter determines
c170: 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 where the outpu
c180: 74 20 69 73 20 73 68 6f 77 6e 3a 0a 2a 2a 0a 2a t is shown:.**.*
c190: 2a 20 20 20 20 20 65 44 65 73 74 3d 3d 30 3a 20 * eDest==0:
c1a0: 20 20 20 52 65 6e 64 65 72 69 6e 67 20 61 73 20 Rendering as
c1b0: 48 54 4d 4c 20 69 6e 74 6f 20 74 68 65 20 43 47 HTML into the CG
c1c0: 49 20 72 65 70 6c 79 0a 2a 2a 20 20 20 20 20 65 I reply.** e
c1d0: 44 65 73 74 3d 3d 31 3a 20 20 20 20 57 72 69 74 Dest==1: Writ
c1e0: 74 65 6e 20 74 6f 20 73 74 64 65 72 72 0a 2a 2a ten to stderr.**
c1f0: 20 20 20 20 20 65 44 65 73 74 3d 3d 32 3a 20 20 eDest==2:
c200: 20 20 57 72 69 74 74 65 6e 20 74 6f 20 63 67 69 Written to cgi
c210: 5f 64 65 62 75 67 0a 2a 2f 0a 76 6f 69 64 20 63 _debug.*/.void c
c220: 67 69 5f 70 72 69 6e 74 5f 61 6c 6c 28 69 6e 74 gi_print_all(int
c230: 20 73 68 6f 77 41 6c 6c 2c 20 75 6e 73 69 67 6e showAll, unsign
c240: 65 64 20 69 6e 74 20 65 44 65 73 74 29 7b 0a 20 ed int eDest){.
c250: 20 69 6e 74 20 69 3b 0a 20 20 63 67 69 5f 70 61 int i;. cgi_pa
c260: 72 61 6d 65 74 65 72 28 22 22 2c 22 22 29 3b 20 rameter("","");
c270: 20 2f 2a 20 46 6f 72 63 65 20 74 68 65 20 70 61 /* Force the pa
c280: 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 73 6f rameters into so
c290: 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 rted order */.
c2a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 55 73 65 64 for(i=0; i<nUsed
c2b0: 51 50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f QP; i++){. co
c2c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 nst char *zName
c2d0: 3d 20 61 50 61 72 61 6d 51 50 5b 69 5d 2e 7a 4e = aParamQP[i].zN
c2e0: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 21 73 68 ame;. if( !sh
c2f0: 6f 77 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 owAll ){. i
c300: 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 69 63 6d f( fossil_stricm
c310: 70 28 22 48 54 54 50 5f 43 4f 4f 4b 49 45 22 2c p("HTTP_COOKIE",
c320: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 63 6f 6e 74 zName)==0 ) cont
c330: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 inue;. if(
c340: 66 6f 73 73 69 6c 5f 73 74 72 6e 69 63 6d 70 28 fossil_strnicmp(
c350: 22 66 6f 73 73 69 6c 2d 22 2c 7a 4e 61 6d 65 2c "fossil-",zName,
c360: 37 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 7)==0 ) continue
c370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 ;. }. swit
c380: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 ch( eDest ){.
c390: 20 20 20 63 61 73 65 20 30 3a 20 7b 0a 20 20 20 case 0: {.
c3a0: 20 20 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 cgi_printf(
c3b0: 22 25 68 20 3d 20 25 68 20 20 3c 62 72 20 2f 3e "%h = %h <br />
c3c0: 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 61 50 61 72 \n", zName, aPar
c3d0: 61 6d 51 50 5b 69 5d 2e 7a 56 61 6c 75 65 29 3b amQP[i].zValue);
c3e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
c3f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 }. ca
c400: 73 65 20 31 3a 20 7b 20 20 0a 20 20 20 20 20 20 se 1: { .
c410: 20 20 66 6f 73 73 69 6c 5f 74 72 61 63 65 28 22 fossil_trace("
c420: 25 73 20 3d 20 25 73 5c 6e 22 2c 20 7a 4e 61 6d %s = %s\n", zNam
c430: 65 2c 20 61 50 61 72 61 6d 51 50 5b 69 5d 2e 7a e, aParamQP[i].z
c440: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 Value);.
c450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
c460: 20 20 20 20 20 63 61 73 65 20 32 3a 20 7b 0a 20 case 2: {.
c470: 20 20 20 20 20 20 20 63 67 69 5f 64 65 62 75 67 cgi_debug
c480: 28 22 25 73 20 3d 20 25 73 5c 6e 22 2c 20 7a 4e ("%s = %s\n", zN
c490: 61 6d 65 2c 20 61 50 61 72 61 6d 51 50 5b 69 5d ame, aParamQP[i]
c4a0: 2e 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 .zValue);.
c4b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
c4c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a . }. }.}../*
c4d0: 0a 2a 2a 20 50 75 74 20 69 6e 66 6f 72 6d 61 74 .** Put informat
c4e0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4e 2d ion about the N-
c4f0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 6e 74 th parameter int
c500: 6f 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 o arguments..**
c510: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 Return non-zero
c520: 6f 6e 20 73 75 63 63 65 73 73 2c 20 61 6e 64 20 on success, and
c530: 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 return 0 if ther
c540: 65 20 69 73 20 6e 6f 20 4e 2d 74 68 20 70 61 72 e is no N-th par
c550: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 63 ameter..*/.int c
c560: 67 69 5f 70 61 72 61 6d 5f 69 6e 66 6f 28 0a 20 gi_param_info(.
c570: 20 69 6e 74 20 4e 2c 0a 20 20 63 6f 6e 73 74 20 int N,. const
c580: 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 0a 20 char **pzName,.
c590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a const char **pz
c5a0: 56 61 6c 75 65 2c 0a 20 20 69 6e 74 20 2a 70 62 Value,. int *pb
c5b0: 49 73 51 50 0a 29 7b 0a 20 20 69 66 28 20 4e 3e IsQP.){. if( N>
c5c0: 3d 30 20 26 26 20 4e 3c 6e 55 73 65 64 51 50 20 =0 && N<nUsedQP
c5d0: 29 7b 0a 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d ){. *pzName =
c5e0: 20 61 50 61 72 61 6d 51 50 5b 4e 5d 2e 7a 4e 61 aParamQP[N].zNa
c5f0: 6d 65 3b 0a 20 20 20 20 2a 70 7a 56 61 6c 75 65 me;. *pzValue
c600: 20 3d 20 61 50 61 72 61 6d 51 50 5b 4e 5d 2e 7a = aParamQP[N].z
c610: 56 61 6c 75 65 3b 0a 20 20 20 20 2a 70 62 49 73 Value;. *pbIs
c620: 51 50 20 3d 20 61 50 61 72 61 6d 51 50 5b 4e 5d QP = aParamQP[N]
c630: 2e 69 73 51 50 3b 0a 20 20 20 20 72 65 74 75 72 .isQP;. retur
c640: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 n 1;. }else{.
c650: 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 *pzName = 0;.
c660: 20 20 20 2a 70 7a 56 61 6c 75 65 20 3d 20 30 3b *pzValue = 0;
c670: 0a 20 20 20 20 2a 70 62 49 73 51 50 20 3d 20 30 . *pbIsQP = 0
c680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
c690: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 }.}../*.** Exp
c6a0: 6f 72 74 20 61 6c 6c 20 75 6e 74 61 67 67 65 64 ort all untagged
c6b0: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 query parameter
c6c0: 73 20 28 62 75 74 20 6e 6f 74 20 63 6f 6f 6b 69 s (but not cooki
c6d0: 65 73 20 6f 72 20 65 6e 76 69 72 6f 6e 6d 65 6e es or environmen
c6e0: 74 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 29 20 t.** variables)
c6f0: 61 73 20 68 69 64 64 65 6e 20 76 61 6c 75 65 73 as hidden values
c700: 20 6f 66 20 61 20 66 6f 72 6d 2e 0a 2a 2f 0a 76 of a form..*/.v
c710: 6f 69 64 20 63 67 69 5f 71 75 65 72 79 5f 70 61 oid cgi_query_pa
c720: 72 61 6d 65 74 65 72 73 5f 74 6f 5f 68 69 64 64 rameters_to_hidd
c730: 65 6e 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 en(void){. int
c740: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 i;. const char
c750: 2a 7a 4e 2c 20 2a 7a 56 3b 0a 20 20 66 6f 72 28 *zN, *zV;. for(
c760: 69 3d 30 3b 20 69 3c 6e 55 73 65 64 51 50 3b 20 i=0; i<nUsedQP;
c770: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 50 i++){. if( aP
c780: 61 72 61 6d 51 50 5b 69 5d 2e 69 73 51 50 3d 3d aramQP[i].isQP==
c790: 30 20 7c 7c 20 61 50 61 72 61 6d 51 50 5b 69 5d 0 || aParamQP[i]
c7a0: 2e 63 54 61 67 20 29 20 63 6f 6e 74 69 6e 75 65 .cTag ) continue
c7b0: 3b 0a 20 20 20 20 7a 4e 20 3d 20 61 50 61 72 61 ;. zN = aPara
c7c0: 6d 51 50 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 mQP[i].zName;.
c7d0: 20 20 7a 56 20 3d 20 61 50 61 72 61 6d 51 50 5b zV = aParamQP[
c7e0: 69 5d 2e 7a 56 61 6c 75 65 3b 0a 20 20 20 20 40 i].zValue;. @
c7f0: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 68 69 <input type="hi
c800: 64 64 65 6e 22 20 6e 61 6d 65 3d 22 25 68 28 7a dden" name="%h(z
c810: 4e 29 22 20 76 61 6c 75 65 3d 22 25 68 28 7a 56 N)" value="%h(zV
c820: 29 22 3e 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a )">. }.}../*.**
c830: 20 45 78 70 6f 72 74 20 61 6c 6c 20 75 6e 74 61 Export all unta
c840: 67 67 65 64 20 71 75 65 72 79 20 70 61 72 61 6d gged query param
c850: 65 74 65 72 73 20 28 62 75 74 20 6e 6f 74 20 63 eters (but not c
c860: 6f 6f 6b 69 65 73 20 6f 72 20 65 6e 76 69 72 6f ookies or enviro
c870: 6e 6d 65 6e 74 0a 2a 2a 20 76 61 72 69 61 62 6c nment.** variabl
c880: 65 73 29 20 74 6f 20 74 68 65 20 48 51 75 65 72 es) to the HQuer
c890: 79 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 y object..*/.voi
c8a0: 64 20 63 67 69 5f 71 75 65 72 79 5f 70 61 72 61 d cgi_query_para
c8b0: 6d 65 74 65 72 73 5f 74 6f 5f 75 72 6c 28 48 51 meters_to_url(HQ
c8c0: 75 65 72 79 20 2a 70 29 7b 0a 20 20 69 6e 74 20 uery *p){. int
c8d0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c i;. for(i=0; i<
c8e0: 6e 55 73 65 64 51 50 3b 20 69 2b 2b 29 7b 0a 20 nUsedQP; i++){.
c8f0: 20 20 20 69 66 28 20 61 50 61 72 61 6d 51 50 5b if( aParamQP[
c900: 69 5d 2e 69 73 51 50 3d 3d 30 20 7c 7c 20 61 50 i].isQP==0 || aP
c910: 61 72 61 6d 51 50 5b 69 5d 2e 63 54 61 67 20 29 aramQP[i].cTag )
c920: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 75 continue;. u
c930: 72 6c 5f 61 64 64 5f 70 61 72 61 6d 65 74 65 72 rl_add_parameter
c940: 28 70 2c 20 61 50 61 72 61 6d 51 50 5b 69 5d 2e (p, aParamQP[i].
c950: 7a 4e 61 6d 65 2c 20 61 50 61 72 61 6d 51 50 5b zName, aParamQP[
c960: 69 5d 2e 7a 56 61 6c 75 65 29 3b 0a 20 20 7d 0a i].zValue);. }.
c970: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 67 20 71 75 65 }../*.** Tag que
c980: 72 79 20 70 61 72 61 6d 65 74 65 72 20 7a 4e 61 ry parameter zNa
c990: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 me so that it is
c9a0: 20 6e 6f 74 20 65 78 70 6f 72 74 65 64 20 62 79 not exported by
c9b0: 0a 2a 2a 20 63 67 69 5f 71 75 65 72 79 5f 70 61 .** cgi_query_pa
c9c0: 72 61 6d 65 74 65 72 73 5f 74 6f 5f 68 69 64 64 rameters_to_hidd
c9d0: 65 6e 28 29 2e 20 20 4f 72 20 69 66 20 7a 4e 61 en(). Or if zNa
c9e0: 6d 65 3d 3d 30 2c 20 74 68 65 6e 0a 2a 2a 20 75 me==0, then.** u
c9f0: 6e 74 61 67 20 61 6c 6c 20 71 75 65 72 79 20 70 ntag all query p
ca00: 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2f 0a 76 6f arameters..*/.vo
ca10: 69 64 20 63 67 69 5f 74 61 67 5f 71 75 65 72 79 id cgi_tag_query
ca20: 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 _parameter(const
ca30: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 char *zName){.
ca40: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 4e int i;. if( zN
ca50: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f ame==0 ){. fo
ca60: 72 28 69 3d 30 3b 20 69 3c 6e 55 73 65 64 51 50 r(i=0; i<nUsedQP
ca70: 3b 20 69 2b 2b 29 20 61 50 61 72 61 6d 51 50 5b ; i++) aParamQP[
ca80: 69 5d 2e 63 54 61 67 20 3d 20 30 3b 0a 20 20 7d i].cTag = 0;. }
ca90: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d else{. for(i=
caa0: 30 3b 20 69 3c 6e 55 73 65 64 51 50 3b 20 69 2b 0; i<nUsedQP; i+
cab0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 +){. if( st
cac0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 61 50 61 72 61 rcmp(zName,aPara
cad0: 6d 51 50 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 mQP[i].zName)==0
cae0: 20 29 20 61 50 61 72 61 6d 51 50 5b 69 5d 2e 63 ) aParamQP[i].c
caf0: 54 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 Tag = 1;. }.
cb00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 }.}../*.** This
cb10: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c routine works l
cb20: 69 6b 65 20 22 70 72 69 6e 74 66 22 20 65 78 63 ike "printf" exc
cb30: 65 70 74 20 74 68 61 74 20 69 74 20 68 61 73 20 ept that it has
cb40: 74 68 65 0a 2a 2a 20 65 78 74 72 61 20 66 6f 72 the.** extra for
cb50: 6d 61 74 74 69 6e 67 20 63 61 70 61 62 69 6c 69 matting capabili
cb60: 74 69 65 73 20 73 75 63 68 20 61 73 20 25 68 20 ties such as %h
cb70: 61 6e 64 20 25 74 2e 0a 2a 2f 0a 76 6f 69 64 20 and %t..*/.void
cb80: 63 67 69 5f 70 72 69 6e 74 66 28 63 6f 6e 73 74 cgi_printf(const
cb90: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
cba0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 ...){. va_list
cbb0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 ap;. va_start(a
cbc0: 70 2c 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76 78 p,zFormat);. vx
cbd0: 70 72 69 6e 74 66 28 70 43 6f 6e 74 65 6e 74 2c printf(pContent,
cbe0: 7a 46 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 zFormat,ap);. v
cbf0: 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a a_end(ap);.}../*
cc00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
cc10: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 22 76 70 72 works like "vpr
cc20: 69 6e 74 66 22 20 65 78 63 65 70 74 20 74 68 61 intf" except tha
cc30: 74 20 69 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 t it has the.**
cc40: 65 78 74 72 61 20 66 6f 72 6d 61 74 74 69 6e 67 extra formatting
cc50: 20 63 61 70 61 62 69 6c 69 74 69 65 73 20 73 75 capabilities su
cc60: 63 68 20 61 73 20 25 68 20 61 6e 64 20 25 74 2e ch as %h and %t.
cc70: 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f 76 70 72 .*/.void cgi_vpr
cc80: 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 72 20 intf(const char
cc90: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 *zFormat, va_lis
cca0: 74 20 61 70 29 7b 0a 20 20 76 78 70 72 69 6e 74 t ap){. vxprint
ccb0: 66 28 70 43 6f 6e 74 65 6e 74 2c 7a 46 6f 72 6d f(pContent,zForm
ccc0: 61 74 2c 61 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a at,ap);.}.../*.*
ccd0: 2a 20 53 65 6e 64 20 61 20 72 65 70 6c 79 20 69 * Send a reply i
cce0: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 ndicating that t
ccf0: 68 65 20 48 54 54 50 20 72 65 71 75 65 73 74 20 he HTTP request
cd00: 77 61 73 20 6d 61 6c 66 6f 72 6d 65 64 0a 2a 2f was malformed.*/
cd10: 0a 73 74 61 74 69 63 20 4e 4f 52 45 54 55 52 4e .static NORETURN
cd20: 20 76 6f 69 64 20 6d 61 6c 66 6f 72 6d 65 64 5f void malformed_
cd30: 72 65 71 75 65 73 74 28 63 6f 6e 73 74 20 63 68 request(const ch
cd40: 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 63 67 69 ar *zMsg){. cgi
cd50: 5f 73 65 74 5f 73 74 61 74 75 73 28 35 30 31 2c _set_status(501,
cd60: 20 22 4e 6f 74 20 49 6d 70 6c 65 6d 65 6e 74 65 "Not Implemente
cd70: 64 22 29 3b 0a 20 20 63 67 69 5f 70 72 69 6e 74 d");. cgi_print
cd80: 66 28 0a 20 20 20 20 22 3c 68 74 6d 6c 3e 3c 62 f(. "<html><b
cd90: 6f 64 79 3e 3c 70 3e 42 61 64 20 52 65 71 75 65 ody><p>Bad Reque
cda0: 73 74 3a 20 25 73 3c 2f 70 3e 3c 2f 62 6f 64 79 st: %s</p></body
cdb0: 3e 3c 2f 68 74 6d 6c 3e 5c 6e 22 2c 20 7a 4d 73 ></html>\n", zMs
cdc0: 67 0a 20 20 29 3b 0a 20 20 63 67 69 5f 72 65 70 g. );. cgi_rep
cdd0: 6c 79 28 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 65 ly();. fossil_e
cde0: 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a xit(0);.}../*.**
cdf0: 20 50 61 6e 69 63 20 61 6e 64 20 64 69 65 20 77 Panic and die w
ce00: 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 hile processing
ce10: 61 20 77 65 62 70 61 67 65 2e 0a 2a 2f 0a 4e 4f a webpage..*/.NO
ce20: 52 45 54 55 52 4e 20 76 6f 69 64 20 63 67 69 5f RETURN void cgi_
ce30: 70 61 6e 69 63 28 63 6f 6e 73 74 20 63 68 61 72 panic(const char
ce40: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
ce50: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
ce60: 20 63 67 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 cgi_reset_conte
ce70: 6e 74 28 29 3b 0a 23 69 66 64 65 66 20 46 4f 53 nt();.#ifdef FOS
ce80: 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a SIL_ENABLE_JSON.
ce90: 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 69 73 4a if( g.json.isJ
cea0: 73 6f 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 sonMode ){. c
ceb0: 68 61 72 20 2a 20 7a 4d 73 67 3b 0a 20 20 20 20 har * zMsg;.
cec0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f va_start(ap, zFo
ced0: 72 6d 61 74 29 3b 0a 20 20 20 20 7a 4d 73 67 20 rmat);. zMsg
cee0: 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d = vmprintf(zForm
cef0: 61 74 2c 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 at,ap);. va_e
cf00: 6e 64 28 61 70 29 3b 0a 20 20 20 20 6a 73 6f 6e nd(ap);. json
cf10: 5f 65 72 72 28 20 46 53 4c 5f 4a 53 4f 4e 5f 45 _err( FSL_JSON_E
cf20: 5f 50 41 4e 49 43 2c 20 7a 4d 73 67 2c 20 31 20 _PANIC, zMsg, 1
cf30: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4d 73 67 );. free(zMsg
cf40: 29 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 );. fossil_ex
cf50: 69 74 28 20 67 2e 69 73 48 54 54 50 20 3f 20 30 it( g.isHTTP ? 0
cf60: 20 3a 20 31 20 29 3b 0a 20 20 7d 65 6c 73 65 0a : 1 );. }else.
cf70: 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c #endif /* FOSSIL
cf80: 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 20 2a 2f 0a _ENABLE_JSON */.
cf90: 20 20 7b 0a 20 20 20 20 63 67 69 5f 73 65 74 5f {. cgi_set_
cfa0: 73 74 61 74 75 73 28 35 30 30 2c 20 22 49 6e 74 status(500, "Int
cfb0: 65 72 6e 61 6c 20 53 65 72 76 65 72 20 45 72 72 ernal Server Err
cfc0: 6f 72 22 29 3b 0a 20 20 20 20 63 67 69 5f 70 72 or");. cgi_pr
cfd0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 intf(.
cfe0: 20 20 20 20 20 22 3c 68 74 6d 6c 3e 3c 62 6f 64 "<html><bod
cff0: 79 3e 3c 68 31 3e 49 6e 74 65 72 6e 61 6c 20 53 y><h1>Internal S
d000: 65 72 76 65 72 20 45 72 72 6f 72 3c 2f 68 31 3e erver Error</h1>
d010: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 \n".
d020: 20 20 20 22 3c 70 6c 61 69 6e 74 65 78 74 3e 22 "<plaintext>"
d030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
d040: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 );. va_start(
d050: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 ap, zFormat);.
d060: 20 20 76 78 70 72 69 6e 74 66 28 70 43 6f 6e 74 vxprintf(pCont
d070: 65 6e 74 2c 7a 46 6f 72 6d 61 74 2c 61 70 29 3b ent,zFormat,ap);
d080: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b . va_end(ap);
d090: 0a 20 20 20 20 63 67 69 5f 72 65 70 6c 79 28 29 . cgi_reply()
d0a0: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 69 ;. fossil_exi
d0b0: 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 t(1);. }.}../*
d0c0: 7a 5b 5d 20 69 73 20 74 68 65 20 76 61 6c 75 65 z[] is the value
d0d0: 20 6f 66 20 61 6e 20 58 2d 46 4f 52 57 41 52 44 of an X-FORWARD
d0e0: 45 44 2d 46 4f 52 3a 20 6c 69 6e 65 20 69 6e 20 ED-FOR: line in
d0f0: 61 6e 20 48 54 54 50 20 68 65 61 64 65 72 2e 0a an HTTP header..
d100: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e ** Return a poin
d110: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 ter to a string
d120: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 72 containing the r
d130: 65 61 6c 20 49 50 20 61 64 64 72 65 73 73 2c 20 eal IP address,
d140: 6f 72 20 61 0a 2a 2a 20 4e 55 4c 4c 20 70 6f 69 or a.** NULL poi
d150: 6e 74 65 72 20 74 6f 20 73 74 69 63 6b 20 77 69 nter to stick wi
d160: 74 68 20 74 68 65 20 49 50 20 61 64 64 72 65 73 th the IP addres
d170: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6d s previously com
d180: 70 75 74 65 64 20 61 6e 64 0a 2a 2a 20 6c 6f 61 puted and.** loa
d190: 64 65 64 20 69 6e 74 6f 20 67 2e 7a 49 70 41 64 ded into g.zIpAd
d1a0: 64 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f dr..*/.static co
d1b0: 6e 73 74 20 63 68 61 72 20 2a 63 67 69 5f 61 63 nst char *cgi_ac
d1c0: 63 65 70 74 5f 66 6f 72 77 61 72 64 65 64 5f 66 cept_forwarded_f
d1d0: 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a or(const char *z
d1e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 ){. int i;. if
d1f0: 28 20 21 63 67 69 5f 69 73 5f 6c 6f 6f 70 62 61 ( !cgi_is_loopba
d200: 63 6b 28 67 2e 7a 49 70 41 64 64 72 29 20 29 7b ck(g.zIpAddr) ){
d210: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 63 63 . /* Only acc
d220: 65 70 74 20 58 2d 46 4f 52 57 41 52 44 45 44 2d ept X-FORWARDED-
d230: 46 4f 52 20 69 66 20 69 6e 70 75 74 20 63 6f 6d FOR if input com
d240: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6c 6f 63 ing from the loc
d250: 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 al machine */.
d260: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
d270: 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 29 2d i = strlen(z)-
d280: 31 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d 30 1;. while( i>=0
d290: 20 26 26 20 7a 5b 69 5d 21 3d 27 2c 27 20 26 26 && z[i]!=',' &&
d2a0: 20 21 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65 !fossil_isspace
d2b0: 28 7a 5b 69 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 (z[i]) ) i--;.
d2c0: 72 65 74 75 72 6e 20 26 7a 5b 2b 2b 69 5d 3b 0a return &z[++i];.
d2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 }../*.** Remove
d2e0: 74 68 65 20 66 69 72 73 74 20 73 70 61 63 65 2d the first space-
d2f0: 64 65 6c 69 6d 69 74 65 64 20 74 6f 6b 65 6e 20 delimited token
d300: 66 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 61 6e from a string an
d310: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f d return.** a po
d320: 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20 41 64 inter to it. Ad
d330: 64 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 d a NULL to the
d340: 73 74 72 69 6e 67 20 74 6f 20 74 65 72 6d 69 6e string to termin
d350: 61 74 65 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2a ate the token..*
d360: 2a 20 4d 61 6b 65 20 2a 7a 4c 65 66 74 4f 76 65 * Make *zLeftOve
d370: 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 r point to the s
d380: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 tart of the next
d390: 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 token..*/.stati
d3a0: 63 20 63 68 61 72 20 2a 65 78 74 72 61 63 74 5f c char *extract_
d3b0: 74 6f 6b 65 6e 28 63 68 61 72 20 2a 7a 49 6e 70 token(char *zInp
d3c0: 75 74 2c 20 63 68 61 72 20 2a 2a 7a 4c 65 66 74 ut, char **zLeft
d3d0: 4f 76 65 72 29 7b 0a 20 20 63 68 61 72 20 2a 7a Over){. char *z
d3e0: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 66 Result = 0;. if
d3f0: 28 20 7a 49 6e 70 75 74 3d 3d 30 20 29 7b 0a 20 ( zInput==0 ){.
d400: 20 20 20 69 66 28 20 7a 4c 65 66 74 4f 76 65 72 if( zLeftOver
d410: 20 29 20 2a 7a 4c 65 66 74 4f 76 65 72 20 3d 20 ) *zLeftOver =
d420: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0;. return 0;
d430: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 66 6f . }. while( fo
d440: 73 73 69 6c 5f 69 73 73 70 61 63 65 28 2a 7a 49 ssil_isspace(*zI
d450: 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b nput) ){ zInput+
d460: 2b 3b 20 7d 0a 20 20 7a 52 65 73 75 6c 74 20 3d +; }. zResult =
d470: 20 7a 49 6e 70 75 74 3b 0a 20 20 77 68 69 6c 65 zInput;. while
d480: 28 20 2a 7a 49 6e 70 75 74 20 26 26 20 21 66 6f ( *zInput && !fo
d490: 73 73 69 6c 5f 69 73 73 70 61 63 65 28 2a 7a 49 ssil_isspace(*zI
d4a0: 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 74 2b nput) ){ zInput+
d4b0: 2b 3b 20 7d 0a 20 20 69 66 28 20 2a 7a 49 6e 70 +; }. if( *zInp
d4c0: 75 74 20 29 7b 0a 20 20 20 20 2a 7a 49 6e 70 75 ut ){. *zInpu
d4d0: 74 20 3d 20 30 3b 0a 20 20 20 20 7a 49 6e 70 75 t = 0;. zInpu
d4e0: 74 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 t++;. while(
d4f0: 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65 28 2a fossil_isspace(*
d500: 7a 49 6e 70 75 74 29 20 29 7b 20 7a 49 6e 70 75 zInput) ){ zInpu
d510: 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 t++; }. }. if(
d520: 20 7a 4c 65 66 74 4f 76 65 72 20 29 7b 20 2a 7a zLeftOver ){ *z
d530: 4c 65 66 74 4f 76 65 72 20 3d 20 7a 49 6e 70 75 LeftOver = zInpu
d540: 74 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 t; }. return zR
d550: 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 esult;.}../*.**
d560: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 49 50 Determine the IP
d570: 20 61 64 64 72 65 73 73 20 6f 6e 20 74 68 65 20 address on the
d580: 6f 74 68 65 72 20 73 69 64 65 20 6f 66 20 61 20 other side of a
d590: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 connection..** R
d5a0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 eturn a pointer
d5b0: 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 20 4f 72 to a string. Or
d5c0: 20 72 65 74 75 72 6e 20 30 20 69 66 20 75 6e 61 return 0 if una
d5d0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 ble..**.** The s
d5e0: 74 72 69 6e 67 20 69 73 20 68 65 6c 64 20 69 6e tring is held in
d5f0: 20 61 20 73 74 61 74 69 63 20 62 75 66 66 65 72 a static buffer
d600: 20 74 68 61 74 20 69 73 20 6f 76 65 72 77 72 69 that is overwri
d610: 74 74 65 6e 20 6f 6e 0a 2a 2a 20 65 61 63 68 20 tten on.** each
d620: 63 61 6c 6c 2e 0a 2a 2f 0a 63 68 61 72 20 2a 63 call..*/.char *c
d630: 67 69 5f 72 65 6d 6f 74 65 5f 69 70 28 69 6e 74 gi_remote_ip(int
d640: 20 66 64 29 7b 0a 23 69 66 20 30 0a 20 20 73 74 fd){.#if 0. st
d650: 61 74 69 63 20 63 68 61 72 20 7a 49 70 5b 31 30 atic char zIp[10
d660: 30 5d 3b 0a 20 20 73 74 72 75 63 74 20 73 6f 63 0];. struct soc
d670: 6b 61 64 64 72 5f 69 6e 36 20 61 64 64 72 3b 0a kaddr_in6 addr;.
d680: 20 20 73 6f 63 6b 6c 65 6e 5f 74 20 73 7a 20 3d socklen_t sz =
d690: 20 73 69 7a 65 6f 66 28 61 64 64 72 29 3b 0a 20 sizeof(addr);.
d6a0: 20 69 66 28 20 67 65 74 70 65 65 72 6e 61 6d 65 if( getpeername
d6b0: 28 66 64 2c 20 26 61 64 64 72 2c 20 26 73 7a 29 (fd, &addr, &sz)
d6c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a ) return 0;. z
d6d0: 49 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 Ip[0] = 0;. if(
d6e0: 20 69 6e 65 74 5f 6e 74 6f 70 28 41 46 5f 49 4e inet_ntop(AF_IN
d6f0: 45 54 36 2c 20 26 61 64 64 72 2c 20 7a 49 70 2c ET6, &addr, zIp,
d700: 20 73 69 7a 65 6f 66 28 7a 49 70 29 29 3d 3d 30 sizeof(zIp))==0
d710: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
d720: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a ;. }. return z
d730: 49 70 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 Ip;.#else. stru
d740: 63 74 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 72 ct sockaddr_in r
d750: 65 6d 6f 74 65 4e 61 6d 65 3b 0a 20 20 73 6f 63 emoteName;. soc
d760: 6b 6c 65 6e 5f 74 20 73 69 7a 65 20 3d 20 73 69 klen_t size = si
d770: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 6f 63 6b zeof(struct sock
d780: 61 64 64 72 5f 69 6e 29 3b 0a 20 20 69 66 28 20 addr_in);. if(
d790: 67 65 74 70 65 65 72 6e 61 6d 65 28 66 64 2c 20 getpeername(fd,
d7a0: 28 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 (struct sockaddr
d7b0: 2a 29 26 72 65 6d 6f 74 65 4e 61 6d 65 2c 20 26 *)&remoteName, &
d7c0: 73 69 7a 65 29 20 29 20 72 65 74 75 72 6e 20 30 size) ) return 0
d7d0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 65 74 5f ;. return inet_
d7e0: 6e 74 6f 61 28 72 65 6d 6f 74 65 4e 61 6d 65 2e ntoa(remoteName.
d7f0: 73 69 6e 5f 61 64 64 72 29 3b 0a 23 65 6e 64 69 sin_addr);.#endi
d800: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 f.}../*.** This
d810: 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c 65 73 20 routine handles
d820: 61 20 73 69 6e 67 6c 65 20 48 54 54 50 20 72 65 a single HTTP re
d830: 71 75 65 73 74 20 77 68 69 63 68 20 69 73 20 63 quest which is c
d840: 6f 6d 69 6e 67 20 69 6e 20 6f 6e 0a 2a 2a 20 67 oming in on.** g
d850: 2e 68 74 74 70 49 6e 20 61 6e 64 20 77 68 69 63 .httpIn and whic
d860: 68 20 72 65 70 6c 69 65 73 20 6f 6e 20 67 2e 68 h replies on g.h
d870: 74 74 70 4f 75 74 0a 2a 2a 0a 2a 2a 20 54 68 65 ttpOut.**.** The
d880: 20 48 54 54 50 20 72 65 71 75 65 73 74 20 69 73 HTTP request is
d890: 20 72 65 61 64 20 66 72 6f 6d 20 67 2e 68 74 74 read from g.htt
d8a0: 70 49 6e 20 61 6e 64 20 69 73 20 75 73 65 64 20 pIn and is used
d8b0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a to initialize.**
d8c0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 entries in the
d8d0: 63 67 69 5f 70 61 72 61 6d 65 74 65 72 28 29 20 cgi_parameter()
d8e0: 68 61 73 68 2c 20 61 73 20 69 66 20 74 68 6f 73 hash, as if thos
d8f0: 65 20 65 6e 74 72 69 65 73 20 77 65 72 65 0a 2a e entries were.*
d900: 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 * environment va
d910: 72 69 61 62 6c 65 73 2e 20 20 41 20 63 61 6c 6c riables. A call
d920: 20 74 6f 20 63 67 69 5f 69 6e 69 74 28 29 20 63 to cgi_init() c
d930: 6f 6d 70 6c 65 74 65 73 0a 2a 2a 20 74 68 65 20 ompletes.** the
d940: 73 65 74 75 70 2e 20 20 4f 6e 63 65 20 61 6c 6c setup. Once all
d950: 20 74 68 65 20 73 65 74 75 70 20 69 73 20 66 69 the setup is fi
d960: 6e 69 73 68 65 64 2c 20 74 68 69 73 20 70 72 6f nished, this pro
d970: 63 65 64 75 72 65 20 72 65 74 75 72 6e 73 0a 2a cedure returns.*
d980: 2a 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 * and subsequent
d990: 20 63 6f 64 65 20 68 61 6e 64 6c 65 73 20 74 68 code handles th
d9a0: 65 20 61 63 74 75 61 6c 20 67 65 6e 65 72 61 74 e actual generat
d9b0: 69 6f 6e 20 6f 66 20 74 68 65 20 77 65 62 70 61 ion of the webpa
d9c0: 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 67 69 5f ge..*/.void cgi_
d9d0: 68 61 6e 64 6c 65 5f 68 74 74 70 5f 72 65 71 75 handle_http_requ
d9e0: 65 73 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a est(const char *
d9f0: 7a 49 70 41 64 64 72 29 7b 0a 20 20 63 68 61 72 zIpAddr){. char
da00: 20 2a 7a 2c 20 2a 7a 54 6f 6b 65 6e 3b 0a 20 20 *z, *zToken;.
da10: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 int i;. const c
da20: 68 61 72 20 2a 7a 53 63 68 65 6d 65 20 3d 20 22 har *zScheme = "
da30: 68 74 74 70 22 3b 0a 20 20 63 68 61 72 20 7a 4c http";. char zL
da40: 69 6e 65 5b 32 30 30 30 5d 3b 20 20 20 20 20 2f ine[2000]; /
da50: 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 * A single line
da60: 6f 66 20 69 6e 70 75 74 2e 20 2a 2f 0a 20 20 67 of input. */. g
da70: 2e 66 75 6c 6c 48 74 74 70 52 65 70 6c 79 20 3d .fullHttpReply =
da80: 20 31 3b 0a 20 20 69 66 28 20 63 67 69 5f 66 67 1;. if( cgi_fg
da90: 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f ets(zLine, sizeo
daa0: 66 28 7a 4c 69 6e 65 29 29 3d 3d 30 20 29 7b 0a f(zLine))==0 ){.
dab0: 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 malformed_re
dac0: 71 75 65 73 74 28 22 6d 69 73 73 69 6e 67 20 48 quest("missing H
dad0: 54 54 50 20 68 65 61 64 65 72 22 29 3b 0a 20 20 TTP header");.
dae0: 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 }. blob_append(
daf0: 26 67 2e 68 74 74 70 48 65 61 64 65 72 2c 20 7a &g.httpHeader, z
db00: 4c 69 6e 65 2c 20 2d 31 29 3b 0a 20 20 63 67 69 Line, -1);. cgi
db10: 5f 74 72 61 63 65 28 7a 4c 69 6e 65 29 3b 0a 20 _trace(zLine);.
db20: 20 7a 54 6f 6b 65 6e 20 3d 20 65 78 74 72 61 63 zToken = extrac
db30: 74 5f 74 6f 6b 65 6e 28 7a 4c 69 6e 65 2c 20 26 t_token(zLine, &
db40: 7a 29 3b 0a 20 20 69 66 28 20 7a 54 6f 6b 65 6e z);. if( zToken
db50: 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 61 6c 66 6f ==0 ){. malfo
db60: 72 6d 65 64 5f 72 65 71 75 65 73 74 28 22 6d 61 rmed_request("ma
db70: 6c 66 6f 72 6d 65 64 20 48 54 54 50 20 68 65 61 lformed HTTP hea
db80: 64 65 72 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 der");. }. if(
db90: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a fossil_strcmp(z
dba0: 54 6f 6b 65 6e 2c 22 47 45 54 22 29 21 3d 30 0a Token,"GET")!=0.
dbb0: 20 20 20 26 26 20 66 6f 73 73 69 6c 5f 73 74 72 && fossil_str
dbc0: 63 6d 70 28 7a 54 6f 6b 65 6e 2c 22 50 4f 53 54 cmp(zToken,"POST
dbd0: 22 29 21 3d 30 0a 20 20 20 26 26 20 66 6f 73 73 ")!=0. && foss
dbe0: 69 6c 5f 73 74 72 63 6d 70 28 7a 54 6f 6b 65 6e il_strcmp(zToken
dbf0: 2c 22 48 45 41 44 22 29 21 3d 30 0a 20 20 29 7b ,"HEAD")!=0. ){
dc00: 0a 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 . malformed_r
dc10: 65 71 75 65 73 74 28 22 75 6e 73 75 70 70 6f 72 equest("unsuppor
dc20: 74 65 64 20 48 54 54 50 20 6d 65 74 68 6f 64 22 ted HTTP method"
dc30: 29 3b 0a 20 20 7d 0a 20 20 63 67 69 5f 73 65 74 );. }. cgi_set
dc40: 65 6e 76 28 22 47 41 54 45 57 41 59 5f 49 4e 54 env("GATEWAY_INT
dc50: 45 52 46 41 43 45 22 2c 22 43 47 49 2f 31 2e 30 ERFACE","CGI/1.0
dc60: 22 29 3b 0a 20 20 63 67 69 5f 73 65 74 65 6e 76 ");. cgi_setenv
dc70: 28 22 52 45 51 55 45 53 54 5f 4d 45 54 48 4f 44 ("REQUEST_METHOD
dc80: 22 2c 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 6f ",zToken);. zTo
dc90: 6b 65 6e 20 3d 20 65 78 74 72 61 63 74 5f 74 6f ken = extract_to
dca0: 6b 65 6e 28 7a 2c 20 26 7a 29 3b 0a 20 20 69 66 ken(z, &z);. if
dcb0: 28 20 7a 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a 20 ( zToken==0 ){.
dcc0: 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 71 malformed_req
dcd0: 75 65 73 74 28 22 6d 61 6c 66 6f 72 6d 65 64 20 uest("malformed
dce0: 55 52 4c 20 69 6e 20 48 54 54 50 20 68 65 61 64 URL in HTTP head
dcf0: 65 72 22 29 3b 0a 20 20 7d 0a 20 20 63 67 69 5f er");. }. cgi_
dd00: 73 65 74 65 6e 76 28 22 52 45 51 55 45 53 54 5f setenv("REQUEST_
dd10: 55 52 49 22 2c 20 7a 54 6f 6b 65 6e 29 3b 0a 20 URI", zToken);.
dd20: 20 63 67 69 5f 73 65 74 65 6e 76 28 22 53 43 52 cgi_setenv("SCR
dd30: 49 50 54 5f 4e 41 4d 45 22 2c 20 22 22 29 3b 0a IPT_NAME", "");.
dd40: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 54 6f 6b 65 for(i=0; zToke
dd50: 6e 5b 69 5d 20 26 26 20 7a 54 6f 6b 65 6e 5b 69 n[i] && zToken[i
dd60: 5d 21 3d 27 3f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 ]!='?'; i++){}.
dd70: 20 69 66 28 20 7a 54 6f 6b 65 6e 5b 69 5d 20 29 if( zToken[i] )
dd80: 20 7a 54 6f 6b 65 6e 5b 69 2b 2b 5d 20 3d 20 30 zToken[i++] = 0
dd90: 3b 0a 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 ;. cgi_setenv("
dda0: 50 41 54 48 5f 49 4e 46 4f 22 2c 20 7a 54 6f 6b PATH_INFO", zTok
ddb0: 65 6e 29 3b 0a 20 20 63 67 69 5f 73 65 74 65 6e en);. cgi_seten
ddc0: 76 28 22 51 55 45 52 59 5f 53 54 52 49 4e 47 22 v("QUERY_STRING"
ddd0: 2c 20 26 7a 54 6f 6b 65 6e 5b 69 5d 29 3b 0a 20 , &zToken[i]);.
dde0: 20 69 66 28 20 7a 49 70 41 64 64 72 3d 3d 30 20 if( zIpAddr==0
ddf0: 29 7b 0a 20 20 20 20 7a 49 70 41 64 64 72 20 3d ){. zIpAddr =
de00: 20 63 67 69 5f 72 65 6d 6f 74 65 5f 69 70 28 66 cgi_remote_ip(f
de10: 69 6c 65 6e 6f 28 67 2e 68 74 74 70 49 6e 29 29 ileno(g.httpIn))
de20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 49 70 41 ;. }. if( zIpA
de30: 64 64 72 20 29 7b 0a 20 20 20 20 63 67 69 5f 73 ddr ){. cgi_s
de40: 65 74 65 6e 76 28 22 52 45 4d 4f 54 45 5f 41 44 etenv("REMOTE_AD
de50: 44 52 22 2c 20 7a 49 70 41 64 64 72 29 3b 0a 20 DR", zIpAddr);.
de60: 20 20 20 67 2e 7a 49 70 41 64 64 72 20 3d 20 66 g.zIpAddr = f
de70: 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 7a 49 70 ossil_strdup(zIp
de80: 41 64 64 72 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f Addr);. }... /
de90: 2a 20 47 65 74 20 61 6c 6c 20 74 68 65 20 6f 70 * Get all the op
dea0: 74 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 74 68 tional fields th
deb0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 65 20 66 69 at follow the fi
dec0: 72 73 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 rst line.. */.
ded0: 20 77 68 69 6c 65 28 20 63 67 69 5f 66 67 65 74 while( cgi_fget
dee0: 73 28 7a 4c 69 6e 65 2c 73 69 7a 65 6f 66 28 7a s(zLine,sizeof(z
def0: 4c 69 6e 65 29 29 20 29 7b 0a 20 20 20 20 63 68 Line)) ){. ch
df00: 61 72 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a ar *zFieldName;.
df10: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a char *zVal;.
df20: 0a 20 20 20 20 63 67 69 5f 74 72 61 63 65 28 7a . cgi_trace(z
df30: 4c 69 6e 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f Line);. blob_
df40: 61 70 70 65 6e 64 28 26 67 2e 68 74 74 70 48 65 append(&g.httpHe
df50: 61 64 65 72 2c 20 7a 4c 69 6e 65 2c 20 2d 31 29 ader, zLine, -1)
df60: 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 ;. zFieldName
df70: 20 3d 20 65 78 74 72 61 63 74 5f 74 6f 6b 65 6e = extract_token
df80: 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 3b 0a 20 (zLine,&zVal);.
df90: 20 20 20 69 66 28 20 7a 46 69 65 6c 64 4e 61 6d if( zFieldNam
dfa0: 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 6c 64 4e e==0 || *zFieldN
dfb0: 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a ame==0 ) break;.
dfc0: 20 20 20 20 77 68 69 6c 65 28 20 66 6f 73 73 69 while( fossi
dfd0: 6c 5f 69 73 73 70 61 63 65 28 2a 7a 56 61 6c 29 l_isspace(*zVal)
dfe0: 20 29 7b 20 7a 56 61 6c 2b 2b 3b 20 7d 0a 20 20 ){ zVal++; }.
dff0: 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 56 61 i = strlen(zVa
e000: 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 l);. while( i
e010: 3e 30 20 26 26 20 66 6f 73 73 69 6c 5f 69 73 73 >0 && fossil_iss
e020: 70 61 63 65 28 7a 56 61 6c 5b 69 2d 31 5d 29 20 pace(zVal[i-1])
e030: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 7a 56 ){ i--; }. zV
e040: 61 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 al[i] = 0;. f
e050: 6f 72 28 69 3d 30 3b 20 7a 46 69 65 6c 64 4e 61 or(i=0; zFieldNa
e060: 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 me[i]; i++){.
e070: 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 5b 69 5d zFieldName[i]
e080: 20 3d 20 66 6f 73 73 69 6c 5f 74 6f 6c 6f 77 65 = fossil_tolowe
e090: 72 28 7a 46 69 65 6c 64 4e 61 6d 65 5b 69 5d 29 r(zFieldName[i])
e0a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
e0b0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 46 fossil_strcmp(zF
e0c0: 69 65 6c 64 4e 61 6d 65 2c 22 61 63 63 65 70 74 ieldName,"accept
e0d0: 2d 65 6e 63 6f 64 69 6e 67 3a 22 29 3d 3d 30 20 -encoding:")==0
e0e0: 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74 ){. cgi_set
e0f0: 65 6e 76 28 22 48 54 54 50 5f 41 43 43 45 50 54 env("HTTP_ACCEPT
e100: 5f 45 4e 43 4f 44 49 4e 47 22 2c 20 7a 56 61 6c _ENCODING", zVal
e110: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 );. }else if(
e120: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a fossil_strcmp(z
e130: 46 69 65 6c 64 4e 61 6d 65 2c 22 63 6f 6e 74 65 FieldName,"conte
e140: 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d 30 20 nt-length:")==0
e150: 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74 ){. cgi_set
e160: 65 6e 76 28 22 43 4f 4e 54 45 4e 54 5f 4c 45 4e env("CONTENT_LEN
e170: 47 54 48 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 GTH", zVal);.
e180: 20 7d 65 6c 73 65 20 69 66 28 20 66 6f 73 73 69 }else if( fossi
e190: 6c 5f 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e l_strcmp(zFieldN
e1a0: 61 6d 65 2c 22 63 6f 6e 74 65 6e 74 2d 74 79 70 ame,"content-typ
e1b0: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 e:")==0 ){.
e1c0: 20 63 67 69 5f 73 65 74 65 6e 76 28 22 43 4f 4e cgi_setenv("CON
e1d0: 54 45 4e 54 5f 54 59 50 45 22 2c 20 7a 56 61 6c TENT_TYPE", zVal
e1e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 );. }else if(
e1f0: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a fossil_strcmp(z
e200: 46 69 65 6c 64 4e 61 6d 65 2c 22 63 6f 6f 6b 69 FieldName,"cooki
e210: 65 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 e:")==0 ){.
e220: 20 63 67 69 5f 73 65 74 65 6e 76 28 22 48 54 54 cgi_setenv("HTT
e230: 50 5f 43 4f 4f 4b 49 45 22 2c 20 7a 56 61 6c 29 P_COOKIE", zVal)
e240: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
e250: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 46 fossil_strcmp(zF
e260: 69 65 6c 64 4e 61 6d 65 2c 22 68 74 74 70 73 3a ieldName,"https:
e270: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 ")==0 ){. c
e280: 67 69 5f 73 65 74 65 6e 76 28 22 48 54 54 50 53 gi_setenv("HTTPS
e290: 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 ", zVal);.
e2a0: 7a 53 63 68 65 6d 65 20 3d 20 22 68 74 74 70 73 zScheme = "https
e2b0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 ";. }else if(
e2c0: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a fossil_strcmp(z
e2d0: 46 69 65 6c 64 4e 61 6d 65 2c 22 68 6f 73 74 3a FieldName,"host:
e2e0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 ")==0 ){. c
e2f0: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 63 67 har *z;. cg
e300: 69 5f 73 65 74 65 6e 76 28 22 48 54 54 50 5f 48 i_setenv("HTTP_H
e310: 4f 53 54 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 OST", zVal);.
e320: 20 20 20 7a 20 3d 20 73 74 72 63 68 72 28 7a 56 z = strchr(zV
e330: 61 6c 2c 20 27 3a 27 29 3b 0a 20 20 20 20 20 20 al, ':');.
e340: 69 66 28 20 7a 20 29 20 7a 5b 30 5d 20 3d 20 30 if( z ) z[0] = 0
e350: 3b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74 65 ;. cgi_sete
e360: 6e 76 28 22 53 45 52 56 45 52 5f 4e 41 4d 45 22 nv("SERVER_NAME"
e370: 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c , zVal);. }el
e380: 73 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 se if( fossil_st
e390: 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c rcmp(zFieldName,
e3a0: 22 69 66 2d 6e 6f 6e 65 2d 6d 61 74 63 68 3a 22 "if-none-match:"
e3b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 67 )==0 ){. cg
e3c0: 69 5f 73 65 74 65 6e 76 28 22 48 54 54 50 5f 49 i_setenv("HTTP_I
e3d0: 46 5f 4e 4f 4e 45 5f 4d 41 54 43 48 22 2c 20 7a F_NONE_MATCH", z
e3e0: 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 Val);. }else
e3f0: 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d if( fossil_strcm
e400: 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 69 66 p(zFieldName,"if
e410: 2d 6d 6f 64 69 66 69 65 64 2d 73 69 6e 63 65 3a -modified-since:
e420: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 ")==0 ){. c
e430: 67 69 5f 73 65 74 65 6e 76 28 22 48 54 54 50 5f gi_setenv("HTTP_
e440: 49 46 5f 4d 4f 44 49 46 49 45 44 5f 53 49 4e 43 IF_MODIFIED_SINC
e450: 45 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 7d E", zVal);. }
e460: 65 6c 73 65 20 69 66 28 20 66 6f 73 73 69 6c 5f else if( fossil_
e470: 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d strcmp(zFieldNam
e480: 65 2c 22 72 65 66 65 72 65 72 3a 22 29 3d 3d 30 e,"referer:")==0
e490: 20 29 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 ){. cgi_se
e4a0: 74 65 6e 76 28 22 48 54 54 50 5f 52 45 46 45 52 tenv("HTTP_REFER
e4b0: 45 52 22 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 ER", zVal);.
e4c0: 7d 65 6c 73 65 20 69 66 28 20 66 6f 73 73 69 6c }else if( fossil
e4d0: 5f 73 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 _strcmp(zFieldNa
e4e0: 6d 65 2c 22 75 73 65 72 2d 61 67 65 6e 74 3a 22 me,"user-agent:"
e4f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 67 )==0 ){. cg
e500: 69 5f 73 65 74 65 6e 76 28 22 48 54 54 50 5f 55 i_setenv("HTTP_U
e510: 53 45 52 5f 41 47 45 4e 54 22 2c 20 7a 56 61 6c SER_AGENT", zVal
e520: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 );. }else if(
e530: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a fossil_strcmp(z
e540: 46 69 65 6c 64 4e 61 6d 65 2c 22 61 75 74 68 6f FieldName,"autho
e550: 72 69 7a 61 74 69 6f 6e 3a 22 29 3d 3d 30 20 29 rization:")==0 )
e560: 7b 0a 20 20 20 20 20 20 63 67 69 5f 73 65 74 65 {. cgi_sete
e570: 6e 76 28 22 48 54 54 50 5f 41 55 54 48 4f 52 49 nv("HTTP_AUTHORI
e580: 5a 41 54 49 4f 4e 22 2c 20 7a 56 61 6c 29 3b 0a ZATION", zVal);.
e590: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6f }else if( fo
e5a0: 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 46 69 65 ssil_strcmp(zFie
e5b0: 6c 64 4e 61 6d 65 2c 22 78 2d 66 6f 72 77 61 72 ldName,"x-forwar
e5c0: 64 65 64 2d 66 6f 72 3a 22 29 3d 3d 30 20 29 7b ded-for:")==0 ){
e5d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 . const cha
e5e0: 72 20 2a 7a 49 70 41 64 64 72 20 3d 20 63 67 69 r *zIpAddr = cgi
e5f0: 5f 61 63 63 65 70 74 5f 66 6f 72 77 61 72 64 65 _accept_forwarde
e600: 64 5f 66 6f 72 28 7a 56 61 6c 29 3b 0a 20 20 20 d_for(zVal);.
e610: 20 20 20 69 66 28 20 7a 49 70 41 64 64 72 21 3d if( zIpAddr!=
e620: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e 7a 0 ){. g.z
e630: 49 70 41 64 64 72 20 3d 20 66 6f 73 73 69 6c 5f IpAddr = fossil_
e640: 73 74 72 64 75 70 28 7a 49 70 41 64 64 72 29 3b strdup(zIpAddr);
e650: 0a 20 20 20 20 20 20 20 20 63 67 69 5f 72 65 70 . cgi_rep
e660: 6c 61 63 65 5f 70 61 72 61 6d 65 74 65 72 28 22 lace_parameter("
e670: 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c 20 67 2e REMOTE_ADDR", g.
e680: 7a 49 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 zIpAddr);.
e690: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }. }else if(
e6a0: 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 46 fossil_strcmp(zF
e6b0: 69 65 6c 64 4e 61 6d 65 2c 22 72 61 6e 67 65 3a ieldName,"range:
e6c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 ")==0 ){. i
e6d0: 6e 74 20 78 31 20 3d 20 30 3b 0a 20 20 20 20 20 nt x1 = 0;.
e6e0: 20 69 6e 74 20 78 32 20 3d 20 30 3b 0a 20 20 20 int x2 = 0;.
e6f0: 20 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a 56 if( sscanf(zV
e700: 61 6c 2c 22 62 79 74 65 73 3d 25 64 2d 25 64 22 al,"bytes=%d-%d"
e710: 2c 26 78 31 2c 26 78 32 29 3d 3d 32 20 26 26 20 ,&x1,&x2)==2 &&
e720: 78 31 3e 3d 30 20 26 26 20 78 31 3c 3d 78 32 20 x1>=0 && x1<=x2
e730: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 6e 67 65 ){. range
e740: 53 74 61 72 74 20 3d 20 78 31 3b 0a 20 20 20 20 Start = x1;.
e750: 20 20 20 20 72 61 6e 67 65 45 6e 64 20 3d 20 78 rangeEnd = x
e760: 32 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 2+1;. }.
e770: 20 7d 0a 20 20 7d 0a 20 20 63 67 69 5f 73 65 74 }. }. cgi_set
e780: 65 6e 76 28 22 52 45 51 55 45 53 54 5f 53 43 48 env("REQUEST_SCH
e790: 45 4d 45 22 2c 7a 53 63 68 65 6d 65 29 3b 0a 20 EME",zScheme);.
e7a0: 20 63 67 69 5f 69 6e 69 74 28 29 3b 0a 20 20 63 cgi_init();. c
e7b0: 67 69 5f 74 72 61 63 65 28 30 29 3b 0a 7d 0a 0a gi_trace(0);.}..
e7c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
e7d0: 6e 65 20 68 61 6e 64 6c 65 73 20 61 20 73 69 6e ne handles a sin
e7e0: 67 6c 65 20 48 54 54 50 20 72 65 71 75 65 73 74 gle HTTP request
e7f0: 20 66 72 6f 6d 20 61 6e 20 53 53 48 20 63 6c 69 from an SSH cli
e800: 65 6e 74 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 ent which is.**
e810: 63 6f 6d 69 6e 67 20 69 6e 20 6f 6e 20 67 2e 68 coming in on g.h
e820: 74 74 70 49 6e 20 61 6e 64 20 77 68 69 63 68 20 ttpIn and which
e830: 72 65 70 6c 69 65 73 20 6f 6e 20 67 2e 68 74 74 replies on g.htt
e840: 70 4f 75 74 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 pOut.**.** Once
e850: 61 6c 6c 20 74 68 65 20 73 65 74 75 70 20 69 73 all the setup is
e860: 20 66 69 6e 69 73 68 65 64 2c 20 74 68 69 73 20 finished, this
e870: 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e procedure return
e880: 73 0a 2a 2a 20 61 6e 64 20 73 75 62 73 65 71 75 s.** and subsequ
e890: 65 6e 74 20 63 6f 64 65 20 68 61 6e 64 6c 65 73 ent code handles
e8a0: 20 74 68 65 20 61 63 74 75 61 6c 20 67 65 6e 65 the actual gene
e8b0: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 77 65 ration of the we
e8c0: 62 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 bpage..**.** It
e8d0: 69 73 20 63 61 6c 6c 65 64 20 69 6e 20 61 20 6c is called in a l
e8e0: 6f 6f 70 20 73 6f 20 73 6f 6d 65 20 76 61 72 69 oop so some vari
e8f0: 61 62 6c 65 73 20 77 69 6c 6c 20 6e 65 65 64 20 ables will need
e900: 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 0a 2a to be replaced.*
e910: 2f 0a 76 6f 69 64 20 63 67 69 5f 68 61 6e 64 6c /.void cgi_handl
e920: 65 5f 73 73 68 5f 68 74 74 70 5f 72 65 71 75 65 e_ssh_http_reque
e930: 73 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a st(const char *z
e940: 49 70 41 64 64 72 29 7b 0a 20 20 73 74 61 74 69 IpAddr){. stati
e950: 63 20 69 6e 74 20 6e 43 79 63 6c 65 73 20 3d 20 c int nCycles =
e960: 30 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 0;. static char
e970: 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 63 68 *zCmd = 0;. ch
e980: 61 72 20 2a 7a 2c 20 2a 7a 54 6f 6b 65 6e 3b 0a ar *z, *zToken;.
e990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 const char *zT
e9a0: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 ype = 0;. int i
e9b0: 2c 20 63 6f 6e 74 65 6e 74 5f 6c 65 6e 67 74 68 , content_length
e9c0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 4c 69 = 0;. char zLi
e9d0: 6e 65 5b 32 30 30 30 5d 3b 20 20 20 20 20 2f 2a ne[2000]; /*
e9e0: 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f A single line o
e9f0: 66 20 69 6e 70 75 74 2e 20 2a 2f 0a 0a 20 20 61 f input. */.. a
ea00: 73 73 65 72 74 28 20 21 67 2e 68 74 74 70 55 73 ssert( !g.httpUs
ea10: 65 53 53 4c 20 29 3b 0a 23 69 66 64 65 66 20 46 eSSL );.#ifdef F
ea20: 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f OSSIL_ENABLE_JSO
ea30: 4e 0a 20 20 69 66 28 20 6e 43 79 63 6c 65 73 3d N. if( nCycles=
ea40: 3d 30 20 29 7b 20 6a 73 6f 6e 5f 62 6f 6f 74 73 =0 ){ json_boots
ea50: 74 72 61 70 5f 65 61 72 6c 79 28 29 3b 20 7d 0a trap_early(); }.
ea60: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 49 70 #endif. if( zIp
ea70: 41 64 64 72 20 29 7b 0a 20 20 20 20 69 66 28 20 Addr ){. if(
ea80: 6e 43 79 63 6c 65 73 3d 3d 30 20 29 7b 0a 20 20 nCycles==0 ){.
ea90: 20 20 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 cgi_setenv("
eaa0: 52 45 4d 4f 54 45 5f 41 44 44 52 22 2c 20 7a 49 REMOTE_ADDR", zI
eab0: 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 67 2e pAddr);. g.
eac0: 7a 49 70 41 64 64 72 20 3d 20 66 6f 73 73 69 6c zIpAddr = fossil
ead0: 5f 73 74 72 64 75 70 28 7a 49 70 41 64 64 72 29 _strdup(zIpAddr)
eae0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b ;. }. }else{
eaf0: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 . fossil_fata
eb00: 6c 28 22 6d 69 73 73 69 6e 67 20 53 53 48 20 49 l("missing SSH I
eb10: 50 20 61 64 64 72 65 73 73 22 29 3b 0a 20 20 7d P address");. }
eb20: 0a 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c 69 . if( fgets(zLi
eb30: 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 ne, sizeof(zLine
eb40: 29 2c 67 2e 68 74 74 70 49 6e 29 3d 3d 30 20 29 ),g.httpIn)==0 )
eb50: 7b 0a 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f {. malformed_
eb60: 72 65 71 75 65 73 74 28 22 6d 69 73 73 69 6e 67 request("missing
eb70: 20 48 54 54 50 20 68 65 61 64 65 72 22 29 3b 0a HTTP header");.
eb80: 20 20 7d 0a 20 20 63 67 69 5f 74 72 61 63 65 28 }. cgi_trace(
eb90: 7a 4c 69 6e 65 29 3b 0a 20 20 7a 54 6f 6b 65 6e zLine);. zToken
eba0: 20 3d 20 65 78 74 72 61 63 74 5f 74 6f 6b 65 6e = extract_token
ebb0: 28 7a 4c 69 6e 65 2c 20 26 7a 29 3b 0a 20 20 69 (zLine, &z);. i
ebc0: 66 28 20 7a 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a f( zToken==0 ){.
ebd0: 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 malformed_re
ebe0: 71 75 65 73 74 28 22 6d 61 6c 66 6f 72 6d 65 64 quest("malformed
ebf0: 20 48 54 54 50 20 68 65 61 64 65 72 22 29 3b 0a HTTP header");.
ec00: 20 20 7d 0a 0a 20 20 69 66 28 20 66 6f 73 73 69 }.. if( fossi
ec10: 6c 5f 73 74 72 63 6d 70 28 7a 54 6f 6b 65 6e 2c l_strcmp(zToken,
ec20: 20 22 65 63 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 "echo")==0 ){.
ec30: 20 20 20 2f 2a 20 73 74 61 72 74 20 6c 6f 6f 6b /* start look
ec40: 69 6e 67 20 66 6f 72 20 70 72 6f 62 65 73 20 74 ing for probes t
ec50: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 o complete trans
ec60: 70 6f 72 74 5f 6f 70 65 6e 20 2a 2f 0a 20 20 20 port_open */.
ec70: 20 7a 43 6d 64 20 3d 20 63 67 69 5f 68 61 6e 64 zCmd = cgi_hand
ec80: 6c 65 5f 73 73 68 5f 70 72 6f 62 65 73 28 7a 4c le_ssh_probes(zL
ec90: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e ine, sizeof(zLin
eca0: 65 29 2c 20 7a 2c 20 7a 54 6f 6b 65 6e 29 3b 0a e), z, zToken);.
ecb0: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c if( fgets(zL
ecc0: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e ine, sizeof(zLin
ecd0: 65 29 2c 67 2e 68 74 74 70 49 6e 29 3d 3d 30 20 e),g.httpIn)==0
ece0: 29 7b 0a 20 20 20 20 20 20 6d 61 6c 66 6f 72 6d ){. malform
ecf0: 65 64 5f 72 65 71 75 65 73 74 28 22 6d 69 73 73 ed_request("miss
ed00: 69 6e 67 20 48 54 54 50 20 68 65 61 64 65 72 22 ing HTTP header"
ed10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 67 69 );. }. cgi
ed20: 5f 74 72 61 63 65 28 7a 4c 69 6e 65 29 3b 0a 20 _trace(zLine);.
ed30: 20 20 20 7a 54 6f 6b 65 6e 20 3d 20 65 78 74 72 zToken = extr
ed40: 61 63 74 5f 74 6f 6b 65 6e 28 7a 4c 69 6e 65 2c act_token(zLine,
ed50: 20 26 7a 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 &z);. if( zT
ed60: 6f 6b 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 oken==0 ){.
ed70: 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 71 75 65 malformed_reque
ed80: 73 74 28 22 6d 61 6c 66 6f 72 6d 65 64 20 48 54 st("malformed HT
ed90: 54 50 20 68 65 61 64 65 72 22 29 3b 0a 20 20 20 TP header");.
eda0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a }. }else if( z
edb0: 54 6f 6b 65 6e 20 26 26 20 73 74 72 6c 65 6e 28 Token && strlen(
edc0: 7a 54 6f 6b 65 6e 29 3d 3d 30 20 26 26 20 7a 43 zToken)==0 && zC
edd0: 6d 64 20 29 7b 0a 20 20 20 20 2f 2a 20 74 72 61 md ){. /* tra
ede0: 6e 73 70 6f 72 74 5f 66 6c 69 70 20 72 65 71 75 nsport_flip requ
edf0: 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 est and continue
ee00: 64 20 74 72 61 6e 73 70 6f 72 74 5f 6f 70 65 6e d transport_open
ee10: 20 2a 2f 0a 20 20 20 20 63 67 69 5f 68 61 6e 64 */. cgi_hand
ee20: 6c 65 5f 73 73 68 5f 74 72 61 6e 73 70 6f 72 74 le_ssh_transport
ee30: 28 7a 43 6d 64 29 3b 0a 20 20 20 20 69 66 28 20 (zCmd);. if(
ee40: 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a fgets(zLine, siz
ee50: 65 6f 66 28 7a 4c 69 6e 65 29 2c 67 2e 68 74 74 eof(zLine),g.htt
ee60: 70 49 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 pIn)==0 ){.
ee70: 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 71 75 65 malformed_reque
ee80: 73 74 28 22 6d 69 73 73 69 6e 67 20 48 54 54 50 st("missing HTTP
ee90: 20 68 65 61 64 65 72 22 29 3b 0a 20 20 20 20 7d header");. }
eea0: 0a 20 20 20 20 63 67 69 5f 74 72 61 63 65 28 7a . cgi_trace(z
eeb0: 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 54 6f 6b 65 Line);. zToke
eec0: 6e 20 3d 20 65 78 74 72 61 63 74 5f 74 6f 6b 65 n = extract_toke
eed0: 6e 28 7a 4c 69 6e 65 2c 20 26 7a 29 3b 0a 20 20 n(zLine, &z);.
eee0: 20 20 69 66 28 20 7a 54 6f 6b 65 6e 3d 3d 30 20 if( zToken==0
eef0: 29 7b 0a 20 20 20 20 20 20 6d 61 6c 66 6f 72 6d ){. malform
ef00: 65 64 5f 72 65 71 75 65 73 74 28 22 6d 61 6c 66 ed_request("malf
ef10: 6f 72 6d 65 64 20 48 54 54 50 20 68 65 61 64 65 ormed HTTP heade
ef20: 72 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a r");. }. }..
ef30: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 if( fossil_str
ef40: 63 6d 70 28 7a 54 6f 6b 65 6e 2c 22 47 45 54 22 cmp(zToken,"GET"
ef50: 29 21 3d 30 20 26 26 20 66 6f 73 73 69 6c 5f 73 )!=0 && fossil_s
ef60: 74 72 63 6d 70 28 7a 54 6f 6b 65 6e 2c 22 50 4f trcmp(zToken,"PO
ef70: 53 54 22 29 21 3d 30 0a 20 20 20 20 20 20 26 26 ST")!=0. &&
ef80: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a fossil_strcmp(z
ef90: 54 6f 6b 65 6e 2c 22 48 45 41 44 22 29 21 3d 30 Token,"HEAD")!=0
efa0: 20 29 7b 0a 20 20 20 20 6d 61 6c 66 6f 72 6d 65 ){. malforme
efb0: 64 5f 72 65 71 75 65 73 74 28 22 75 6e 73 75 70 d_request("unsup
efc0: 70 6f 72 74 65 64 20 48 54 54 50 20 6d 65 74 68 ported HTTP meth
efd0: 6f 64 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 od");. }.. if(
efe0: 20 6e 43 79 63 6c 65 73 3d 3d 30 20 29 7b 0a 20 nCycles==0 ){.
eff0: 20 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 47 cgi_setenv("G
f000: 41 54 45 57 41 59 5f 49 4e 54 45 52 46 41 43 45 ATEWAY_INTERFACE
f010: 22 2c 22 43 47 49 2f 31 2e 30 22 29 3b 0a 20 20 ","CGI/1.0");.
f020: 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 52 45 cgi_setenv("RE
f030: 51 55 45 53 54 5f 4d 45 54 48 4f 44 22 2c 7a 54 QUEST_METHOD",zT
f040: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 0a 20 20 7a 54 oken);. }.. zT
f050: 6f 6b 65 6e 20 3d 20 65 78 74 72 61 63 74 5f 74 oken = extract_t
f060: 6f 6b 65 6e 28 7a 2c 20 26 7a 29 3b 0a 20 20 69 oken(z, &z);. i
f070: 66 28 20 7a 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a f( zToken==0 ){.
f080: 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 malformed_re
f090: 71 75 65 73 74 28 22 6d 61 6c 66 6f 72 6d 65 64 quest("malformed
f0a0: 20 55 52 4c 20 69 6e 20 48 54 54 50 20 68 65 61 URL in HTTP hea
f0b0: 64 65 72 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 der");. }. if(
f0c0: 20 6e 43 79 63 6c 65 73 3d 3d 30 20 29 7b 0a 20 nCycles==0 ){.
f0d0: 20 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 52 cgi_setenv("R
f0e0: 45 51 55 45 53 54 5f 55 52 49 22 2c 20 7a 54 6f EQUEST_URI", zTo
f0f0: 6b 65 6e 29 3b 0a 20 20 20 20 63 67 69 5f 73 65 ken);. cgi_se
f100: 74 65 6e 76 28 22 53 43 52 49 50 54 5f 4e 41 4d tenv("SCRIPT_NAM
f110: 45 22 2c 20 22 22 29 3b 0a 20 20 7d 0a 0a 20 20 E", "");. }..
f120: 66 6f 72 28 69 3d 30 3b 20 7a 54 6f 6b 65 6e 5b for(i=0; zToken[
f130: 69 5d 20 26 26 20 7a 54 6f 6b 65 6e 5b 69 5d 21 i] && zToken[i]!
f140: 3d 27 3f 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 ='?'; i++){}. i
f150: 66 28 20 7a 54 6f 6b 65 6e 5b 69 5d 20 29 20 7a f( zToken[i] ) z
f160: 54 6f 6b 65 6e 5b 69 2b 2b 5d 20 3d 20 30 3b 0a Token[i++] = 0;.
f170: 20 20 69 66 28 20 6e 43 79 63 6c 65 73 3d 3d 30 if( nCycles==0
f180: 20 29 7b 0a 20 20 20 20 63 67 69 5f 73 65 74 65 ){. cgi_sete
f190: 6e 76 28 22 50 41 54 48 5f 49 4e 46 4f 22 2c 20 nv("PATH_INFO",
f1a0: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 65 6c 73 65 zToken);. }else
f1b0: 7b 0a 20 20 20 20 63 67 69 5f 72 65 70 6c 61 63 {. cgi_replac
f1c0: 65 5f 70 61 72 61 6d 65 74 65 72 28 22 50 41 54 e_parameter("PAT
f1d0: 48 5f 49 4e 46 4f 22 2c 20 66 6f 73 73 69 6c 5f H_INFO", fossil_
f1e0: 73 74 72 64 75 70 28 7a 54 6f 6b 65 6e 29 29 3b strdup(zToken));
f1f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 . }.. /* Get a
f200: 6c 6c 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 ll the optional
f210: 66 69 65 6c 64 73 20 74 68 61 74 20 66 6f 6c 6c fields that foll
f220: 6f 77 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e ow the first lin
f230: 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 e.. */. while(
f240: 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 73 69 7a fgets(zLine,siz
f250: 65 6f 66 28 7a 4c 69 6e 65 29 2c 67 2e 68 74 74 eof(zLine),g.htt
f260: 70 49 6e 29 20 29 7b 0a 20 20 20 20 63 68 61 72 pIn) ){. char
f270: 20 2a 7a 46 69 65 6c 64 4e 61 6d 65 3b 0a 20 20 *zFieldName;.
f280: 20 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 0a 20 char *zVal;..
f290: 20 20 20 63 67 69 5f 74 72 61 63 65 28 7a 4c 69 cgi_trace(zLi
f2a0: 6e 65 29 3b 0a 20 20 20 20 7a 46 69 65 6c 64 4e ne);. zFieldN
f2b0: 61 6d 65 20 3d 20 65 78 74 72 61 63 74 5f 74 6f ame = extract_to
f2c0: 6b 65 6e 28 7a 4c 69 6e 65 2c 26 7a 56 61 6c 29 ken(zLine,&zVal)
f2d0: 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 65 6c 64 ;. if( zField
f2e0: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 65 Name==0 || *zFie
f2f0: 6c 64 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 ldName==0 ) brea
f300: 6b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 6f k;. while( fo
f310: 73 73 69 6c 5f 69 73 73 70 61 63 65 28 2a 7a 56 ssil_isspace(*zV
f320: 61 6c 29 20 29 7b 20 7a 56 61 6c 2b 2b 3b 20 7d al) ){ zVal++; }
f330: 0a 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 . i = strlen(
f340: 7a 56 61 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65 zVal);. while
f350: 28 20 69 3e 30 20 26 26 20 66 6f 73 73 69 6c 5f ( i>0 && fossil_
f360: 69 73 73 70 61 63 65 28 7a 56 61 6c 5b 69 2d 31 isspace(zVal[i-1
f370: 5d 29 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 ]) ){ i--; }.
f380: 20 7a 56 61 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 zVal[i] = 0;.
f390: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 46 69 65 6c for(i=0; zFiel
f3a0: 64 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a dName[i]; i++){.
f3b0: 20 20 20 20 20 20 7a 46 69 65 6c 64 4e 61 6d 65 zFieldName
f3c0: 5b 69 5d 20 3d 20 66 6f 73 73 69 6c 5f 74 6f 6c [i] = fossil_tol
f3d0: 6f 77 65 72 28 7a 46 69 65 6c 64 4e 61 6d 65 5b ower(zFieldName[
f3e0: 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 i]);. }. i
f3f0: 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 f( fossil_strcmp
f400: 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 63 6f 6e (zFieldName,"con
f410: 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 29 3d 3d tent-length:")==
f420: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 65 0 ){. conte
f430: 6e 74 5f 6c 65 6e 67 74 68 20 3d 20 61 74 6f 69 nt_length = atoi
f440: 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 (zVal);. }els
f450: 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 e if( fossil_str
f460: 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 cmp(zFieldName,"
f470: 63 6f 6e 74 65 6e 74 2d 74 79 70 65 3a 22 29 3d content-type:")=
f480: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 2e 7a 43 =0 ){. g.zC
f490: 6f 6e 74 65 6e 74 54 79 70 65 20 3d 20 7a 54 79 ontentType = zTy
f4a0: 70 65 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 pe = fossil_strd
f4b0: 75 70 28 7a 56 61 6c 29 3b 0a 20 20 20 20 7d 65 up(zVal);. }e
f4c0: 6c 73 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 lse if( fossil_s
f4d0: 74 72 63 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 trcmp(zFieldName
f4e0: 2c 22 68 6f 73 74 3a 22 29 3d 3d 30 20 29 7b 0a ,"host:")==0 ){.
f4f0: 20 20 20 20 20 20 69 66 28 20 6e 43 79 63 6c 65 if( nCycle
f500: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 s==0 ){.
f510: 63 67 69 5f 73 65 74 65 6e 76 28 22 48 54 54 50 cgi_setenv("HTTP
f520: 5f 48 4f 53 54 22 2c 20 7a 56 61 6c 29 3b 0a 20 _HOST", zVal);.
f530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 }. }else
f540: 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 if( fossil_strc
f550: 6d 70 28 7a 46 69 65 6c 64 4e 61 6d 65 2c 22 75 mp(zFieldName,"u
f560: 73 65 72 2d 61 67 65 6e 74 3a 22 29 3d 3d 30 20 ser-agent:")==0
f570: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 79 ){. if( nCy
f580: 63 6c 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 cles==0 ){.
f590: 20 20 20 63 67 69 5f 73 65 74 65 6e 76 28 22 48 cgi_setenv("H
f5a0: 54 54 50 5f 55 53 45 52 5f 41 47 45 4e 54 22 2c TTP_USER_AGENT",
f5b0: 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a zVal);. }.
f5c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6f }else if( fo
f5d0: 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 46 69 65 ssil_strcmp(zFie
f5e0: 6c 64 4e 61 6d 65 2c 22 78 2d 66 6f 73 73 69 6c ldName,"x-fossil
f5f0: 2d 74 72 61 6e 73 70 6f 72 74 3a 22 29 3d 3d 30 -transport:")==0
f600: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6f ){. if( fo
f610: 73 73 69 6c 5f 73 74 72 6e 69 63 6d 70 28 7a 56 ssil_strnicmp(zV
f620: 61 6c 2c 20 22 73 73 68 22 2c 20 33 29 3d 3d 30 al, "ssh", 3)==0
f630: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
f640: 6e 43 79 63 6c 65 73 3d 3d 30 20 29 7b 0a 20 20 nCycles==0 ){.
f650: 20 20 20 20 20 20 20 20 67 2e 66 53 73 68 43 6c g.fSshCl
f660: 69 65 6e 74 20 7c 3d 20 43 47 49 5f 53 53 48 5f ient |= CGI_SSH_
f670: 46 4f 53 53 49 4c 3b 0a 20 20 20 20 20 20 20 20 FOSSIL;.
f680: 20 20 67 2e 66 75 6c 6c 48 74 74 70 52 65 70 6c g.fullHttpRepl
f690: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d y = 0;. }
f6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
f6b0: 20 7d 0a 0a 20 20 69 66 28 20 6e 43 79 63 6c 65 }.. if( nCycle
f6c0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 s==0 ){. if(
f6d0: 21 20 28 20 67 2e 66 53 73 68 43 6c 69 65 6e 74 ! ( g.fSshClient
f6e0: 20 26 20 43 47 49 5f 53 53 48 5f 46 4f 53 53 49 & CGI_SSH_FOSSI
f6f0: 4c 20 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 L ) ){. /*
f700: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 6e 65 77 did not find new
f710: 20 66 6f 73 73 69 6c 20 73 73 68 20 74 72 61 6e fossil ssh tran
f720: 73 70 6f 72 74 20 2a 2f 0a 20 20 20 20 20 20 67 sport */. g
f730: 2e 66 53 73 68 43 6c 69 65 6e 74 20 26 3d 20 7e .fSshClient &= ~
f740: 43 47 49 5f 53 53 48 5f 43 4c 49 45 4e 54 3b 0a CGI_SSH_CLIENT;.
f750: 20 20 20 20 20 20 67 2e 66 75 6c 6c 48 74 74 70 g.fullHttp
f760: 52 65 70 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 Reply = 1;.
f770: 20 63 67 69 5f 72 65 70 6c 61 63 65 5f 70 61 72 cgi_replace_par
f780: 61 6d 65 74 65 72 28 22 52 45 4d 4f 54 45 5f 41 ameter("REMOTE_A
f790: 44 44 52 22 2c 20 22 31 32 37 2e 30 2e 30 2e 31 DDR", "127.0.0.1
f7a0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 ");. }. }..
f7b0: 20 63 67 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 cgi_reset_conte
f7c0: 6e 74 28 29 3b 0a 20 20 63 67 69 5f 64 65 73 74 nt();. cgi_dest
f7d0: 69 6e 61 74 69 6f 6e 28 43 47 49 5f 42 4f 44 59 ination(CGI_BODY
f7e0: 29 3b 0a 0a 20 20 69 66 28 20 63 6f 6e 74 65 6e );.. if( conten
f7f0: 74 5f 6c 65 6e 67 74 68 3e 30 20 26 26 20 7a 54 t_length>0 && zT
f800: 79 70 65 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f ype ){. blob_
f810: 7a 65 72 6f 28 26 67 2e 63 67 69 49 6e 29 3b 0a zero(&g.cgiIn);.
f820: 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 if( fossil_s
f830: 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 61 70 trcmp(zType, "ap
f840: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 plication/x-foss
f850: 69 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 il")==0 ){.
f860: 20 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f blob_read_from_
f870: 63 68 61 6e 6e 65 6c 28 26 67 2e 63 67 69 49 6e channel(&g.cgiIn
f880: 2c 20 67 2e 68 74 74 70 49 6e 2c 20 63 6f 6e 74 , g.httpIn, cont
f890: 65 6e 74 5f 6c 65 6e 67 74 68 29 3b 0a 20 20 20 ent_length);.
f8a0: 20 20 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 72 65 blob_uncompre
f8b0: 73 73 28 26 67 2e 63 67 69 49 6e 2c 20 26 67 2e ss(&g.cgiIn, &g.
f8c0: 63 67 69 49 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 cgiIn);. }els
f8d0: 65 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 e if( fossil_str
f8e0: 63 6d 70 28 7a 54 79 70 65 2c 20 22 61 70 70 6c cmp(zType, "appl
f8f0: 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c ication/x-fossil
f900: 2d 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 -debug")==0 ){.
f910: 20 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 blob_read_f
f920: 72 6f 6d 5f 63 68 61 6e 6e 65 6c 28 26 67 2e 63 rom_channel(&g.c
f930: 67 69 49 6e 2c 20 67 2e 68 74 74 70 49 6e 2c 20 giIn, g.httpIn,
f940: 63 6f 6e 74 65 6e 74 5f 6c 65 6e 67 74 68 29 3b content_length);
f950: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 . }else if( f
f960: 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 54 79 ossil_strcmp(zTy
f970: 70 65 2c 20 22 61 70 70 6c 69 63 61 74 69 6f 6e pe, "application
f980: 2f 78 2d 66 6f 73 73 69 6c 2d 75 6e 63 6f 6d 70 /x-fossil-uncomp
f990: 72 65 73 73 65 64 22 29 3d 3d 30 20 29 7b 0a 20 ressed")==0 ){.
f9a0: 20 20 20 20 20 62 6c 6f 62 5f 72 65 61 64 5f 66 blob_read_f
f9b0: 72 6f 6d 5f 63 68 61 6e 6e 65 6c 28 26 67 2e 63 rom_channel(&g.c
f9c0: 67 69 49 6e 2c 20 67 2e 68 74 74 70 49 6e 2c 20 giIn, g.httpIn,
f9d0: 63 6f 6e 74 65 6e 74 5f 6c 65 6e 67 74 68 29 3b content_length);
f9e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 67 69 . }. }. cgi
f9f0: 5f 74 72 61 63 65 28 30 29 3b 0a 20 20 6e 43 79 _trace(0);. nCy
fa00: 63 6c 65 73 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a cles++;.}../*.**
fa10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 This routine ha
fa20: 6e 64 6c 65 73 20 74 68 65 20 6f 6c 64 20 66 6f ndles the old fo
fa30: 73 73 69 6c 20 53 53 48 20 70 72 6f 62 65 73 0a ssil SSH probes.
fa40: 2a 2f 0a 63 68 61 72 20 2a 63 67 69 5f 68 61 6e */.char *cgi_han
fa50: 64 6c 65 5f 73 73 68 5f 70 72 6f 62 65 73 28 63 dle_ssh_probes(c
fa60: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 69 6e 74 20 har *zLine, int
fa70: 7a 53 69 7a 65 2c 20 63 68 61 72 20 2a 7a 2c 20 zSize, char *z,
fa80: 63 68 61 72 20 2a 7a 54 6f 6b 65 6e 29 7b 0a 20 char *zToken){.
fa90: 20 2f 2a 20 53 74 61 72 74 20 6c 6f 6f 6b 69 6e /* Start lookin
faa0: 67 20 66 6f 72 20 70 72 6f 62 65 73 20 2a 2f 0a g for probes */.
fab0: 20 20 61 73 73 65 72 74 28 20 21 67 2e 68 74 74 assert( !g.htt
fac0: 70 55 73 65 53 53 4c 20 29 3b 0a 20 20 77 68 69 pUseSSL );. whi
fad0: 6c 65 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d le( fossil_strcm
fae0: 70 28 7a 54 6f 6b 65 6e 2c 20 22 65 63 68 6f 22 p(zToken, "echo"
faf0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 54 6f 6b )==0 ){. zTok
fb00: 65 6e 20 3d 20 65 78 74 72 61 63 74 5f 74 6f 6b en = extract_tok
fb10: 65 6e 28 7a 2c 20 26 7a 29 3b 0a 20 20 20 20 69 en(z, &z);. i
fb20: 66 28 20 7a 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a f( zToken==0 ){.
fb30: 20 20 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f malformed_
fb40: 72 65 71 75 65 73 74 28 22 6d 61 6c 66 6f 72 6d request("malform
fb50: 65 64 20 70 72 6f 62 65 22 29 3b 0a 20 20 20 20 ed probe");.
fb60: 7d 0a 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c }. if( fossil
fb70: 5f 73 74 72 6e 63 6d 70 28 7a 54 6f 6b 65 6e 2c _strncmp(zToken,
fb80: 20 22 74 65 73 74 22 2c 20 34 29 3d 3d 30 20 7c "test", 4)==0 |
fb90: 7c 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c |. fossil
fba0: 5f 73 74 72 6e 63 6d 70 28 7a 54 6f 6b 65 6e 2c _strncmp(zToken,
fbb0: 20 22 70 72 6f 62 65 2d 22 2c 20 36 29 3d 3d 30 "probe-", 6)==0
fbc0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 ){. fprint
fbd0: 66 28 67 2e 68 74 74 70 4f 75 74 2c 20 22 25 73 f(g.httpOut, "%s
fbe0: 5c 6e 22 2c 20 7a 54 6f 6b 65 6e 29 3b 0a 20 20 \n", zToken);.
fbf0: 20 20 20 20 66 66 6c 75 73 68 28 67 2e 68 74 74 fflush(g.htt
fc00: 70 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 pOut);. }else
fc10: 7b 0a 20 20 20 20 20 20 6d 61 6c 66 6f 72 6d 65 {. malforme
fc20: 64 5f 72 65 71 75 65 73 74 28 22 6d 61 6c 66 6f d_request("malfo
fc30: 72 6d 65 64 20 70 72 6f 62 65 22 29 3b 0a 20 20 rmed probe");.
fc40: 20 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 }. if( fget
fc50: 73 28 7a 4c 69 6e 65 2c 20 7a 53 69 7a 65 2c 20 s(zLine, zSize,
fc60: 67 2e 68 74 74 70 49 6e 29 3d 3d 30 20 29 7b 0a g.httpIn)==0 ){.
fc70: 20 20 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f malformed_
fc80: 72 65 71 75 65 73 74 28 22 6d 61 6c 66 6f 72 6d request("malform
fc90: 65 64 20 70 72 6f 62 65 22 29 3b 0a 20 20 20 20 ed probe");.
fca0: 7d 0a 20 20 20 20 63 67 69 5f 74 72 61 63 65 28 }. cgi_trace(
fcb0: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a 54 6f 6b zLine);. zTok
fcc0: 65 6e 20 3d 20 65 78 74 72 61 63 74 5f 74 6f 6b en = extract_tok
fcd0: 65 6e 28 7a 4c 69 6e 65 2c 20 26 7a 29 3b 0a 20 en(zLine, &z);.
fce0: 20 20 20 69 66 28 20 7a 54 6f 6b 65 6e 3d 3d 30 if( zToken==0
fcf0: 20 29 7b 0a 20 20 20 20 20 20 6d 61 6c 66 6f 72 ){. malfor
fd00: 6d 65 64 5f 72 65 71 75 65 73 74 28 22 6d 61 6c med_request("mal
fd10: 66 6f 72 6d 65 64 20 70 72 6f 62 65 22 29 3b 0a formed probe");.
fd20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 }. }.. /*
fd30: 47 6f 74 20 61 6c 6c 20 70 72 6f 62 65 73 20 6e Got all probes n
fd40: 6f 77 20 66 69 72 73 74 20 74 72 61 6e 73 70 6f ow first transpo
fd50: 72 74 5f 6f 70 65 6e 20 69 73 20 63 6f 6d 70 6c rt_open is compl
fd60: 65 74 65 64 0a 20 20 2a 2a 20 73 6f 20 72 65 74 eted. ** so ret
fd70: 75 72 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 urn the command
fd80: 74 68 61 74 20 77 61 73 20 72 65 71 75 65 73 74 that was request
fd90: 65 64 0a 20 20 2a 2f 0a 20 20 67 2e 66 53 73 68 ed. */. g.fSsh
fda0: 43 6c 69 65 6e 74 20 7c 3d 20 43 47 49 5f 53 53 Client |= CGI_SS
fdb0: 48 5f 43 4f 4d 50 41 54 3b 0a 20 20 72 65 74 75 H_COMPAT;. retu
fdc0: 72 6e 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 rn fossil_strdup
fdd0: 28 7a 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a (zToken);.}../*.
fde0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
fdf0: 68 61 6e 64 6c 65 73 20 74 68 65 20 6f 6c 64 20 handles the old
fe00: 66 6f 73 73 69 6c 20 53 53 48 20 74 72 61 6e 73 fossil SSH trans
fe10: 70 6f 72 74 5f 66 6c 69 70 0a 2a 2a 20 61 6e 64 port_flip.** and
fe20: 20 74 72 61 6e 73 70 6f 72 74 5f 6f 70 65 6e 20 transport_open
fe30: 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 73 20 69 communications i
fe40: 66 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 76 f detected..*/.v
fe50: 6f 69 64 20 63 67 69 5f 68 61 6e 64 6c 65 5f 73 oid cgi_handle_s
fe60: 73 68 5f 74 72 61 6e 73 70 6f 72 74 28 63 6f 6e sh_transport(con
fe70: 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 29 7b 0a st char *zCmd){.
fe80: 20 20 63 68 61 72 20 2a 7a 2c 20 2a 7a 54 6f 6b char *z, *zTok
fe90: 65 6e 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 en;. char zLine
fea0: 5b 32 30 30 30 5d 3b 20 20 20 20 20 2f 2a 20 41 [2000]; /* A
feb0: 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 single line of
fec0: 69 6e 70 75 74 2e 20 2a 2f 0a 0a 20 20 61 73 73 input. */.. ass
fed0: 65 72 74 28 20 21 67 2e 68 74 74 70 55 73 65 53 ert( !g.httpUseS
fee0: 53 4c 20 29 3b 0a 20 20 2f 2a 20 6c 6f 6f 6b 20 SL );. /* look
fef0: 66 6f 72 20 73 65 63 6f 6e 64 20 6e 65 77 6c 69 for second newli
ff00: 6e 65 20 6f 66 20 74 72 61 6e 73 70 6f 72 74 5f ne of transport_
ff10: 66 6c 69 70 20 2a 2f 0a 20 20 69 66 28 20 66 67 flip */. if( fg
ff20: 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f ets(zLine, sizeo
ff30: 66 28 7a 4c 69 6e 65 29 2c 67 2e 68 74 74 70 49 f(zLine),g.httpI
ff40: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 61 6c n)==0 ){. mal
ff50: 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 74 28 22 formed_request("
ff60: 69 6e 63 6f 72 72 65 63 74 20 74 72 61 6e 73 70 incorrect transp
ff70: 6f 72 74 5f 66 6c 69 70 22 29 3b 0a 20 20 7d 0a ort_flip");. }.
ff80: 20 20 63 67 69 5f 74 72 61 63 65 28 7a 4c 69 6e cgi_trace(zLin
ff90: 65 29 3b 0a 20 20 7a 54 6f 6b 65 6e 20 3d 20 65 e);. zToken = e
ffa0: 78 74 72 61 63 74 5f 74 6f 6b 65 6e 28 7a 4c 69 xtract_token(zLi
ffb0: 6e 65 2c 20 26 7a 29 3b 0a 20 20 69 66 28 20 7a ne, &z);. if( z
ffc0: 54 6f 6b 65 6e 20 26 26 20 73 74 72 6c 65 6e 28 Token && strlen(
ffd0: 7a 54 6f 6b 65 6e 29 3d 3d 30 20 29 7b 0a 20 20 zToken)==0 ){.
ffe0: 20 20 2f 2a 20 6c 6f 6f 6b 20 66 6f 72 20 70 61 /* look for pa
fff0: 74 68 20 74 6f 20 66 6f 73 73 69 6c 20 2a 2f 0a th to fossil */.
10000 20 20 20 20 69 66 28 20 66 67 65 74 73 28 7a 4c if( fgets(zL
10010 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e ine, sizeof(zLin
10020 65 29 2c 67 2e 68 74 74 70 49 6e 29 3d 3d 30 20 e),g.httpIn)==0
10030 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d ){. if( zCm
10040 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 d==0 ){.
10050 6d 61 6c 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 malformed_reques
10060 74 28 22 6d 69 73 73 69 6e 67 20 66 6f 73 73 69 t("missing fossi
10070 6c 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 20 20 20 l command");.
10080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
10090 20 20 2f 2a 20 6e 6f 20 6e 65 77 20 63 6f 6d 6d /* no new comm
100a0 61 6e 64 20 73 6f 20 65 78 69 74 20 2a 2f 0a 20 and so exit */.
100b0 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 65 78 fossil_ex
100c0 69 74 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 it(0);. }.
100d0 20 20 20 7d 0a 20 20 20 20 63 67 69 5f 74 72 61 }. cgi_tra
100e0 63 65 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 7a ce(zLine);. z
100f0 54 6f 6b 65 6e 20 3d 20 65 78 74 72 61 63 74 5f Token = extract_
10100 74 6f 6b 65 6e 28 7a 4c 69 6e 65 2c 20 26 7a 29 token(zLine, &z)
10110 3b 0a 20 20 20 20 69 66 28 20 7a 54 6f 6b 65 6e ;. if( zToken
10120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 6c ==0 ){. mal
10130 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 74 28 22 formed_request("
10140 6d 61 6c 66 6f 72 6d 65 64 20 66 6f 73 73 69 6c malformed fossil
10150 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 20 20 20 20 command");.
10160 7d 0a 20 20 20 20 2f 2a 20 73 65 65 20 69 66 20 }. /* see if
10170 77 65 27 76 65 20 73 65 65 6e 20 74 68 65 20 63 we've seen the c
10180 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
10190 28 20 7a 43 6d 64 20 26 26 20 7a 43 6d 64 5b 30 ( zCmd && zCmd[0
101a0 5d 20 26 26 20 66 6f 73 73 69 6c 5f 73 74 72 63 ] && fossil_strc
101b0 6d 70 28 7a 54 6f 6b 65 6e 2c 20 7a 43 6d 64 29 mp(zToken, zCmd)
101c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 ==0 ){. ret
101d0 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a urn;. }else{.
101e0 20 20 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f malformed_
101f0 72 65 71 75 65 73 74 28 22 74 72 61 6e 73 70 6f request("transpo
10200 72 74 5f 6f 70 65 6e 20 66 61 69 6c 65 64 22 29 rt_open failed")
10210 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b ;. }. }else{
10220 0a 20 20 20 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 . malformed_r
10230 65 71 75 65 73 74 28 22 74 72 61 6e 73 70 6f 72 equest("transpor
10240 74 5f 66 6c 69 70 20 66 61 69 6c 65 64 22 29 3b t_flip failed");
10250 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 . }.}../*.** Th
10260 69 73 20 72 6f 75 74 69 6e 65 20 68 61 6e 64 6c is routine handl
10270 65 73 20 61 20 73 69 6e 67 6c 65 20 53 43 47 49 es a single SCGI
10280 20 72 65 71 75 65 73 74 20 77 68 69 63 68 20 69 request which i
10290 73 20 63 6f 6d 69 6e 67 20 69 6e 20 6f 6e 0a 2a s coming in on.*
102a0 2a 20 67 2e 68 74 74 70 49 6e 20 61 6e 64 20 77 * g.httpIn and w
102b0 68 69 63 68 20 72 65 70 6c 69 65 73 20 6f 6e 20 hich replies on
102c0 67 2e 68 74 74 70 4f 75 74 0a 2a 2a 0a 2a 2a 20 g.httpOut.**.**
102d0 54 68 65 20 53 43 47 49 20 72 65 71 75 65 73 74 The SCGI request
102e0 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 67 2e is read from g.
102f0 68 74 74 70 49 6e 20 61 6e 64 20 69 73 20 75 73 httpIn and is us
10300 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 ed to initialize
10310 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74 .** entries in t
10320 68 65 20 63 67 69 5f 70 61 72 61 6d 65 74 65 72 he cgi_parameter
10330 28 29 20 68 61 73 68 2c 20 61 73 20 69 66 20 74 () hash, as if t
10340 68 6f 73 65 20 65 6e 74 72 69 65 73 20 77 65 72 hose entries wer
10350 65 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 e.** environment
10360 20 76 61 72 69 61 62 6c 65 73 2e 20 20 41 20 63 variables. A c
10370 61 6c 6c 20 74 6f 20 63 67 69 5f 69 6e 69 74 28 all to cgi_init(
10380 29 20 63 6f 6d 70 6c 65 74 65 73 0a 2a 2a 20 74 ) completes.** t
10390 68 65 20 73 65 74 75 70 2e 20 20 4f 6e 63 65 20 he setup. Once
103a0 61 6c 6c 20 74 68 65 20 73 65 74 75 70 20 69 73 all the setup is
103b0 20 66 69 6e 69 73 68 65 64 2c 20 74 68 69 73 20 finished, this
103c0 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e procedure return
103d0 73 0a 2a 2a 20 61 6e 64 20 73 75 62 73 65 71 75 s.** and subsequ
103e0 65 6e 74 20 63 6f 64 65 20 68 61 6e 64 6c 65 73 ent code handles
103f0 20 74 68 65 20 61 63 74 75 61 6c 20 67 65 6e 65 the actual gene
10400 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 77 65 ration of the we
10410 62 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 63 bpage..*/.void c
10420 67 69 5f 68 61 6e 64 6c 65 5f 73 63 67 69 5f 72 gi_handle_scgi_r
10430 65 71 75 65 73 74 28 76 6f 69 64 29 7b 0a 20 20 equest(void){.
10440 63 68 61 72 20 2a 7a 48 64 72 3b 0a 20 20 63 68 char *zHdr;. ch
10450 61 72 20 2a 7a 54 6f 46 72 65 65 3b 0a 20 20 69 ar *zToFree;. i
10460 6e 74 20 6e 48 64 72 20 3d 20 30 3b 0a 20 20 69 nt nHdr = 0;. i
10470 6e 74 20 6e 52 65 61 64 3b 0a 20 20 69 6e 74 20 nt nRead;. int
10480 63 2c 20 6e 2c 20 6d 3b 0a 0a 20 20 61 73 73 65 c, n, m;.. asse
10490 72 74 28 20 21 67 2e 68 74 74 70 55 73 65 53 53 rt( !g.httpUseSS
104a0 4c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 L );. while( (c
104b0 20 3d 20 66 67 65 74 63 28 67 2e 68 74 74 70 49 = fgetc(g.httpI
104c0 6e 29 29 21 3d 45 4f 46 20 26 26 20 66 6f 73 73 n))!=EOF && foss
104d0 69 6c 5f 69 73 64 69 67 69 74 28 28 63 68 61 72 il_isdigit((char
104e0 29 63 29 20 29 7b 0a 20 20 20 20 6e 48 64 72 20 )c) ){. nHdr
104f0 3d 20 6e 48 64 72 2a 31 30 20 2b 20 28 63 68 61 = nHdr*10 + (cha
10500 72 29 63 20 2d 20 27 30 27 3b 0a 20 20 7d 0a 20 r)c - '0';. }.
10510 20 69 66 28 20 6e 48 64 72 3c 31 36 20 29 20 6d if( nHdr<16 ) m
10520 61 6c 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 74 alformed_request
10530 28 22 53 43 47 49 20 68 65 61 64 65 72 20 74 6f ("SCGI header to
10540 6f 20 73 68 6f 72 74 22 29 3b 0a 20 20 7a 54 6f o short");. zTo
10550 46 72 65 65 20 3d 20 7a 48 64 72 20 3d 20 66 6f Free = zHdr = fo
10560 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 6e 48 64 72 ssil_malloc(nHdr
10570 29 3b 0a 20 20 6e 52 65 61 64 20 3d 20 28 69 6e );. nRead = (in
10580 74 29 66 72 65 61 64 28 7a 48 64 72 2c 20 31 2c t)fread(zHdr, 1,
10590 20 6e 48 64 72 2c 20 67 2e 68 74 74 70 49 6e 29 nHdr, g.httpIn)
105a0 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 6e 48 ;. if( nRead<nH
105b0 64 72 20 29 20 6d 61 6c 66 6f 72 6d 65 64 5f 72 dr ) malformed_r
105c0 65 71 75 65 73 74 28 22 63 61 6e 6e 6f 74 20 72 equest("cannot r
105d0 65 61 64 20 65 6e 74 69 72 65 20 53 43 47 49 20 ead entire SCGI
105e0 68 65 61 64 65 72 22 29 3b 0a 20 20 6e 48 64 72 header");. nHdr
105f0 20 3d 20 6e 52 65 61 64 3b 0a 20 20 77 68 69 6c = nRead;. whil
10600 65 28 20 6e 48 64 72 20 29 7b 0a 20 20 20 20 66 e( nHdr ){. f
10610 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 48 64 72 20 26 or(n=0; n<nHdr &
10620 26 20 7a 48 64 72 5b 6e 5d 3b 20 6e 2b 2b 29 7b & zHdr[n]; n++){
10630 7d 0a 20 20 20 20 66 6f 72 28 6d 3d 6e 2b 31 3b }. for(m=n+1;
10640 20 6d 3c 6e 48 64 72 20 26 26 20 7a 48 64 72 5b m<nHdr && zHdr[
10650 6d 5d 3b 20 6d 2b 2b 29 7b 7d 0a 20 20 20 20 69 m]; m++){}. i
10660 66 28 20 6d 3e 3d 6e 48 64 72 20 29 20 6d 61 6c f( m>=nHdr ) mal
10670 66 6f 72 6d 65 64 5f 72 65 71 75 65 73 74 28 22 formed_request("
10680 53 43 47 49 20 68 65 61 64 65 72 20 66 6f 72 6d SCGI header form
10690 61 74 74 69 6e 67 20 65 72 72 6f 72 22 29 3b 0a atting error");.
106a0 20 20 20 20 63 67 69 5f 73 65 74 5f 70 61 72 61 cgi_set_para
106b0 6d 65 74 65 72 28 7a 48 64 72 2c 20 7a 48 64 72 meter(zHdr, zHdr
106c0 2b 6e 2b 31 29 3b 0a 20 20 20 20 7a 48 64 72 20 +n+1);. zHdr
106d0 2b 3d 20 6d 2b 31 3b 0a 20 20 20 20 6e 48 64 72 += m+1;. nHdr
106e0 20 2d 3d 20 6d 2b 31 3b 0a 20 20 7d 0a 20 20 66 -= m+1;. }. f
106f0 6f 73 73 69 6c 5f 66 72 65 65 28 7a 54 6f 46 72 ossil_free(zToFr
10700 65 65 29 3b 0a 20 20 66 67 65 74 63 28 67 2e 68 ee);. fgetc(g.h
10710 74 74 70 49 6e 29 3b 20 20 2f 2a 20 52 65 61 64 ttpIn); /* Read
10720 20 70 61 73 74 20 74 68 65 20 22 2c 22 20 73 65 past the "," se
10730 70 61 72 61 74 69 6e 67 20 68 65 61 64 65 72 20 parating header
10740 66 72 6f 6d 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a from content */.
10750 20 20 63 67 69 5f 69 6e 69 74 28 29 3b 0a 7d 0a cgi_init();.}.
10760 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a ..#if INTERFACE.
10770 2f 2a 0a 2a 2a 20 42 69 74 6d 61 70 20 76 61 6c /*.** Bitmap val
10780 75 65 73 20 66 6f 72 20 74 68 65 20 66 6c 61 67 ues for the flag
10790 73 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 63 s parameter to c
107a0 67 69 5f 68 74 74 70 5f 73 65 72 76 65 72 28 29 gi_http_server()
107b0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 48 54 54 ..*/.#define HTT
107c0 50 5f 53 45 52 56 45 52 5f 4c 4f 43 41 4c 48 4f P_SERVER_LOCALHO
107d0 53 54 20 20 20 20 20 20 30 78 30 30 30 31 20 20 ST 0x0001
107e0 20 20 20 2f 2a 20 42 69 6e 64 20 74 6f 20 31 32 /* Bind to 12
107f0 37 2e 30 2e 30 2e 31 20 6f 6e 6c 79 20 2a 2f 0a 7.0.0.1 only */.
10800 23 64 65 66 69 6e 65 20 48 54 54 50 5f 53 45 52 #define HTTP_SER
10810 56 45 52 5f 53 43 47 49 20 20 20 20 20 20 20 20 VER_SCGI
10820 20 20 20 30 78 30 30 30 32 20 20 20 20 20 2f 2a 0x0002 /*
10830 20 53 43 47 49 20 69 6e 73 74 65 61 64 20 6f 66 SCGI instead of
10840 20 48 54 54 50 20 2a 2f 0a 23 64 65 66 69 6e 65 HTTP */.#define
10850 20 48 54 54 50 5f 53 45 52 56 45 52 5f 48 41 44 HTTP_SERVER_HAD
10860 5f 52 45 50 4f 53 49 54 4f 52 59 20 30 78 30 30 _REPOSITORY 0x00
10870 30 34 20 20 20 20 20 2f 2a 20 57 61 73 20 74 68 04 /* Was th
10880 65 20 72 65 70 6f 73 69 74 6f 72 79 20 6f 70 65 e repository ope
10890 6e 3f 20 2a 2f 0a 23 64 65 66 69 6e 65 20 48 54 n? */.#define HT
108a0 54 50 5f 53 45 52 56 45 52 5f 48 41 44 5f 43 48 TP_SERVER_HAD_CH
108b0 45 43 4b 4f 55 54 20 20 20 30 78 30 30 30 38 20 ECKOUT 0x0008
108c0 20 20 20 20 2f 2a 20 57 61 73 20 61 20 63 68 65 /* Was a che
108d0 63 6b 6f 75 74 20 6f 70 65 6e 3f 20 2a 2f 0a 23 ckout open? */.#
108e0 64 65 66 69 6e 65 20 48 54 54 50 5f 53 45 52 56 define HTTP_SERV
108f0 45 52 5f 52 45 50 4f 4c 49 53 54 20 20 20 20 20 ER_REPOLIST
10900 20 20 30 78 30 30 31 30 20 20 20 20 20 2f 2a 20 0x0010 /*
10910 41 6c 6c 6f 77 20 72 65 70 6f 20 6c 69 73 74 69 Allow repo listi
10920 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 48 54 ng */.#define HT
10930 54 50 5f 53 45 52 56 45 52 5f 4e 4f 46 4f 52 4b TP_SERVER_NOFORK
10940 20 20 20 20 20 20 20 20 20 30 78 30 30 32 30 20 0x0020
10950 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 63 61 /* Do not ca
10960 6c 6c 20 66 6f 72 6b 28 29 20 2a 2f 0a 0a 23 65 ll fork() */..#e
10970 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 43 ndif /* INTERFAC
10980 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 E */../*.** Maxi
10990 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 mum number of ch
109a0 69 6c 64 20 70 72 6f 63 65 73 73 65 73 20 74 68 ild processes th
109b0 61 74 20 77 65 20 63 61 6e 20 68 61 76 65 20 72 at we can have r
109c0 75 6e 6e 69 6e 67 0a 2a 2a 20 61 74 20 6f 6e 65 unning.** at one
109d0 20 74 69 6d 65 2e 20 20 53 65 74 20 74 68 69 73 time. Set this
109e0 20 74 6f 20 30 20 66 6f 72 20 22 6e 6f 20 6c 69 to 0 for "no li
109f0 6d 69 74 22 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 mit"..*/.#ifndef
10a00 20 46 4f 53 53 49 4c 5f 4d 41 58 5f 43 4f 4e 4e FOSSIL_MAX_CONN
10a10 45 43 54 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 ECTIONS.# define
10a20 20 46 4f 53 53 49 4c 5f 4d 41 58 5f 43 4f 4e 4e FOSSIL_MAX_CONN
10a30 45 43 54 49 4f 4e 53 20 31 30 30 30 0a 23 65 6e ECTIONS 1000.#en
10a40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 dif../*.** Imple
10a50 6d 65 6e 74 20 61 6e 20 48 54 54 50 20 73 65 72 ment an HTTP ser
10a60 76 65 72 20 64 61 65 6d 6f 6e 20 6c 69 73 74 65 ver daemon liste
10a70 6e 69 6e 67 20 6f 6e 20 70 6f 72 74 20 69 50 6f ning on port iPo
10a80 72 74 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 6e 65 77 rt..**.** As new
10a90 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 72 connections arr
10aa0 69 76 65 2c 20 66 6f 72 6b 20 61 20 63 68 69 6c ive, fork a chil
10ab0 64 20 61 6e 64 20 6c 65 74 20 63 68 69 6c 64 20 d and let child
10ac0 72 65 74 75 72 6e 0a 2a 2a 20 6f 75 74 20 6f 66 return.** out of
10ad0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 this procedure
10ae0 63 61 6c 6c 2e 20 20 54 68 65 20 63 68 69 6c 64 call. The child
10af0 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 74 68 65 will handle the
10b00 20 72 65 71 75 65 73 74 2e 0a 2a 2a 20 54 68 65 request..** The
10b10 20 70 61 72 65 6e 74 20 6e 65 76 65 72 20 72 65 parent never re
10b20 74 75 72 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 turns from this
10b30 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2a 0a 2a 2a procedure..**.**
10b40 20 52 65 74 75 72 6e 20 30 20 74 6f 20 65 61 63 Return 0 to eac
10b50 68 20 63 68 69 6c 64 20 61 73 20 69 74 20 72 75 h child as it ru
10b60 6e 73 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 ns. If unable t
10b70 6f 20 65 73 74 61 62 6c 69 73 68 20 61 0a 2a 2a o establish a.**
10b80 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 listening socke
10b90 74 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 t, return non-ze
10ba0 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f 68 ro..*/.int cgi_h
10bb0 74 74 70 5f 73 65 72 76 65 72 28 0a 20 20 69 6e ttp_server(. in
10bc0 74 20 6d 6e 50 6f 72 74 2c 20 69 6e 74 20 6d 78 t mnPort, int mx
10bd0 50 6f 72 74 2c 20 20 20 2f 2a 20 52 61 6e 67 65 Port, /* Range
10be0 20 6f 66 20 54 43 50 20 70 6f 72 74 73 20 74 6f of TCP ports to
10bf0 20 74 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 try */. const
10c00 63 68 61 72 20 2a 7a 42 72 6f 77 73 65 72 2c 20 char *zBrowser,
10c10 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 69 73 20 /* Run this
10c20 62 72 6f 77 73 65 72 2c 20 69 66 20 6e 6f 74 20 browser, if not
10c30 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 NULL */. const
10c40 63 68 61 72 20 2a 7a 49 70 41 64 64 72 2c 20 20 char *zIpAddr,
10c50 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 6f 20 74 /* Bind to t
10c60 68 69 73 20 49 50 20 61 64 64 72 65 73 73 2c 20 his IP address,
10c70 69 66 20 6e 6f 74 20 6e 75 6c 6c 20 2a 2f 0a 20 if not null */.
10c80 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 int flags
10c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 54 /* HT
10ca0 54 50 5f 53 45 52 56 45 52 5f 2a 20 66 6c 61 67 TP_SERVER_* flag
10cb0 73 20 2a 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69 s */.){.#if defi
10cc0 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 2f 2a ned(_WIN32). /*
10cd0 20 55 73 65 20 77 69 6e 33 32 5f 68 74 74 70 5f Use win32_http_
10ce0 73 65 72 76 65 72 28 29 20 69 6e 73 74 65 61 64 server() instead
10cf0 20 2a 2f 0a 20 20 66 6f 73 73 69 6c 5f 65 78 69 */. fossil_exi
10d00 74 28 31 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e t(1);.#else. in
10d10 74 20 6c 69 73 74 65 6e 65 72 20 3d 20 2d 31 3b t listener = -1;
10d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
10d30 65 20 73 65 72 76 65 72 20 73 6f 63 6b 65 74 20 e server socket
10d40 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 6e 65 63 74 */. int connect
10d50 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 ion;
10d60 20 20 2f 2a 20 41 20 73 6f 63 6b 65 74 20 66 6f /* A socket fo
10d70 72 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 r each individua
10d80 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a l connection */.
10d90 20 20 69 6e 74 20 6e 52 65 71 75 65 73 74 20 3d int nRequest =
10da0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 0; /
10db0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 71 75 * Number of requ
10dc0 65 73 74 73 20 68 61 6e 64 6c 65 64 20 73 6f 20 ests handled so
10dd0 66 61 72 20 2a 2f 0a 20 20 66 64 5f 73 65 74 20 far */. fd_set
10de0 72 65 61 64 66 64 73 3b 20 20 20 20 20 20 20 20 readfds;
10df0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 /* Set of
10e00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 file descriptors
10e10 20 66 6f 72 20 73 65 6c 65 63 74 28 29 20 2a 2f for select() */
10e20 0a 20 20 73 6f 63 6b 6c 65 6e 5f 74 20 6c 65 6e . socklen_t len
10e30 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 addr;
10e40 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 /* Length of the
10e50 20 69 6e 61 64 64 72 20 73 74 72 75 63 74 75 72 inaddr structur
10e60 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 69 6c 64 e */. int child
10e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
10e80 20 20 20 20 2f 2a 20 50 49 44 20 6f 66 20 74 68 /* PID of th
10e90 65 20 63 68 69 6c 64 20 70 72 6f 63 65 73 73 20 e child process
10ea0 2a 2f 0a 20 20 69 6e 74 20 6e 63 68 69 6c 64 72 */. int nchildr
10eb0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 en = 0;
10ec0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 /* Number of c
10ed0 68 69 6c 64 20 70 72 6f 63 65 73 73 65 73 20 2a hild processes *
10ee0 2f 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 /. struct timev
10ef0 61 6c 20 64 65 6c 61 79 3b 20 20 20 20 20 20 20 al delay;
10f00 20 2f 2a 20 48 6f 77 20 6c 6f 6e 67 20 74 6f 20 /* How long to
10f10 77 61 69 74 20 69 6e 73 69 64 65 20 73 65 6c 65 wait inside sele
10f20 63 74 28 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 ct() */. struct
10f30 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 69 6e 61 sockaddr_in ina
10f40 64 64 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 6f ddr; /* The so
10f50 63 6b 65 74 20 61 64 64 72 65 73 73 20 2a 2f 0a cket address */.
10f60 20 20 69 6e 74 20 6f 70 74 20 3d 20 31 3b 20 20 int opt = 1;
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
10f80 2a 20 73 65 74 73 6f 63 6b 6f 70 74 20 66 6c 61 * setsockopt fla
10f90 67 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 72 74 g */. int iPort
10fa0 20 3d 20 6d 6e 50 6f 72 74 3b 0a 0a 20 20 77 68 = mnPort;.. wh
10fb0 69 6c 65 28 20 69 50 6f 72 74 3c 3d 6d 78 50 6f ile( iPort<=mxPo
10fc0 72 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 rt ){. memset
10fd0 28 26 69 6e 61 64 64 72 2c 20 30 2c 20 73 69 7a (&inaddr, 0, siz
10fe0 65 6f 66 28 69 6e 61 64 64 72 29 29 3b 0a 20 20 eof(inaddr));.
10ff0 20 20 69 6e 61 64 64 72 2e 73 69 6e 5f 66 61 6d inaddr.sin_fam
11000 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54 3b 0a 20 ily = AF_INET;.
11010 20 20 20 69 66 28 20 7a 49 70 41 64 64 72 20 29 if( zIpAddr )
11020 7b 0a 20 20 20 20 20 20 69 6e 61 64 64 72 2e 73 {. inaddr.s
11030 69 6e 5f 61 64 64 72 2e 73 5f 61 64 64 72 20 3d in_addr.s_addr =
11040 20 69 6e 65 74 5f 61 64 64 72 28 7a 49 70 41 64 inet_addr(zIpAd
11050 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 dr);. if( i
11060 6e 61 64 64 72 2e 73 69 6e 5f 61 64 64 72 2e 73 naddr.sin_addr.s
11070 5f 61 64 64 72 20 3d 3d 20 28 2d 31 29 20 29 7b _addr == (-1) ){
11080 0a 20 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f . fossil_
11090 66 61 74 61 6c 28 22 6e 6f 74 20 61 20 76 61 6c fatal("not a val
110a0 69 64 20 49 50 20 61 64 64 72 65 73 73 3a 20 25 id IP address: %
110b0 73 22 2c 20 7a 49 70 41 64 64 72 29 3b 0a 20 20 s", zIpAddr);.
110c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 }. }else
110d0 69 66 28 20 66 6c 61 67 73 20 26 20 48 54 54 50 if( flags & HTTP
110e0 5f 53 45 52 56 45 52 5f 4c 4f 43 41 4c 48 4f 53 _SERVER_LOCALHOS
110f0 54 20 29 7b 0a 20 20 20 20 20 20 69 6e 61 64 64 T ){. inadd
11100 72 2e 73 69 6e 5f 61 64 64 72 2e 73 5f 61 64 64 r.sin_addr.s_add
11110 72 20 3d 20 68 74 6f 6e 6c 28 49 4e 41 44 44 52 r = htonl(INADDR
11120 5f 4c 4f 4f 50 42 41 43 4b 29 3b 0a 20 20 20 20 _LOOPBACK);.
11130 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 61 }else{. ina
11140 64 64 72 2e 73 69 6e 5f 61 64 64 72 2e 73 5f 61 ddr.sin_addr.s_a
11150 64 64 72 20 3d 20 68 74 6f 6e 6c 28 49 4e 41 44 ddr = htonl(INAD
11160 44 52 5f 41 4e 59 29 3b 0a 20 20 20 20 7d 0a 20 DR_ANY);. }.
11170 20 20 20 69 6e 61 64 64 72 2e 73 69 6e 5f 70 6f inaddr.sin_po
11180 72 74 20 3d 20 68 74 6f 6e 73 28 69 50 6f 72 74 rt = htons(iPort
11190 29 3b 0a 20 20 20 20 6c 69 73 74 65 6e 65 72 20 );. listener
111a0 3d 20 73 6f 63 6b 65 74 28 41 46 5f 49 4e 45 54 = socket(AF_INET
111b0 2c 20 53 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 , SOCK_STREAM, 0
111c0 29 3b 0a 20 20 20 20 69 66 28 20 6c 69 73 74 65 );. if( liste
111d0 6e 65 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 ner<0 ){. i
111e0 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 63 6f Port++;. co
111f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 ntinue;. }..
11200 20 20 20 2f 2a 20 69 66 20 77 65 20 63 61 6e 27 /* if we can'
11210 74 20 74 65 72 6d 69 6e 61 74 65 20 6e 69 63 65 t terminate nice
11220 6c 79 2c 20 61 74 20 6c 65 61 73 74 20 61 6c 6c ly, at least all
11230 6f 77 20 74 68 65 20 73 6f 63 6b 65 74 20 74 6f ow the socket to
11240 20 62 65 20 72 65 75 73 65 64 20 2a 2f 0a 20 20 be reused */.
11250 20 20 73 65 74 73 6f 63 6b 6f 70 74 28 6c 69 73 setsockopt(lis
11260 74 65 6e 65 72 2c 53 4f 4c 5f 53 4f 43 4b 45 54 tener,SOL_SOCKET
11270 2c 53 4f 5f 52 45 55 53 45 41 44 44 52 2c 26 6f ,SO_REUSEADDR,&o
11280 70 74 2c 73 69 7a 65 6f 66 28 6f 70 74 29 29 3b pt,sizeof(opt));
11290 0a 0a 20 20 20 20 69 66 28 20 62 69 6e 64 28 6c .. if( bind(l
112a0 69 73 74 65 6e 65 72 2c 20 28 73 74 72 75 63 74 istener, (struct
112b0 20 73 6f 63 6b 61 64 64 72 2a 29 26 69 6e 61 64 sockaddr*)&inad
112c0 64 72 2c 20 73 69 7a 65 6f 66 28 69 6e 61 64 64 dr, sizeof(inadd
112d0 72 29 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 63 r))<0 ){. c
112e0 6c 6f 73 65 28 6c 69 73 74 65 6e 65 72 29 3b 0a lose(listener);.
112f0 20 20 20 20 20 20 69 50 6f 72 74 2b 2b 3b 0a 20 iPort++;.
11300 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 continue;.
11310 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a }. break;.
11320 20 20 7d 0a 20 20 69 66 28 20 69 50 6f 72 74 3e }. if( iPort>
11330 6d 78 50 6f 72 74 20 29 7b 0a 20 20 20 20 69 66 mxPort ){. if
11340 28 20 6d 6e 50 6f 72 74 3d 3d 6d 78 50 6f 72 74 ( mnPort==mxPort
11350 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c ){. fossil
11360 5f 66 61 74 61 6c 28 22 75 6e 61 62 6c 65 20 74 _fatal("unable t
11370 6f 20 6f 70 65 6e 20 6c 69 73 74 65 6e 69 6e 67 o open listening
11380 20 73 6f 63 6b 65 74 20 6f 6e 20 70 6f 72 74 73 socket on ports
11390 20 25 64 22 2c 20 6d 6e 50 6f 72 74 29 3b 0a 20 %d", mnPort);.
113a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
113b0 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75 6e fossil_fatal("un
113c0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 6c 69 73 able to open lis
113d0 74 65 6e 69 6e 67 20 73 6f 63 6b 65 74 20 6f 6e tening socket on
113e0 20 61 6e 79 22 0a 20 20 20 20 20 20 20 20 20 20 any".
113f0 20 20 20 20 20 20 20 20 20 22 20 70 6f 72 74 20 " port
11400 69 6e 20 74 68 65 20 72 61 6e 67 65 20 25 64 2e in the range %d.
11410 2e 25 64 22 2c 20 6d 6e 50 6f 72 74 2c 20 6d 78 .%d", mnPort, mx
11420 50 6f 72 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d Port);. }. }
11430 0a 20 20 69 66 28 20 69 50 6f 72 74 3e 6d 78 50 . if( iPort>mxP
11440 6f 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a ort ) return 1;.
11450 20 20 6c 69 73 74 65 6e 28 6c 69 73 74 65 6e 65 listen(listene
11460 72 2c 31 30 29 3b 0a 20 20 66 6f 73 73 69 6c 5f r,10);. fossil_
11470 70 72 69 6e 74 28 22 4c 69 73 74 65 6e 69 6e 67 print("Listening
11480 20 66 6f 72 20 25 73 20 72 65 71 75 65 73 74 73 for %s requests
11490 20 6f 6e 20 54 43 50 20 70 6f 72 74 20 25 64 5c on TCP port %d\
114a0 6e 22 2c 0a 20 20 20 20 20 28 66 6c 61 67 73 20 n",. (flags
114b0 26 20 48 54 54 50 5f 53 45 52 56 45 52 5f 53 43 & HTTP_SERVER_SC
114c0 47 49 29 21 3d 30 20 3f 20 22 53 43 47 49 22 20 GI)!=0 ? "SCGI"
114d0 3a 0a 20 20 20 20 20 20 20 20 67 2e 68 74 74 70 :. g.http
114e0 55 73 65 53 53 4c 3f 22 54 4c 53 2d 65 6e 63 72 UseSSL?"TLS-encr
114f0 79 70 74 65 64 20 48 54 54 50 53 22 3a 22 48 54 ypted HTTPS":"HT
11500 54 50 22 2c 20 20 69 50 6f 72 74 29 3b 0a 20 20 TP", iPort);.
11510 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a fflush(stdout);.
11520 20 20 69 66 28 20 7a 42 72 6f 77 73 65 72 20 29 if( zBrowser )
11530 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 {. assert( st
11540 72 73 74 72 28 7a 42 72 6f 77 73 65 72 2c 22 25 rstr(zBrowser,"%
11550 64 22 29 21 3d 30 20 29 3b 0a 20 20 20 20 7a 42 d")!=0 );. zB
11560 72 6f 77 73 65 72 20 3d 20 6d 70 72 69 6e 74 66 rowser = mprintf
11570 28 7a 42 72 6f 77 73 65 72 20 2f 2a 77 6f 72 6b (zBrowser /*work
11580 73 2d 6c 69 6b 65 3a 22 25 64 22 2a 2f 2c 20 69 s-like:"%d"*/, i
11590 50 6f 72 74 29 3b 0a 23 69 66 20 64 65 66 69 6e Port);.#if defin
115a0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 ed(__CYGWIN__).
115b0 20 20 20 2f 2a 20 4f 6e 20 43 79 67 77 69 6e 2c /* On Cygwin,
115c0 20 77 65 20 63 61 6e 20 64 6f 20 62 65 74 74 65 we can do bette
115d0 72 20 74 68 61 6e 20 22 65 63 68 6f 22 20 2a 2f r than "echo" */
115e0 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 . if( strncmp
115f0 28 7a 42 72 6f 77 73 65 72 2c 20 22 65 63 68 6f (zBrowser, "echo
11600 20 22 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 ", 5)==0 ){.
11610 20 20 20 77 63 68 61 72 5f 74 20 2a 77 55 72 6c wchar_t *wUrl
11620 20 3d 20 66 6f 73 73 69 6c 5f 75 74 66 38 5f 74 = fossil_utf8_t
11630 6f 5f 75 6e 69 63 6f 64 65 28 7a 42 72 6f 77 73 o_unicode(zBrows
11640 65 72 2b 35 29 3b 0a 20 20 20 20 20 20 77 55 72 er+5);. wUr
11650 6c 5b 77 63 73 6c 65 6e 28 77 55 72 6c 29 2d 32 l[wcslen(wUrl)-2
11660 5d 20 3d 20 30 3b 20 2f 2a 20 53 74 72 69 70 20 ] = 0; /* Strip
11670 74 65 72 6d 69 6e 61 74 69 6e 67 20 22 20 26 22 terminating " &"
11680 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 73 */. if( (s
11690 69 7a 65 5f 74 29 53 68 65 6c 6c 45 78 65 63 75 ize_t)ShellExecu
116a0 74 65 57 28 30 2c 20 4c 22 6f 70 65 6e 22 2c 20 teW(0, L"open",
116b0 77 55 72 6c 2c 20 30 2c 20 30 2c 20 31 29 3c 33 wUrl, 0, 0, 1)<3
116c0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 73 3 ){. fos
116d0 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 63 61 6e sil_warning("can
116e0 6e 6f 74 20 73 74 61 72 74 20 62 72 6f 77 73 65 not start browse
116f0 72 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 r\n");. }.
11700 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a }else.#endif.
11710 20 20 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 if( fossil_s
11720 79 73 74 65 6d 28 7a 42 72 6f 77 73 65 72 29 3c ystem(zBrowser)<
11730 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 0 ){. fossi
11740 6c 5f 77 61 72 6e 69 6e 67 28 22 63 61 6e 6e 6f l_warning("canno
11750 74 20 73 74 61 72 74 20 62 72 6f 77 73 65 72 3a t start browser:
11760 20 25 73 5c 6e 22 2c 20 7a 42 72 6f 77 73 65 72 %s\n", zBrowser
11770 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 );. }. }. w
11780 68 69 6c 65 28 20 31 20 29 7b 0a 23 69 66 20 46 hile( 1 ){.#if F
11790 4f 53 53 49 4c 5f 4d 41 58 5f 43 4f 4e 4e 45 43 OSSIL_MAX_CONNEC
117a0 54 49 4f 4e 53 3e 30 0a 20 20 20 20 77 68 69 6c TIONS>0. whil
117b0 65 28 20 6e 63 68 69 6c 64 72 65 6e 3e 3d 46 4f e( nchildren>=FO
117c0 53 53 49 4c 5f 4d 41 58 5f 43 4f 4e 4e 45 43 54 SSIL_MAX_CONNECT
117d0 49 4f 4e 53 20 29 7b 0a 20 20 20 20 20 20 69 66 IONS ){. if
117e0 28 20 77 61 69 74 28 30 29 3e 3d 30 20 29 20 6e ( wait(0)>=0 ) n
117f0 63 68 69 6c 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 children--;.
11800 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 6c }.#endif. del
11810 61 79 2e 74 76 5f 73 65 63 20 3d 20 30 3b 0a 20 ay.tv_sec = 0;.
11820 20 20 20 64 65 6c 61 79 2e 74 76 5f 75 73 65 63 delay.tv_usec
11830 20 3d 20 31 30 30 30 30 30 3b 0a 20 20 20 20 46 = 100000;. F
11840 44 5f 5a 45 52 4f 28 26 72 65 61 64 66 64 73 29 D_ZERO(&readfds)
11850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 69 ;. assert( li
11860 73 74 65 6e 65 72 3e 3d 30 20 29 3b 0a 20 20 20 stener>=0 );.
11870 20 46 44 5f 53 45 54 28 20 6c 69 73 74 65 6e 65 FD_SET( listene
11880 72 2c 20 26 72 65 61 64 66 64 73 29 3b 0a 20 20 r, &readfds);.
11890 20 20 73 65 6c 65 63 74 28 20 6c 69 73 74 65 6e select( listen
118a0 65 72 2b 31 2c 20 26 72 65 61 64 66 64 73 2c 20 er+1, &readfds,
118b0 30 2c 20 30 2c 20 26 64 65 6c 61 79 29 3b 0a 20 0, 0, &delay);.
118c0 20 20 20 69 66 28 20 46 44 5f 49 53 53 45 54 28 if( FD_ISSET(
118d0 6c 69 73 74 65 6e 65 72 2c 20 26 72 65 61 64 66 listener, &readf
118e0 64 73 29 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e ds) ){. len
118f0 61 64 64 72 20 3d 20 73 69 7a 65 6f 66 28 69 6e addr = sizeof(in
11900 61 64 64 72 29 3b 0a 20 20 20 20 20 20 63 6f 6e addr);. con
11910 6e 65 63 74 69 6f 6e 20 3d 20 61 63 63 65 70 74 nection = accept
11920 28 6c 69 73 74 65 6e 65 72 2c 20 28 73 74 72 75 (listener, (stru
11930 63 74 20 73 6f 63 6b 61 64 64 72 2a 29 26 69 6e ct sockaddr*)&in
11940 61 64 64 72 2c 20 26 6c 65 6e 61 64 64 72 29 3b addr, &lenaddr);
11950 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6e 6e 65 . if( conne
11960 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 ction>=0 ){.
11970 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 if( flags &
11980 48 54 54 50 5f 53 45 52 56 45 52 5f 4e 4f 46 4f HTTP_SERVER_NOFO
11990 52 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 RK ){.
119a0 63 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 20 child = 0;.
119b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
119c0 20 20 20 20 63 68 69 6c 64 20 3d 20 66 6f 72 6b child = fork
119d0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ();. }.
119e0 20 20 20 20 20 20 69 66 28 20 63 68 69 6c 64 21 if( child!
119f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
11a00 69 66 28 20 63 68 69 6c 64 3e 30 20 29 7b 0a 20 if( child>0 ){.
11a10 20 20 20 20 20 20 20 20 20 20 20 6e 63 68 69 6c nchil
11a20 64 72 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 dren++;.
11a30 20 20 20 20 6e 52 65 71 75 65 73 74 2b 2b 3b 0a nRequest++;.
11a40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
11a50 20 20 20 20 20 20 63 6c 6f 73 65 28 63 6f 6e 6e close(conn
11a60 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 ection);.
11a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
11a80 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 2c 20 int nErr = 0,
11a90 66 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c fd;. cl
11aa0 6f 73 65 28 30 29 3b 0a 20 20 20 20 20 20 20 20 ose(0);.
11ab0 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e 6e 65 fd = dup(conne
11ac0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 ction);.
11ad0 20 20 69 66 28 20 66 64 21 3d 30 20 29 20 6e 45 if( fd!=0 ) nE
11ae0 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 rr++;.
11af0 63 6c 6f 73 65 28 31 29 3b 0a 20 20 20 20 20 20 close(1);.
11b00 20 20 20 20 66 64 20 3d 20 64 75 70 28 63 6f 6e fd = dup(con
11b10 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 nection);.
11b20 20 20 20 20 69 66 28 20 66 64 21 3d 31 20 29 20 if( fd!=1 )
11b30 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 nErr++;.
11b40 20 20 69 66 28 20 30 20 26 26 20 21 67 2e 66 41 if( 0 && !g.fA
11b50 6e 79 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 nyTrace ){.
11b60 20 20 20 20 20 20 20 63 6c 6f 73 65 28 32 29 3b close(2);
11b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64 20 . fd
11b80 3d 20 64 75 70 28 63 6f 6e 6e 65 63 74 69 6f 6e = dup(connection
11b90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 );. i
11ba0 66 28 20 66 64 21 3d 32 20 29 20 6e 45 72 72 2b f( fd!=2 ) nErr+
11bb0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 +;. }.
11bc0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 63 close(c
11bd0 6f 6e 6e 65 63 74 69 6f 6e 29 3b 0a 20 20 20 20 onnection);.
11be0 20 20 20 20 20 20 67 2e 6e 50 65 6e 64 69 6e 67 g.nPending
11bf0 52 65 71 75 65 73 74 20 3d 20 6e 63 68 69 6c 64 Request = nchild
11c00 72 65 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 ren+1;.
11c10 20 67 2e 6e 52 65 71 75 65 73 74 20 3d 20 6e 52 g.nRequest = nR
11c20 65 71 75 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 equest+1;.
11c30 20 20 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b return nErr;
11c40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
11c50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 }. }. /*
11c60 42 75 72 79 20 64 65 61 64 20 63 68 69 6c 64 72 Bury dead childr
11c70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 63 en */. if( nc
11c80 68 69 6c 64 72 65 6e 20 29 7b 0a 20 20 20 20 20 hildren ){.
11c90 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 while(1){.
11ca0 20 20 20 69 6e 74 20 69 53 74 61 74 75 73 20 3d int iStatus =
11cb0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 69 64 5f 0;. pid_
11cc0 74 20 78 20 3d 20 77 61 69 74 70 69 64 28 2d 31 t x = waitpid(-1
11cd0 2c 20 26 69 53 74 61 74 75 73 2c 20 57 4e 4f 48 , &iStatus, WNOH
11ce0 41 4e 47 29 3b 0a 20 20 20 20 20 20 20 20 69 66 ANG);. if
11cf0 28 20 78 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a ( x<=0 ) break;.
11d00 20 20 20 20 20 20 20 20 69 66 28 20 57 49 46 53 if( WIFS
11d10 49 47 4e 41 4c 45 44 28 69 53 74 61 74 75 73 29 IGNALED(iStatus)
11d20 20 26 26 20 67 2e 66 41 6e 79 54 72 61 63 65 20 && g.fAnyTrace
11d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 ){. fpr
11d40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 2f 2a intf(stderr, "/*
11d50 2a 2a 2a 2a 20 43 68 69 6c 64 20 25 64 20 65 78 **** Child %d ex
11d60 69 74 65 64 20 6f 6e 20 73 69 67 6e 61 6c 20 25 ited on signal %
11d70 64 20 28 25 73 29 20 2a 2a 2a 2a 2a 2f 5c 6e 22 d (%s) *****/\n"
11d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
11d90 20 20 20 20 78 2c 20 57 54 45 52 4d 53 49 47 28 x, WTERMSIG(
11da0 69 53 74 61 74 75 73 29 2c 20 73 74 72 73 69 67 iStatus), strsig
11db0 6e 61 6c 28 57 54 45 52 4d 53 49 47 28 69 53 74 nal(WTERMSIG(iSt
11dc0 61 74 75 73 29 29 29 3b 0a 20 20 20 20 20 20 20 atus)));.
11dd0 20 7d 0a 20 20 20 20 20 20 20 20 6e 63 68 69 6c }. nchil
11de0 64 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a dren--;. }.
11df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e }. }. /* N
11e00 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 20 20 OT REACHED */.
11e10 66 6f 73 73 69 6c 5f 65 78 69 74 28 31 29 3b 0a fossil_exit(1);.
11e20 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 4f 54 20 #endif. /* NOT
11e30 52 45 41 43 48 45 44 20 2a 2f 0a 20 20 72 65 74 REACHED */. ret
11e40 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a urn 0;.}.../*.**
11e50 20 4e 61 6d 65 20 6f 66 20 64 61 79 73 20 61 6e Name of days an
11e60 64 20 6d 6f 6e 74 68 73 2e 0a 2a 2f 0a 73 74 61 d months..*/.sta
11e70 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
11e80 63 6f 6e 73 74 20 61 7a 44 61 79 73 5b 5d 20 3d const azDays[] =
11e90 0a 20 20 20 20 7b 22 53 75 6e 22 2c 20 22 4d 6f . {"Sun", "Mo
11ea0 6e 22 2c 20 22 54 75 65 22 2c 20 22 57 65 64 22 n", "Tue", "Wed"
11eb0 2c 20 22 54 68 75 22 2c 20 22 46 72 69 22 2c 20 , "Thu", "Fri",
11ec0 22 53 61 74 22 2c 20 30 7d 3b 0a 73 74 61 74 69 "Sat", 0};.stati
11ed0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f c const char *co
11ee0 6e 73 74 20 61 7a 4d 6f 6e 74 68 73 5b 5d 20 3d nst azMonths[] =
11ef0 0a 20 20 20 20 7b 22 4a 61 6e 22 2c 20 22 46 65 . {"Jan", "Fe
11f00 62 22 2c 20 22 4d 61 72 22 2c 20 22 41 70 72 22 b", "Mar", "Apr"
11f10 2c 20 22 4d 61 79 22 2c 20 22 4a 75 6e 22 2c 0a , "May", "Jun",.
11f20 20 20 20 20 20 22 4a 75 6c 22 2c 20 22 41 75 67 "Jul", "Aug
11f30 22 2c 20 22 53 65 70 22 2c 20 22 4f 63 74 22 2c ", "Sep", "Oct",
11f40 20 22 4e 6f 76 22 2c 20 22 44 65 63 22 2c 20 30 "Nov", "Dec", 0
11f50 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 };.../*.** Retur
11f60 6e 73 20 61 6e 20 52 46 43 38 32 32 2d 66 6f 72 ns an RFC822-for
11f70 6d 61 74 74 65 64 20 74 69 6d 65 20 73 74 72 69 matted time stri
11f80 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 ng suitable for
11f90 48 54 54 50 20 68 65 61 64 65 72 73 2e 0a 2a 2a HTTP headers..**
11fa0 20 54 68 65 20 74 69 6d 65 7a 6f 6e 65 20 69 73 The timezone is
11fb0 20 61 6c 77 61 79 73 20 47 4d 54 2e 20 20 54 68 always GMT. Th
11fc0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 e value returned
11fd0 20 69 73 20 61 6c 77 61 79 73 20 61 0a 2a 2a 20 is always a.**
11fe0 73 74 72 69 6e 67 20 6f 62 74 61 69 6e 65 64 20 string obtained
11ff0 66 72 6f 6d 20 6d 70 72 69 6e 74 66 28 29 20 61 from mprintf() a
12000 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 nd must be freed
12010 20 75 73 69 6e 67 20 66 6f 73 73 69 6c 5f 66 72 using fossil_fr
12020 65 65 28 29 0a 2a 2a 20 74 6f 20 61 76 6f 69 64 ee().** to avoid
12030 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 0a a memory leak..
12040 2a 2a 0a 2a 2a 20 53 65 65 20 68 74 74 70 3a 2f **.** See http:/
12050 2f 77 77 77 2e 66 61 71 73 2e 6f 72 67 2f 72 66 /www.faqs.org/rf
12060 63 73 2f 72 66 63 38 32 32 2e 68 74 6d 6c 2c 20 cs/rfc822.html,
12070 73 65 63 74 69 6f 6e 20 35 0a 2a 2a 20 61 6e 64 section 5.** and
12080 20 68 74 74 70 3a 2f 2f 77 77 77 2e 66 61 71 73 http://www.faqs
12090 2e 6f 72 67 2f 72 66 63 73 2f 72 66 63 32 36 31 .org/rfcs/rfc261
120a0 36 2e 68 74 6d 6c 2c 20 73 65 63 74 69 6f 6e 20 6.html, section
120b0 33 2e 33 2e 0a 2a 2f 0a 63 68 61 72 20 2a 63 67 3.3..*/.char *cg
120c0 69 5f 72 66 63 38 32 32 5f 64 61 74 65 73 74 61 i_rfc822_datesta
120d0 6d 70 28 74 69 6d 65 5f 74 20 6e 6f 77 29 7b 0a mp(time_t now){.
120e0 20 20 73 74 72 75 63 74 20 74 6d 20 2a 70 54 6d struct tm *pTm
120f0 3b 0a 20 20 70 54 6d 20 3d 20 67 6d 74 69 6d 65 ;. pTm = gmtime
12100 28 26 6e 6f 77 29 3b 0a 20 20 69 66 28 20 70 54 (&now);. if( pT
12110 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 m==0 ){. retu
12120 72 6e 20 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a rn mprintf("");.
12130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 }else{. ret
12140 75 72 6e 20 6d 70 72 69 6e 74 66 28 22 25 73 2c urn mprintf("%s,
12150 20 25 64 20 25 73 20 25 30 32 64 20 25 30 32 64 %d %s %02d %02d
12160 3a 25 30 32 64 3a 25 30 32 64 20 2b 30 30 30 30 :%02d:%02d +0000
12170 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
12180 20 20 20 20 20 20 61 7a 44 61 79 73 5b 70 54 6d azDays[pTm
12190 2d 3e 74 6d 5f 77 64 61 79 5d 2c 20 70 54 6d 2d ->tm_wday], pTm-
121a0 3e 74 6d 5f 6d 64 61 79 2c 20 61 7a 4d 6f 6e 74 >tm_mday, azMont
121b0 68 73 5b 70 54 6d 2d 3e 74 6d 5f 6d 6f 6e 5d 2c hs[pTm->tm_mon],
121c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
121d0 20 20 20 20 70 54 6d 2d 3e 74 6d 5f 79 65 61 72 pTm->tm_year
121e0 2b 31 39 30 30 2c 20 70 54 6d 2d 3e 74 6d 5f 68 +1900, pTm->tm_h
121f0 6f 75 72 2c 20 70 54 6d 2d 3e 74 6d 5f 6d 69 6e our, pTm->tm_min
12200 2c 20 70 54 6d 2d 3e 74 6d 5f 73 65 63 29 3b 0a , pTm->tm_sec);.
12210 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 }.}../*.** Ret
12220 75 72 6e 73 20 61 6e 20 49 53 4f 38 36 30 31 2d urns an ISO8601-
12230 66 6f 72 6d 61 74 74 65 64 20 74 69 6d 65 20 73 formatted time s
12240 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 tring suitable f
12250 6f 72 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 or debugging.**
12260 70 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 purposes..**.**
12270 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e The value return
12280 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 73 ed is always a s
12290 74 72 69 6e 67 20 6f 62 74 61 69 6e 65 64 20 66 tring obtained f
122a0 72 6f 6d 20 6d 70 72 69 6e 74 66 28 29 20 61 6e rom mprintf() an
122b0 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 66 72 65 d must.** be fre
122c0 65 64 20 75 73 69 6e 67 20 66 6f 73 73 69 6c 5f ed using fossil_
122d0 66 72 65 65 28 29 20 74 6f 20 61 76 6f 69 64 20 free() to avoid
122e0 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 0a 2a a memory leak..*
122f0 2f 0a 63 68 61 72 20 2a 63 67 69 5f 69 73 6f 38 /.char *cgi_iso8
12300 36 30 31 5f 64 61 74 65 73 74 61 6d 70 28 76 6f 601_datestamp(vo
12310 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20 74 6d id){. struct tm
12320 20 2a 70 54 6d 3b 0a 20 20 74 69 6d 65 5f 74 20 *pTm;. time_t
12330 6e 6f 77 20 3d 20 74 69 6d 65 28 30 29 3b 0a 20 now = time(0);.
12340 20 70 54 6d 20 3d 20 67 6d 74 69 6d 65 28 26 6e pTm = gmtime(&n
12350 6f 77 29 3b 0a 20 20 69 66 28 20 70 54 6d 3d 3d ow);. if( pTm==
12360 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 0 ){. return
12370 6d 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 7d mprintf("");. }
12380 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e else{. return
12390 20 6d 70 72 69 6e 74 66 28 22 25 30 34 64 2d 25 mprintf("%04d-%
123a0 30 32 64 2d 25 30 32 64 20 25 30 32 64 3a 25 30 02d-%02d %02d:%0
123b0 32 64 3a 25 30 32 64 22 2c 0a 20 20 20 20 20 20 2d:%02d",.
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6d pTm
123d0 2d 3e 74 6d 5f 79 65 61 72 2b 31 39 30 30 2c 20 ->tm_year+1900,
123e0 70 54 6d 2d 3e 74 6d 5f 6d 6f 6e 2b 31 2c 20 70 pTm->tm_mon+1, p
123f0 54 6d 2d 3e 74 6d 5f 6d 64 61 79 2c 0a 20 20 20 Tm->tm_mday,.
12400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12410 70 54 6d 2d 3e 74 6d 5f 68 6f 75 72 2c 20 70 54 pTm->tm_hour, pT
12420 6d 2d 3e 74 6d 5f 6d 69 6e 2c 20 70 54 6d 2d 3e m->tm_min, pTm->
12430 74 6d 5f 73 65 63 29 3b 0a 20 20 7d 0a 7d 0a 0a tm_sec);. }.}..
12440 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 /*.** COMMAND: t
12450 65 73 74 2d 64 61 74 65 0a 2a 2a 0a 2a 2a 20 53 est-date.**.** S
12460 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 how the current
12470 64 61 74 65 20 61 6e 64 20 74 69 6d 65 20 69 6e date and time in
12480 20 62 6f 74 68 20 52 46 43 38 32 32 20 61 6e 64 both RFC822 and
12490 20 49 53 4f 38 36 30 31 2e 0a 2a 2f 0a 76 6f 69 ISO8601..*/.voi
124a0 64 20 74 65 73 74 5f 64 61 74 65 28 76 6f 69 64 d test_date(void
124b0 29 7b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e ){. fossil_prin
124c0 74 28 22 25 7a 20 3d 20 22 2c 20 63 67 69 5f 69 t("%z = ", cgi_i
124d0 73 6f 38 36 30 31 5f 64 61 74 65 73 74 61 6d 70 so8601_datestamp
124e0 28 29 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 ());. fossil_pr
124f0 69 6e 74 28 22 25 7a 5c 6e 22 2c 20 63 67 69 5f int("%z\n", cgi_
12500 72 66 63 38 32 32 5f 64 61 74 65 73 74 61 6d 70 rfc822_datestamp
12510 28 74 69 6d 65 28 30 29 29 29 3b 0a 7d 0a 0a 2f (time(0)));.}../
12520 2a 0a 2a 2a 20 50 61 72 73 65 20 61 6e 20 52 46 *.** Parse an RF
12530 43 38 32 32 2d 66 6f 72 6d 61 74 74 65 64 20 74 C822-formatted t
12540 69 6d 65 73 74 61 6d 70 20 61 73 20 77 65 27 64 imestamp as we'd
12550 20 65 78 70 65 63 74 20 66 72 6f 6d 20 48 54 54 expect from HTT
12560 50 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 P and return.**
12570 61 20 55 6e 69 78 20 65 70 6f 63 68 20 74 69 6d a Unix epoch tim
12580 65 2e 20 3c 3d 20 7a 65 72 6f 20 69 73 20 72 65 e. <= zero is re
12590 74 75 72 6e 65 64 20 6f 6e 20 66 61 69 6c 75 72 turned on failur
125a0 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 e..**.** Note th
125b0 61 74 20 74 68 69 73 20 77 6f 6e 27 74 20 68 61 at this won't ha
125c0 6e 64 6c 65 20 61 6c 6c 20 74 68 65 20 5f 61 6c ndle all the _al
125d0 6c 6f 77 65 64 5f 20 48 54 54 50 20 66 6f 72 6d lowed_ HTTP form
125e0 61 74 73 2c 20 6a 75 73 74 20 74 68 65 0a 2a 2a ats, just the.**
125f0 20 6d 6f 73 74 20 70 6f 70 75 6c 61 72 20 6f 6e most popular on
12600 65 20 28 74 68 65 20 6f 6e 65 20 67 65 6e 65 72 e (the one gener
12610 61 74 65 64 20 62 79 20 63 67 69 5f 72 66 63 38 ated by cgi_rfc8
12620 32 32 5f 64 61 74 65 73 74 61 6d 70 28 29 2c 20 22_datestamp(),
12630 61 63 74 75 61 6c 6c 79 29 2e 0a 2a 2f 0a 74 69 actually)..*/.ti
12640 6d 65 5f 74 20 63 67 69 5f 72 66 63 38 32 32 5f me_t cgi_rfc822_
12650 70 61 72 73 65 64 61 74 65 28 63 6f 6e 73 74 20 parsedate(const
12660 63 68 61 72 20 2a 7a 44 61 74 65 29 7b 0a 20 20 char *zDate){.
12670 69 6e 74 20 6d 64 61 79 2c 20 6d 6f 6e 2c 20 79 int mday, mon, y
12680 65 61 72 2c 20 79 64 61 79 2c 20 68 6f 75 72 2c ear, yday, hour,
12690 20 6d 69 6e 2c 20 73 65 63 3b 0a 20 20 63 68 61 min, sec;. cha
126a0 72 20 7a 49 67 6e 6f 72 65 5b 34 5d 3b 0a 20 20 r zIgnore[4];.
126b0 63 68 61 72 20 7a 4d 6f 6e 74 68 5b 34 5d 3b 0a char zMonth[4];.
126c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
126d0 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a 4d 6f 6e har *const azMon
126e0 74 68 73 5b 5d 20 3d 0a 20 20 20 20 7b 22 4a 61 ths[] =. {"Ja
126f0 6e 22 2c 20 22 46 65 62 22 2c 20 22 4d 61 72 22 n", "Feb", "Mar"
12700 2c 20 22 41 70 72 22 2c 20 22 4d 61 79 22 2c 20 , "Apr", "May",
12710 22 4a 75 6e 22 2c 0a 20 20 20 20 20 22 4a 75 6c "Jun",. "Jul
12720 22 2c 20 22 41 75 67 22 2c 20 22 53 65 70 22 2c ", "Aug", "Sep",
12730 20 22 4f 63 74 22 2c 20 22 4e 6f 76 22 2c 20 22 "Oct", "Nov", "
12740 44 65 63 22 2c 20 30 7d 3b 0a 20 20 69 66 28 20 Dec", 0};. if(
12750 37 3d 3d 73 73 63 61 6e 66 28 7a 44 61 74 65 2c 7==sscanf(zDate,
12760 20 22 25 33 5b 41 2d 5a 61 2d 7a 5d 2c 20 25 64 "%3[A-Za-z], %d
12770 20 25 33 5b 41 2d 5a 61 2d 7a 5d 20 25 64 20 25 %3[A-Za-z] %d %
12780 64 3a 25 64 3a 25 64 22 2c 20 7a 49 67 6e 6f 72 d:%d:%d", zIgnor
12790 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e,.
127a0 20 20 20 20 20 20 20 20 20 20 26 6d 64 61 79 2c &mday,
127b0 20 7a 4d 6f 6e 74 68 2c 20 26 79 65 61 72 2c 20 zMonth, &year,
127c0 26 68 6f 75 72 2c 20 26 6d 69 6e 2c 20 26 73 65 &hour, &min, &se
127d0 63 29 29 7b 0a 20 20 20 20 69 66 28 20 79 65 61 c)){. if( yea
127e0 72 20 3e 20 31 39 30 30 20 29 20 79 65 61 72 20 r > 1900 ) year
127f0 2d 3d 20 31 39 30 30 3b 0a 20 20 20 20 66 6f 72 -= 1900;. for
12800 28 6d 6f 6e 3d 30 3b 20 61 7a 4d 6f 6e 74 68 73 (mon=0; azMonths
12810 5b 6d 6f 6e 5d 3b 20 6d 6f 6e 2b 2b 29 7b 0a 20 [mon]; mon++){.
12820 20 20 20 20 20 69 66 28 20 21 73 74 72 6e 63 6d if( !strncm
12830 70 28 20 61 7a 4d 6f 6e 74 68 73 5b 6d 6f 6e 5d p( azMonths[mon]
12840 2c 20 7a 4d 6f 6e 74 68 2c 20 33 20 29 29 7b 0a , zMonth, 3 )){.
12850 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 61 79 int nDay
12860 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 73 ;. int is
12870 4c 65 61 70 59 72 3b 0a 20 20 20 20 20 20 20 20 LeapYr;.
12880 73 74 61 74 69 63 20 69 6e 74 20 70 72 69 6f 72 static int prior
12890 44 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 20 20 Days[] =.
128a0 20 20 7b 20 20 30 2c 20 33 31 2c 20 35 39 2c 20 { 0, 31, 59,
128b0 39 30 2c 31 32 30 2c 31 35 31 2c 31 38 31 2c 32 90,120,151,181,2
128c0 31 32 2c 32 34 33 2c 32 37 33 2c 33 30 34 2c 33 12,243,273,304,3
128d0 33 34 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 66 34 };. if
128e0 28 20 6d 6f 6e 3c 30 20 29 7b 0a 20 20 20 20 20 ( mon<0 ){.
128f0 20 20 20 20 20 69 6e 74 20 6e 59 65 61 72 20 3d int nYear =
12900 20 28 31 31 20 2d 20 6d 6f 6e 29 2f 31 32 3b 0a (11 - mon)/12;.
12910 20 20 20 20 20 20 20 20 20 20 79 65 61 72 20 2d year -
12920 3d 20 6e 59 65 61 72 3b 0a 20 20 20 20 20 20 20 = nYear;.
12930 20 20 20 6d 6f 6e 20 2b 3d 20 6e 59 65 61 72 2a mon += nYear*
12940 31 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 12;. }els
12950 65 20 69 66 28 20 6d 6f 6e 3e 31 31 20 29 7b 0a e if( mon>11 ){.
12960 20 20 20 20 20 20 20 20 20 20 79 65 61 72 20 2b year +
12970 3d 20 6d 6f 6e 2f 31 32 3b 0a 20 20 20 20 20 20 = mon/12;.
12980 20 20 20 20 6d 6f 6e 20 25 3d 20 31 32 3b 0a 20 mon %= 12;.
12990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
129a0 20 69 73 4c 65 61 70 59 72 20 3d 20 79 65 61 72 isLeapYr = year
129b0 25 34 3d 3d 30 20 26 26 20 28 79 65 61 72 25 31 %4==0 && (year%1
129c0 30 30 21 3d 30 20 7c 7c 20 28 79 65 61 72 2b 33 00!=0 || (year+3
129d0 30 30 29 25 34 30 30 3d 3d 30 29 3b 0a 20 20 20 00)%400==0);.
129e0 20 20 20 20 20 79 64 61 79 20 3d 20 70 72 69 6f yday = prio
129f0 72 44 61 79 73 5b 6d 6f 6e 5d 20 2b 20 6d 64 61 rDays[mon] + mda
12a00 79 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 y - 1;. i
12a10 66 28 20 69 73 4c 65 61 70 59 72 20 26 26 20 6d f( isLeapYr && m
12a20 6f 6e 3e 31 20 29 20 79 64 61 79 2b 2b 3b 0a 20 on>1 ) yday++;.
12a30 20 20 20 20 20 20 20 6e 44 61 79 20 3d 20 28 79 nDay = (y
12a40 65 61 72 2d 37 30 29 2a 33 36 35 20 2b 20 28 79 ear-70)*365 + (y
12a50 65 61 72 2d 36 39 29 2f 34 20 2d 20 79 65 61 72 ear-69)/4 - year
12a60 2f 31 30 30 20 2b 20 28 79 65 61 72 2b 33 30 30 /100 + (year+300
12a70 29 2f 34 30 30 20 2b 20 79 64 61 79 3b 0a 20 20 )/400 + yday;.
12a80 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 74 return ((t
12a90 69 6d 65 5f 74 29 28 6e 44 61 79 2a 32 34 20 2b ime_t)(nDay*24 +
12aa0 20 68 6f 75 72 29 2a 36 30 20 2b 20 6d 69 6e 29 hour)*60 + min)
12ab0 2a 36 30 20 2b 20 73 65 63 3b 0a 20 20 20 20 20 *60 + sec;.
12ac0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 }. }. }. r
12ad0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
12ae0 2a 20 43 68 65 63 6b 20 74 68 65 20 6f 62 6a 65 * Check the obje
12af0 63 74 54 69 6d 65 20 61 67 61 69 6e 73 74 20 74 ctTime against t
12b00 68 65 20 49 66 2d 4d 6f 64 69 66 69 65 64 2d 53 he If-Modified-S
12b10 69 6e 63 65 20 72 65 71 75 65 73 74 20 68 65 61 ince request hea
12b20 64 65 72 2e 20 49 66 20 74 68 65 0a 2a 2a 20 6f der. If the.** o
12b30 62 6a 65 63 74 20 74 69 6d 65 20 69 73 6e 27 74 bject time isn't
12b40 20 61 6e 79 20 6e 65 77 65 72 20 74 68 61 6e 20 any newer than
12b50 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 69 the header, we i
12b60 6d 6d 65 64 69 61 74 65 6c 79 20 73 65 6e 64 20 mmediately send
12b70 62 61 63 6b 0a 2a 2a 20 61 20 33 30 34 20 72 65 back.** a 304 re
12b80 70 6c 79 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f ply and exit..*/
12b90 0a 76 6f 69 64 20 63 67 69 5f 6d 6f 64 69 66 69 .void cgi_modifi
12ba0 65 64 5f 73 69 6e 63 65 28 74 69 6d 65 5f 74 20 ed_since(time_t
12bb0 6f 62 6a 65 63 74 54 69 6d 65 29 7b 0a 20 20 63 objectTime){. c
12bc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 66 20 3d onst char *zIf =
12bd0 20 50 28 22 48 54 54 50 5f 49 46 5f 4d 4f 44 49 P("HTTP_IF_MODI
12be0 46 49 45 44 5f 53 49 4e 43 45 22 29 3b 0a 20 20 FIED_SINCE");.
12bf0 69 66 28 20 7a 49 66 3d 3d 30 20 29 20 72 65 74 if( zIf==0 ) ret
12c00 75 72 6e 3b 0a 20 20 69 66 28 20 6f 62 6a 65 63 urn;. if( objec
12c10 74 54 69 6d 65 20 3e 20 63 67 69 5f 72 66 63 38 tTime > cgi_rfc8
12c20 32 32 5f 70 61 72 73 65 64 61 74 65 28 7a 49 66 22_parsedate(zIf
12c30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 67 ) ) return;. cg
12c40 69 5f 73 65 74 5f 73 74 61 74 75 73 28 33 30 34 i_set_status(304
12c50 2c 22 4e 6f 74 20 4d 6f 64 69 66 69 65 64 22 29 ,"Not Modified")
12c60 3b 0a 20 20 63 67 69 5f 72 65 73 65 74 5f 63 6f ;. cgi_reset_co
12c70 6e 74 65 6e 74 28 29 3b 0a 20 20 63 67 69 5f 72 ntent();. cgi_r
12c80 65 70 6c 79 28 29 3b 0a 20 20 66 6f 73 73 69 6c eply();. fossil
12c90 5f 65 78 69 74 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a _exit(0);.}../*.
12ca0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 ** Check to see
12cb0 69 66 20 74 68 65 20 72 65 6d 6f 74 65 20 63 6c if the remote cl
12cc0 69 65 6e 74 20 69 73 20 53 53 48 20 61 6e 64 20 ient is SSH and
12cd0 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20 49 50 return.** its IP
12ce0 20 6f 72 20 72 65 74 75 72 6e 20 64 65 66 61 75 or return defau
12cf0 6c 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 lt.*/.const char
12d00 20 2a 63 67 69 5f 73 73 68 5f 72 65 6d 6f 74 65 *cgi_ssh_remote
12d10 5f 61 64 64 72 28 63 6f 6e 73 74 20 63 68 61 72 _addr(const char
12d20 20 2a 7a 44 65 66 61 75 6c 74 29 7b 0a 20 20 63 *zDefault){. c
12d30 68 61 72 20 2a 7a 49 6e 64 65 78 3b 0a 20 20 63 har *zIndex;. c
12d40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 73 68 43 onst char *zSshC
12d50 6f 6e 6e 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74 onn = fossil_get
12d60 65 6e 76 28 22 53 53 48 5f 43 4f 4e 4e 45 43 54 env("SSH_CONNECT
12d70 49 4f 4e 22 29 3b 0a 0a 20 20 69 66 28 20 7a 53 ION");.. if( zS
12d80 73 68 43 6f 6e 6e 20 26 26 20 7a 53 73 68 43 6f shConn && zSshCo
12d90 6e 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 63 68 61 nn[0] ){. cha
12da0 72 20 2a 7a 53 73 68 43 6c 69 65 6e 74 20 3d 20 r *zSshClient =
12db0 66 6f 73 73 69 6c 5f 73 74 72 64 75 70 28 7a 53 fossil_strdup(zS
12dc0 73 68 43 6f 6e 6e 29 3b 0a 20 20 20 20 69 66 28 shConn);. if(
12dd0 20 28 7a 49 6e 64 65 78 20 3d 20 73 74 72 63 68 (zIndex = strch
12de0 72 28 7a 53 73 68 43 6c 69 65 6e 74 2c 27 20 27 r(zSshClient,' '
12df0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a ))!=0 ){. z
12e00 53 73 68 43 6c 69 65 6e 74 5b 7a 49 6e 64 65 78 SshClient[zIndex
12e10 2d 7a 53 73 68 43 6c 69 65 6e 74 5d 20 3d 20 27 -zSshClient] = '
12e20 5c 30 27 3b 0a 20 20 20 20 20 20 72 65 74 75 72 \0';. retur
12e30 6e 20 7a 53 73 68 43 6c 69 65 6e 74 3b 0a 20 20 n zSshClient;.
12e40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e }. }. return
12e50 20 7a 44 65 66 61 75 6c 74 3b 0a 7d 0a 0a 2f 2a zDefault;.}../*
12e60 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 .** Return true
12e70 69 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 if information i
12e80 73 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 s coming from th
12e90 65 20 6c 6f 6f 70 62 61 63 6b 20 6e 65 74 77 6f e loopback netwo
12ea0 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f 69 rk..*/.int cgi_i
12eb0 73 5f 6c 6f 6f 70 62 61 63 6b 28 63 6f 6e 73 74 s_loopback(const
12ec0 20 63 68 61 72 20 2a 7a 49 70 41 64 64 72 29 7b char *zIpAddr){
12ed0 0a 20 20 72 65 74 75 72 6e 20 66 6f 73 73 69 6c . return fossil
12ee0 5f 73 74 72 63 6d 70 28 7a 49 70 41 64 64 72 2c _strcmp(zIpAddr,
12ef0 20 22 31 32 37 2e 30 2e 30 2e 31 22 29 3d 3d 30 "127.0.0.1")==0
12f00 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 66 6f 73 ||. fos
12f10 73 69 6c 5f 73 74 72 63 6d 70 28 7a 49 70 41 64 sil_strcmp(zIpAd
12f20 64 72 2c 20 22 3a 3a 66 66 66 66 3a 31 32 37 2e dr, "::ffff:127.
12f30 30 2e 30 2e 31 22 29 3d 3d 30 20 7c 7c 0a 20 20 0.0.1")==0 ||.
12f40 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 73 74 fossil_st
12f50 72 63 6d 70 28 7a 49 70 41 64 64 72 2c 20 22 3a rcmp(zIpAddr, ":
12f60 3a 31 22 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a :1")==0;.}../*.*
12f70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
12f80 20 74 68 65 20 48 54 54 50 20 72 65 71 75 65 73 the HTTP reques
12f90 74 20 69 73 20 6c 69 6b 65 6c 79 20 74 6f 20 62 t is likely to b
12fa0 65 20 66 72 6f 6d 20 61 20 73 6d 61 6c 6c 2d 73 e from a small-s
12fb0 63 72 65 65 6e 0a 2a 2a 20 6d 6f 62 69 6c 65 20 creen.** mobile
12fc0 64 65 76 69 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 device..**.** Th
12fd0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 e returned value
12fe0 20 69 73 20 61 20 67 75 65 73 73 2e 20 20 55 73 is a guess. Us
12ff0 65 20 69 74 20 6f 6e 6c 79 20 66 6f 72 20 73 65 e it only for se
13000 74 74 69 6e 67 20 75 70 20 64 65 66 61 75 6c 74 tting up default
13010 73 2e 0a 2a 2f 0a 69 6e 74 20 63 67 69 5f 66 72 s..*/.int cgi_fr
13020 6f 6d 5f 6d 6f 62 69 6c 65 28 76 6f 69 64 29 7b om_mobile(void){
13030 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
13040 41 67 65 6e 74 20 3d 20 50 28 22 48 54 54 50 5f Agent = P("HTTP_
13050 55 53 45 52 5f 41 47 45 4e 54 22 29 3b 0a 20 20 USER_AGENT");.
13060 69 66 28 20 7a 41 67 65 6e 74 3d 3d 30 20 29 20 if( zAgent==0 )
13070 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 return 0;. if(
13080 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 sqlite3_strglob(
13090 22 2a 69 50 61 64 2a 22 2c 20 7a 41 67 65 6e 74 "*iPad*", zAgent
130a0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b )==0 ) return 0;
130b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
130c0 33 5f 73 74 72 6c 69 6b 65 28 22 25 6d 6f 62 69 3_strlike("%mobi
130d0 6c 65 25 22 2c 20 7a 41 67 65 6e 74 2c 20 30 29 le%", zAgent, 0)
130e0 3d 3d 30 3b 0a 7d 0a ==0;.}.