Attachment "winhttp.c" to
ticket [11622724e5]
added by
anonymous
2010-08-26 09:54:59.
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 38 20 44 2e 20 52 69 63 68 (c) 2008 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 0a 2a 2a 20 54 68 69 73 ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77 ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74 arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79 merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20 or fitness for
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68 pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72 or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68 mation:.** drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20 @hwaci.com.**
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69 http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a .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 0a 2a 2a 0a ************.**.
0250: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 ** This file imp
0260: 6c 65 6d 65 6e 74 73 20 61 20 76 65 72 79 20 73 lements a very s
0270: 69 6d 70 6c 65 20 28 61 6e 64 20 6c 6f 77 2d 70 imple (and low-p
0280: 65 72 66 6f 72 6d 61 6e 63 65 29 20 48 54 54 50 erformance) HTTP
0290: 20 73 65 72 76 65 72 0a 2a 2a 20 66 6f 72 20 77 server.** for w
02a0: 69 6e 64 6f 77 73 2e 0a 2a 2f 0a 23 69 66 64 65 indows..*/.#ifde
02b0: 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 20 20 20 f __MINGW32__
02c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 /* This
02d0: 63 6f 64 65 20 69 73 20 66 6f 72 20 77 69 6e 33 code is for win3
02e0: 32 20 6f 6e 6c 79 20 2a 2f 0a 23 69 6e 63 6c 75 2 only */.#inclu
02f0: 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 de "config.h".#i
0300: 6e 63 6c 75 64 65 20 22 77 69 6e 68 74 74 70 2e nclude "winhttp.
0310: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e h".#include <win
0320: 64 6f 77 73 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 dows.h>..#includ
0330: 65 20 22 6d 79 5f 70 6f 70 65 6e 2e 68 22 0a 0a e "my_popen.h"..
0340: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 48 74 74 70 52 ./*.** The HttpR
0350: 65 71 75 65 73 74 20 73 74 72 75 63 74 75 72 65 equest structure
0360: 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 holds informati
0370: 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 69 6e on about each in
0380: 63 6f 6d 69 6e 67 0a 2a 2a 20 48 54 54 50 20 72 coming.** HTTP r
0390: 65 71 75 65 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 equest..*/.typed
03a0: 65 66 20 73 74 72 75 63 74 20 48 74 74 70 52 65 ef struct HttpRe
03b0: 71 75 65 73 74 20 48 74 74 70 52 65 71 75 65 73 quest HttpReques
03c0: 74 3b 0a 73 74 72 75 63 74 20 48 74 74 70 52 65 t;.struct HttpRe
03d0: 71 75 65 73 74 20 7b 0a 20 20 69 6e 74 20 69 64 quest {. int id
03e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
03f0: 20 49 44 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 ID counter */.
0400: 20 53 4f 43 4b 45 54 20 73 3b 20 20 20 20 20 20 SOCKET s;
0410: 20 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 6f /* Socket o
0420: 6e 20 77 68 69 63 68 20 74 6f 20 72 65 63 65 69 n which to recei
0430: 76 65 20 64 61 74 61 20 2a 2f 0a 20 20 53 4f 43 ve data */. SOC
0440: 4b 41 44 44 52 5f 49 4e 20 61 64 64 72 3b 20 20 KADDR_IN addr;
0450: 20 2f 2a 20 41 64 64 72 65 73 73 20 66 72 6f 6d /* Address from
0460: 20 77 68 69 63 68 20 64 61 74 61 20 69 73 20 63 which data is c
0470: 6f 6d 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 oming */. const
0480: 20 63 68 61 72 20 2a 7a 4e 6f 74 46 6f 75 6e 64 char *zNotFound
0490: 3b 20 20 2f 2a 20 2d 2d 6e 6f 74 66 6f 75 6e 64 ; /* --notfound
04a0: 20 6f 70 74 69 6f 6e 2c 20 6f 72 20 61 6e 20 65 option, or an e
04b0: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 7d mpty string */.}
04c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 66 69 78 20 ;../*.** Prefix
04d0: 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 for a temporary
04e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 file..*/.static
04f0: 63 68 61 72 20 2a 7a 54 65 6d 70 50 72 65 66 69 char *zTempPrefi
0500: 78 3b 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 61 x;../*.** Look a
0510: 74 20 74 68 65 20 48 54 54 50 20 68 65 61 64 65 t the HTTP heade
0520: 72 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 7a r contained in z
0530: 48 64 72 2e 20 20 46 69 6e 64 20 74 68 65 20 63 Hdr. Find the c
0540: 6f 6e 74 65 6e 74 0a 2a 2a 20 6c 65 6e 67 74 68 ontent.** length
0550: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 20 and return it.
0560: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 Return 0 if the
0570: 72 65 20 69 73 20 6e 6f 20 43 6f 6e 74 65 6e 74 re is no Content
0580: 2d 4c 65 6e 67 74 68 3a 0a 2a 2a 20 68 65 61 64 -Length:.** head
0590: 65 72 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 er line..*/.stat
05a0: 69 63 20 69 6e 74 20 66 69 6e 64 5f 63 6f 6e 74 ic int find_cont
05b0: 65 6e 74 5f 6c 65 6e 67 74 68 28 63 6f 6e 73 74 ent_length(const
05c0: 20 63 68 61 72 20 2a 7a 48 64 72 29 7b 0a 20 20 char *zHdr){.
05d0: 77 68 69 6c 65 28 20 2a 7a 48 64 72 20 29 7b 0a while( *zHdr ){.
05e0: 20 20 20 20 69 66 28 20 7a 48 64 72 5b 30 5d 3d if( zHdr[0]=
05f0: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 69 ='\n' ){. i
0600: 66 28 20 7a 48 64 72 5b 31 5d 3d 3d 27 5c 72 27 f( zHdr[1]=='\r'
0610: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 ) return 0;.
0620: 20 20 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 if( strncasec
0630: 6d 70 28 26 7a 48 64 72 5b 31 5d 2c 20 22 63 6f mp(&zHdr[1], "co
0640: 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22 2c 20 ntent-length:",
0650: 31 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 15)==0 ){.
0660: 20 20 72 65 74 75 72 6e 20 61 74 6f 69 28 26 7a return atoi(&z
0670: 48 64 72 5b 31 37 5d 29 3b 0a 20 20 20 20 20 20 Hdr[17]);.
0680: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 48 64 72 }. }. zHdr
0690: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e ++;. }. return
06a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 0;.}../*.** Pro
06b0: 63 65 73 73 20 61 20 73 69 6e 67 6c 65 20 69 6e cess a single in
06c0: 63 6f 6d 69 6e 67 20 48 54 54 50 20 72 65 71 75 coming HTTP requ
06d0: 65 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 77 69 6e est..*/.void win
06e0: 33 32 5f 70 72 6f 63 65 73 73 5f 6f 6e 65 5f 68 32_process_one_h
06f0: 74 74 70 5f 72 65 71 75 65 73 74 28 76 6f 69 64 ttp_request(void
0700: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 48 *pAppData){. H
0710: 74 74 70 52 65 71 75 65 73 74 20 2a 70 20 3d 20 ttpRequest *p =
0720: 28 48 74 74 70 52 65 71 75 65 73 74 2a 29 70 41 (HttpRequest*)pA
0730: 70 70 44 61 74 61 3b 0a 20 20 46 49 4c 45 20 2a ppData;. FILE *
0740: 69 6e 20 3d 20 30 2c 20 2a 6f 75 74 20 3d 20 30 in = 0, *out = 0
0750: 3b 0a 20 20 69 6e 74 20 61 6d 74 2c 20 67 6f 74 ;. int amt, got
0760: 3b 0a 20 20 69 6e 74 20 77 61 6e 74 65 64 20 3d ;. int wanted =
0770: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 0;. char *z;.
0780: 20 63 68 61 72 20 7a 52 65 71 75 65 73 74 46 4e char zRequestFN
0790: 61 6d 65 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 ame[100];. char
07a0: 20 7a 52 65 70 6c 79 46 4e 61 6d 65 5b 31 30 30 zReplyFName[100
07b0: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6d 64 5b 32 ];. char zCmd[2
07c0: 30 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 000]; /
07d0: 2a 20 43 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 74 * Command-line t
07e0: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 o process the re
07f0: 71 75 65 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 quest */. char
0800: 7a 48 64 72 5b 32 30 30 30 5d 3b 20 20 20 20 20 zHdr[2000];
0810: 20 20 20 20 20 2f 2a 20 54 68 65 20 48 54 54 50 /* The HTTP
0820: 20 72 65 71 75 65 73 74 20 68 65 61 64 65 72 20 request header
0830: 2a 2f 0a 0a 20 20 73 70 72 69 6e 74 66 28 7a 52 */.. sprintf(zR
0840: 65 71 75 65 73 74 46 4e 61 6d 65 2c 20 22 25 73 equestFName, "%s
0850: 5f 69 6e 25 64 2e 74 78 74 22 2c 20 7a 54 65 6d _in%d.txt", zTem
0860: 70 50 72 65 66 69 78 2c 20 70 2d 3e 69 64 29 3b pPrefix, p->id);
0870: 0a 20 20 73 70 72 69 6e 74 66 28 7a 52 65 70 6c . sprintf(zRepl
0880: 79 46 4e 61 6d 65 2c 20 22 25 73 5f 6f 75 74 25 yFName, "%s_out%
0890: 64 2e 74 78 74 22 2c 20 7a 54 65 6d 70 50 72 65 d.txt", zTempPre
08a0: 66 69 78 2c 20 70 2d 3e 69 64 29 3b 0a 23 69 66 fix, p->id);.#if
08b0: 20 64 65 66 69 6e 65 64 28 46 4f 53 53 49 4c 5f defined(FOSSIL_
08c0: 43 48 49 4c 44 5f 44 45 42 55 47 29 0a 20 20 2f CHILD_DEBUG). /
08d0: 2f 73 70 72 69 6e 74 66 28 7a 43 6d 64 2c 20 22 /sprintf(zCmd, "
08e0: 73 68 20 2d 63 20 27 5c 22 25 73 5c 22 20 68 74 sh -c '\"%s\" ht
08f0: 74 70 20 5c 22 25 73 5c 22 20 2d 2d 68 74 74 70 tp \"%s\" --http
0900: 74 72 61 63 65 20 7c 20 74 65 65 20 61 62 63 27 trace | tee abc'
0910: 22 2c 20 67 2e 61 72 67 76 5b 30 5d 2c 20 67 2e ", g.argv[0], g.
0920: 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 29 zRepositoryName)
0930: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 43 6d 64 ;. sprintf(zCmd
0940: 2c 20 22 5c 22 25 73 5c 22 20 68 74 74 70 20 5c , "\"%s\" http \
0950: 22 25 73 5c 22 20 2d 2d 68 74 74 70 74 72 61 63 "%s\" --httptrac
0960: 65 20 22 2c 20 67 2e 61 72 67 76 5b 30 5d 2c 20 e ", g.argv[0],
0970: 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d g.zRepositoryNam
0980: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 73 70 72 69 e);.#else. spri
0990: 6e 74 66 28 7a 43 6d 64 2c 20 22 5c 22 25 73 5c ntf(zCmd, "\"%s\
09a0: 22 20 68 74 74 70 20 5c 22 25 73 5c 22 20 22 2c " http \"%s\" ",
09b0: 20 67 2e 61 72 67 76 5b 30 5d 2c 20 67 2e 7a 52 g.argv[0], g.zR
09c0: 65 70 6f 73 69 74 6f 72 79 4e 61 6d 65 29 3b 0a epositoryName);.
09d0: 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 63 68 #endif.. int ch
09e0: 69 6c 64 50 69 64 3b 0a 20 20 70 6f 70 65 6e 32 ildPid;. popen2
09f0: 28 7a 43 6d 64 2c 20 26 69 6e 2c 20 26 6f 75 74 (zCmd, &in, &out
0a00: 2c 20 26 63 68 69 6c 64 50 69 64 29 3b 0a 0a 20 , &childPid);..
0a10: 20 61 6d 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c amt = 0;. whil
0a20: 65 28 20 61 6d 74 3c 73 69 7a 65 6f 66 28 7a 48 e( amt<sizeof(zH
0a30: 64 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d dr) ){. got =
0a40: 20 72 65 63 76 28 70 2d 3e 73 2c 20 26 7a 48 64 recv(p->s, &zHd
0a50: 72 5b 61 6d 74 5d 2c 20 73 69 7a 65 6f 66 28 7a r[amt], sizeof(z
0a60: 48 64 72 29 2d 31 2d 61 6d 74 2c 20 30 29 3b 0a Hdr)-1-amt, 0);.
0a70: 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 53 4f 43 if( got==SOC
0a80: 4b 45 54 5f 45 52 52 4f 52 20 29 20 67 6f 74 6f KET_ERROR ) goto
0a90: 20 65 6e 64 5f 72 65 71 75 65 73 74 3b 0a 20 20 end_request;.
0aa0: 20 20 69 66 28 20 67 6f 74 3d 3d 30 20 29 7b 0a if( got==0 ){.
0ab0: 20 20 20 20 20 20 77 61 6e 74 65 64 20 3d 20 30 wanted = 0
0ac0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
0ad0: 20 20 20 7d 0a 20 20 20 20 61 6d 74 20 2b 3d 20 }. amt +=
0ae0: 67 6f 74 3b 0a 20 20 20 20 7a 48 64 72 5b 61 6d got;. zHdr[am
0af0: 74 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 20 3d 20 t] = 0;. z =
0b00: 73 74 72 73 74 72 28 7a 48 64 72 2c 20 22 5c 72 strstr(zHdr, "\r
0b10: 5c 6e 5c 72 5c 6e 22 29 3b 0a 20 20 20 20 69 66 \n\r\n");. if
0b20: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 77 61 6e ( z ){. wan
0b30: 74 65 64 20 3d 20 66 69 6e 64 5f 63 6f 6e 74 65 ted = find_conte
0b40: 6e 74 5f 6c 65 6e 67 74 68 28 7a 48 64 72 29 20 nt_length(zHdr)
0b50: 2b 20 28 26 7a 5b 34 5d 2d 7a 48 64 72 29 20 2d + (&z[4]-zHdr) -
0b60: 20 61 6d 74 3b 0a 20 20 20 20 20 20 62 72 65 61 amt;. brea
0b70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 k;. }. }. i
0b80: 66 28 20 61 6d 74 3e 3d 73 69 7a 65 6f 66 28 7a f( amt>=sizeof(z
0b90: 48 64 72 29 20 29 20 67 6f 74 6f 20 65 6e 64 5f Hdr) ) goto end_
0ba0: 72 65 71 75 65 73 74 3b 0a 20 20 2f 2f 6f 75 74 request;. //out
0bb0: 20 3d 20 66 6f 70 65 6e 28 7a 52 65 71 75 65 73 = fopen(zReques
0bc0: 74 46 4e 61 6d 65 2c 20 22 77 62 22 29 3b 0a 20 tFName, "wb");.
0bd0: 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 20 67 6f if( out==0 ) go
0be0: 74 6f 20 65 6e 64 5f 72 65 71 75 65 73 74 3b 0a to end_request;.
0bf0: 20 20 66 77 72 69 74 65 28 7a 48 64 72 2c 20 31 fwrite(zHdr, 1
0c00: 2c 20 61 6d 74 2c 20 6f 75 74 29 3b 0a 20 20 77 , amt, out);. w
0c10: 68 69 6c 65 28 20 77 61 6e 74 65 64 3e 30 20 29 hile( wanted>0 )
0c20: 7b 0a 20 20 20 20 67 6f 74 20 3d 20 72 65 63 76 {. got = recv
0c30: 28 70 2d 3e 73 2c 20 7a 48 64 72 2c 20 73 69 7a (p->s, zHdr, siz
0c40: 65 6f 66 28 7a 48 64 72 29 2c 20 30 29 3b 0a 20 eof(zHdr), 0);.
0c50: 20 20 20 69 66 28 20 67 6f 74 3d 3d 53 4f 43 4b if( got==SOCK
0c60: 45 54 5f 45 52 52 4f 52 20 29 20 67 6f 74 6f 20 ET_ERROR ) goto
0c70: 65 6e 64 5f 72 65 71 75 65 73 74 3b 0a 20 20 20 end_request;.
0c80: 20 69 66 28 20 67 6f 74 20 29 7b 0a 20 20 20 20 if( got ){.
0c90: 20 20 66 77 72 69 74 65 28 7a 48 64 72 2c 20 31 fwrite(zHdr, 1
0ca0: 2c 20 67 6f 74 2c 20 6f 75 74 29 3b 0a 20 20 20 , got, out);.
0cb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 }else{. br
0cc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 eak;. }. w
0cd0: 61 6e 74 65 64 20 2d 3d 20 67 6f 74 3b 0a 20 20 anted -= got;.
0ce0: 7d 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b }. fclose(out);
0cf0: 0a 20 20 6f 75 74 20 3d 20 30 3b 0a 20 20 2f 2f . out = 0;. //
0d00: 73 70 72 69 6e 74 66 28 7a 43 6d 64 2c 20 22 5c sprintf(zCmd, "\
0d10: 22 25 73 5c 22 20 68 74 74 70 20 5c 22 25 73 5c "%s\" http \"%s\
0d20: 22 20 25 73 20 25 73 20 25 73 25 73 22 2c 0a 20 " %s %s %s%s",.
0d30: 20 2f 2f 20 20 67 2e 61 72 67 76 5b 30 5d 2c 20 // g.argv[0],
0d40: 67 2e 7a 52 65 70 6f 73 69 74 6f 72 79 4e 61 6d g.zRepositoryNam
0d50: 65 2c 20 7a 52 65 71 75 65 73 74 46 4e 61 6d 65 e, zRequestFName
0d60: 2c 20 7a 52 65 70 6c 79 46 4e 61 6d 65 2c 20 0a , zReplyFName, .
0d70: 20 20 2f 2f 20 20 69 6e 65 74 5f 6e 74 6f 61 28 // inet_ntoa(
0d80: 70 2d 3e 61 64 64 72 2e 73 69 6e 5f 61 64 64 72 p->addr.sin_addr
0d90: 29 2c 20 70 2d 3e 7a 4e 6f 74 46 6f 75 6e 64 0a ), p->zNotFound.
0da0: 20 20 2f 2f 29 3b 0a 20 20 2f 2f 70 6f 72 74 61 //);. //porta
0db0: 62 6c 65 5f 73 79 73 74 65 6d 28 7a 43 6d 64 29 ble_system(zCmd)
0dc0: 3b 0a 20 20 2f 2f 69 6e 20 3d 20 66 6f 70 65 6e ;. //in = fopen
0dd0: 28 7a 52 65 70 6c 79 46 4e 61 6d 65 2c 20 22 72 (zReplyFName, "r
0de0: 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b b");. if( in ){
0df0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 67 6f 74 . while( (got
0e00: 20 3d 20 66 72 65 61 64 28 7a 48 64 72 2c 20 31 = fread(zHdr, 1
0e10: 2c 20 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 , sizeof(zHdr),
0e20: 69 6e 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 in))>0 ){.
0e30: 73 65 6e 64 28 70 2d 3e 73 2c 20 7a 48 64 72 2c send(p->s, zHdr,
0e40: 20 67 6f 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a got, 0);. }.
0e50: 20 20 7d 0a 0a 65 6e 64 5f 72 65 71 75 65 73 74 }..end_request
0e60: 3a 0a 20 20 69 66 28 20 6f 75 74 20 29 20 66 63 :. if( out ) fc
0e70: 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 69 66 28 lose(out);. if(
0e80: 20 69 6e 20 29 20 66 63 6c 6f 73 65 28 69 6e 29 in ) fclose(in)
0e90: 3b 0a 20 20 63 6c 6f 73 65 73 6f 63 6b 65 74 28 ;. closesocket(
0ea0: 70 2d 3e 73 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 p->s);. unlink(
0eb0: 7a 52 65 71 75 65 73 74 46 4e 61 6d 65 29 3b 0a zRequestFName);.
0ec0: 20 20 75 6e 6c 69 6e 6b 28 7a 52 65 70 6c 79 46 unlink(zReplyF
0ed0: 4e 61 6d 65 29 3b 0a 20 20 66 72 65 65 28 70 29 Name);. free(p)
0ee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 ;.}../*.** Start
0ef0: 20 61 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 a listening soc
0f00: 6b 65 74 20 61 6e 64 20 70 72 6f 63 65 73 73 20 ket and process
0f10: 69 6e 63 6f 6d 69 6e 67 20 48 54 54 50 20 72 65 incoming HTTP re
0f20: 71 75 65 73 74 73 20 6f 6e 0a 2a 2a 20 74 68 61 quests on.** tha
0f30: 74 20 73 6f 63 6b 65 74 2e 0a 2a 2f 0a 76 6f 69 t socket..*/.voi
0f40: 64 20 77 69 6e 33 32 5f 68 74 74 70 5f 73 65 72 d win32_http_ser
0f50: 76 65 72 28 0a 20 20 69 6e 74 20 6d 6e 50 6f 72 ver(. int mnPor
0f60: 74 2c 20 69 6e 74 20 6d 78 50 6f 72 74 2c 20 20 t, int mxPort,
0f70: 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 61 6c 6c /* Range of all
0f80: 6f 77 65 64 20 54 43 50 20 70 6f 72 74 20 6e 75 owed TCP port nu
0f90: 6d 62 65 72 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 mbers */. const
0fa0: 20 63 68 61 72 20 2a 7a 42 72 6f 77 73 65 72 2c char *zBrowser,
0fb0: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 /* Command
0fc0: 74 6f 20 6c 61 75 6e 63 68 20 62 72 6f 77 73 65 to launch browse
0fd0: 72 2e 20 20 28 4f 72 20 4e 55 4c 4c 29 20 2a 2f r. (Or NULL) */
0fe0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
0ff0: 53 74 6f 70 70 65 72 2c 20 20 20 20 20 2f 2a 20 Stopper, /*
1000: 53 74 6f 70 20 73 65 72 76 65 72 20 77 68 65 6e Stop server when
1010: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 65 78 this file is ex
1020: 69 73 74 73 20 28 4f 72 20 4e 55 4c 4c 29 20 2a ists (Or NULL) *
1030: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
1040: 7a 4e 6f 74 46 6f 75 6e 64 20 20 20 20 20 2f 2a zNotFound /*
1050: 20 54 68 65 20 2d 2d 6e 6f 74 66 6f 75 6e 64 20 The --notfound
1060: 6f 70 74 69 6f 6e 2c 20 6f 72 20 4e 55 4c 4c 20 option, or NULL
1070: 2a 2f 0a 29 7b 0a 20 20 57 53 41 44 41 54 41 20 */.){. WSADATA
1080: 77 64 3b 0a 20 20 53 4f 43 4b 45 54 20 73 20 3d wd;. SOCKET s =
1090: 20 49 4e 56 41 4c 49 44 5f 53 4f 43 4b 45 54 3b INVALID_SOCKET;
10a0: 0a 20 20 53 4f 43 4b 41 44 44 52 5f 49 4e 20 61 . SOCKADDR_IN a
10b0: 64 64 72 3b 0a 20 20 69 6e 74 20 69 64 43 6e 74 ddr;. int idCnt
10c0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 50 6f 72 = 0;. int iPor
10d0: 74 20 3d 20 6d 6e 50 6f 72 74 3b 0a 20 20 63 68 t = mnPort;. ch
10e0: 61 72 20 2a 7a 4e 6f 74 46 6f 75 6e 64 4f 70 74 ar *zNotFoundOpt
10f0: 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 7a 53 74 6f ion;.. if( zSto
1100: 70 70 65 72 20 29 20 75 6e 6c 69 6e 6b 28 7a 53 pper ) unlink(zS
1110: 74 6f 70 70 65 72 29 3b 0a 20 20 69 66 28 20 7a topper);. if( z
1120: 4e 6f 74 46 6f 75 6e 64 20 29 7b 0a 20 20 20 20 NotFound ){.
1130: 7a 4e 6f 74 46 6f 75 6e 64 4f 70 74 69 6f 6e 20 zNotFoundOption
1140: 3d 20 6d 70 72 69 6e 74 66 28 22 20 2d 2d 6e 6f = mprintf(" --no
1150: 74 66 6f 75 6e 64 20 25 73 22 2c 20 7a 4e 6f 74 tfound %s", zNot
1160: 46 6f 75 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b Found);. }else{
1170: 0a 20 20 20 20 7a 4e 6f 74 46 6f 75 6e 64 4f 70 . zNotFoundOp
1180: 74 69 6f 6e 20 3d 20 22 22 3b 0a 20 20 7d 0a 20 tion = "";. }.
1190: 20 69 66 28 20 57 53 41 53 74 61 72 74 75 70 28 if( WSAStartup(
11a0: 4d 41 4b 45 57 4f 52 44 28 31 2c 31 29 2c 20 26 MAKEWORD(1,1), &
11b0: 77 64 29 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 wd) ){. fossi
11c0: 6c 5f 66 61 74 61 6c 28 22 75 6e 61 62 6c 65 20 l_fatal("unable
11d0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 77 69 to initialize wi
11e0: 6e 73 6f 63 6b 22 29 3b 0a 20 20 7d 0a 20 20 77 nsock");. }. w
11f0: 68 69 6c 65 28 20 69 50 6f 72 74 3c 3d 6d 78 50 hile( iPort<=mxP
1200: 6f 72 74 20 29 7b 0a 20 20 20 20 73 20 3d 20 73 ort ){. s = s
1210: 6f 63 6b 65 74 28 41 46 5f 49 4e 45 54 2c 20 53 ocket(AF_INET, S
1220: 4f 43 4b 5f 53 54 52 45 41 4d 2c 20 30 29 3b 0a OCK_STREAM, 0);.
1230: 20 20 20 20 69 66 28 20 73 3d 3d 49 4e 56 41 4c if( s==INVAL
1240: 49 44 5f 53 4f 43 4b 45 54 20 29 7b 0a 20 20 20 ID_SOCKET ){.
1250: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 fossil_fatal(
1260: 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65 61 74 "unable to creat
1270: 65 20 61 20 73 6f 63 6b 65 74 22 29 3b 0a 20 20 e a socket");.
1280: 20 20 7d 0a 20 20 20 20 61 64 64 72 2e 73 69 6e }. addr.sin
1290: 5f 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 _family = AF_INE
12a0: 54 3b 0a 20 20 20 20 61 64 64 72 2e 73 69 6e 5f T;. addr.sin_
12b0: 70 6f 72 74 20 3d 20 68 74 6f 6e 73 28 69 50 6f port = htons(iPo
12c0: 72 74 29 3b 0a 20 20 20 20 61 64 64 72 2e 73 69 rt);. addr.si
12d0: 6e 5f 61 64 64 72 2e 73 5f 61 64 64 72 20 3d 20 n_addr.s_addr =
12e0: 68 74 6f 6e 6c 28 49 4e 41 44 44 52 5f 41 4e 59 htonl(INADDR_ANY
12f0: 29 3b 0a 20 20 20 20 69 66 28 20 62 69 6e 64 28 );. if( bind(
1300: 73 2c 20 28 73 74 72 75 63 74 20 73 6f 63 6b 61 s, (struct socka
1310: 64 64 72 2a 29 26 61 64 64 72 2c 20 73 69 7a 65 ddr*)&addr, size
1320: 6f 66 28 61 64 64 72 29 29 3d 3d 53 4f 43 4b 45 of(addr))==SOCKE
1330: 54 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 T_ERROR ){.
1340: 20 63 6c 6f 73 65 73 6f 63 6b 65 74 28 73 29 3b closesocket(s);
1350: 0a 20 20 20 20 20 20 69 50 6f 72 74 2b 2b 3b 0a . iPort++;.
1360: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a continue;.
1370: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 69 }. if( li
1380: 73 74 65 6e 28 73 2c 20 53 4f 4d 41 58 43 4f 4e sten(s, SOMAXCON
1390: 4e 29 3d 3d 53 4f 43 4b 45 54 5f 45 52 52 4f 52 N)==SOCKET_ERROR
13a0: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 73 ){. closes
13b0: 6f 63 6b 65 74 28 73 29 3b 0a 20 20 20 20 20 20 ocket(s);.
13c0: 69 50 6f 72 74 2b 2b 3b 0a 20 20 20 20 20 20 63 iPort++;. c
13d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 ontinue;. }.
13e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 break;. }.
13f0: 69 66 28 20 69 50 6f 72 74 3e 6d 78 50 6f 72 74 if( iPort>mxPort
1400: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 6e 50 6f ){. if( mnPo
1410: 72 74 3d 3d 6d 78 50 6f 72 74 20 29 7b 0a 20 20 rt==mxPort ){.
1420: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c fossil_fatal
1430: 28 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e ("unable to open
1440: 20 6c 69 73 74 65 6e 69 6e 67 20 73 6f 63 6b 65 listening socke
1450: 74 20 6f 6e 20 70 6f 72 74 73 20 25 64 22 2c 20 t on ports %d",
1460: 6d 6e 50 6f 72 74 29 3b 0a 20 20 20 20 7d 65 6c mnPort);. }el
1470: 73 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c se{. fossil
1480: 5f 66 61 74 61 6c 28 22 75 6e 61 62 6c 65 20 74 _fatal("unable t
1490: 6f 20 6f 70 65 6e 20 6c 69 73 74 65 6e 69 6e 67 o open listening
14a0: 20 73 6f 63 6b 65 74 20 6f 6e 20 61 6e 79 22 0a socket on any".
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14c0: 20 20 20 22 20 70 6f 72 74 20 69 6e 20 74 68 65 " port in the
14d0: 20 72 61 6e 67 65 20 25 64 2e 2e 25 64 22 2c 20 range %d..%d",
14e0: 6d 6e 50 6f 72 74 2c 20 6d 78 50 6f 72 74 29 3b mnPort, mxPort);
14f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 54 65 . }. }. zTe
1500: 6d 70 50 72 65 66 69 78 20 3d 20 6d 70 72 69 6e mpPrefix = mprin
1510: 74 66 28 22 66 6f 73 73 69 6c 5f 73 65 72 76 65 tf("fossil_serve
1520: 72 5f 50 25 64 5f 22 2c 20 69 50 6f 72 74 29 3b r_P%d_", iPort);
1530: 0a 20 20 70 72 69 6e 74 66 28 22 4c 69 73 74 65 . printf("Liste
1540: 6e 69 6e 67 20 66 6f 72 20 48 54 54 50 20 72 65 ning for HTTP re
1550: 71 75 65 73 74 73 20 6f 6e 20 54 43 50 20 70 6f quests on TCP po
1560: 72 74 20 25 64 5c 6e 22 2c 20 69 50 6f 72 74 29 rt %d\n", iPort)
1570: 3b 0a 20 20 69 66 28 20 7a 42 72 6f 77 73 65 72 ;. if( zBrowser
1580: 20 29 7b 0a 20 20 20 20 7a 42 72 6f 77 73 65 72 ){. zBrowser
1590: 20 3d 20 6d 70 72 69 6e 74 66 28 7a 42 72 6f 77 = mprintf(zBrow
15a0: 73 65 72 2c 20 69 50 6f 72 74 29 3b 0a 20 20 20 ser, iPort);.
15b0: 20 70 72 69 6e 74 66 28 22 4c 61 75 6e 63 68 20 printf("Launch
15c0: 77 65 62 62 72 6f 77 73 65 72 3a 20 25 73 5c 6e webbrowser: %s\n
15d0: 22 2c 20 7a 42 72 6f 77 73 65 72 29 3b 0a 20 20 ", zBrowser);.
15e0: 20 20 70 6f 72 74 61 62 6c 65 5f 73 79 73 74 65 portable_syste
15f0: 6d 28 7a 42 72 6f 77 73 65 72 29 3b 0a 20 20 7d m(zBrowser);. }
1600: 0a 20 20 70 72 69 6e 74 66 28 22 54 79 70 65 20 . printf("Type
1610: 43 74 72 6c 2d 43 20 74 6f 20 73 74 6f 70 20 74 Ctrl-C to stop t
1620: 68 65 20 48 54 54 50 20 73 65 72 76 65 72 5c 6e he HTTP server\n
1630: 22 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 ");. for(;;){.
1640: 20 20 20 53 4f 43 4b 45 54 20 63 6c 69 65 6e 74 SOCKET client
1650: 3b 0a 20 20 20 20 53 4f 43 4b 41 44 44 52 5f 49 ;. SOCKADDR_I
1660: 4e 20 63 6c 69 65 6e 74 5f 61 64 64 72 3b 0a 20 N client_addr;.
1670: 20 20 20 48 74 74 70 52 65 71 75 65 73 74 20 2a HttpRequest *
1680: 70 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d p;. int len =
1690: 20 73 69 7a 65 6f 66 28 63 6c 69 65 6e 74 5f 61 sizeof(client_a
16a0: 64 64 72 29 3b 0a 0a 20 20 20 20 63 6c 69 65 6e ddr);.. clien
16b0: 74 20 3d 20 61 63 63 65 70 74 28 73 2c 20 28 73 t = accept(s, (s
16c0: 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 2a 29 truct sockaddr*)
16d0: 26 63 6c 69 65 6e 74 5f 61 64 64 72 2c 20 26 6c &client_addr, &l
16e0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 74 en);. if( zSt
16f0: 6f 70 70 65 72 20 26 26 20 66 69 6c 65 5f 73 69 opper && file_si
1700: 7a 65 28 7a 53 74 6f 70 70 65 72 29 3e 3d 30 20 ze(zStopper)>=0
1710: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a ){. break;.
1720: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6c }. if( cl
1730: 69 65 6e 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 4f ient==INVALID_SO
1740: 43 4b 45 54 20 29 7b 0a 20 20 20 20 20 20 63 6c CKET ){. cl
1750: 6f 73 65 73 6f 63 6b 65 74 28 73 29 3b 0a 20 20 osesocket(s);.
1760: 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c fossil_fatal
1770: 28 22 65 72 72 6f 72 20 66 72 6f 6d 20 61 63 63 ("error from acc
1780: 65 70 74 28 29 22 29 3b 0a 20 20 20 20 7d 0a 20 ept()");. }.
1790: 20 20 20 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 p = malloc( s
17a0: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 20 izeof(*p) );.
17b0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 if( p==0 ){.
17c0: 20 20 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 fossil_fatal(
17d0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 "out of memory")
17e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 ;. }. p->i
17f0: 64 20 3d 20 2b 2b 69 64 43 6e 74 3b 0a 20 20 20 d = ++idCnt;.
1800: 20 70 2d 3e 73 20 3d 20 63 6c 69 65 6e 74 3b 0a p->s = client;.
1810: 20 20 20 20 70 2d 3e 61 64 64 72 20 3d 20 63 6c p->addr = cl
1820: 69 65 6e 74 5f 61 64 64 72 3b 0a 20 20 20 20 70 ient_addr;. p
1830: 2d 3e 7a 4e 6f 74 46 6f 75 6e 64 20 3d 20 7a 4e ->zNotFound = zN
1840: 6f 74 46 6f 75 6e 64 4f 70 74 69 6f 6e 3b 0a 20 otFoundOption;.
1850: 20 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28 _beginthread(
1860: 77 69 6e 33 32 5f 70 72 6f 63 65 73 73 5f 6f 6e win32_process_on
1870: 65 5f 68 74 74 70 5f 72 65 71 75 65 73 74 2c 20 e_http_request,
1880: 30 2c 20 28 76 6f 69 64 2a 29 70 29 3b 0a 20 20 0, (void*)p);.
1890: 7d 0a 20 20 63 6c 6f 73 65 73 6f 63 6b 65 74 28 }. closesocket(
18a0: 73 29 3b 0a 20 20 57 53 41 43 6c 65 61 6e 75 70 s);. WSACleanup
18b0: 28 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a ();.}..#endif /*
18c0: 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 20 20 2d 2d __MINGW32__ --
18d0: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 66 6f This code is fo
18e0: 72 20 77 69 6e 33 32 20 6f 6e 6c 79 20 2a 2f 0a r win32 only */.