Hex Artifact Content
Not logged in

Artifact 54410d4f2bc2741e9dfd2b422617ac1ac2714287:

File src/http.c part of check-in [8372cc0b81] - Socket operations now functional in Win32 port. Added quotes around the filename portion of the command to edit thus working of windows in paths where the temp directory contains spaces. Added -all flag to clean command. If not specified each file is prompted for before removing. by jnc on 2007-09-22 18:34:49. Also file src/http.c part of check-in [3c5482959c] - Merge in the w32 changes. by drh on 2007-09-22 19:43:55.

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 37 20 44 2e 20 52 69 63 68  (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54  ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66  his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f  ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75  u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20  te it and/or.** 
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20  modify it under 
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76  lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c  ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65  ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73  s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20  tributed in the 
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c  hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20  l be useful,.** 
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20  but WITHOUT ANY 
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75  WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69  t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a  ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54  * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52  Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55   A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20  RPOSE.  See the 
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50  GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f  ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a  r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c  ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20  d have received 
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e  a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e  .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72  g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69  ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65  te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20  ation, Inc., 59 
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53  Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73  uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31  ton, MA  02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20  307, USA..**.** 
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69  Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20  nformation:.**  
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a   drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68  *   http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a  waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 74   contains code t
0380: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
0390: 68 65 20 63 6c 69 65 6e 74 2d 73 69 64 65 20 48  he client-side H
03a0: 54 54 50 20 70 72 6f 74 6f 63 6f 6c 0a 2a 2f 0a  TTP protocol.*/.
03b0: 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67  #include "config
03c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 68 74  .h".#include "ht
03d0: 74 70 2e 68 22 0a 23 69 66 64 65 66 20 5f 5f 4d  tp.h".#ifdef __M
03e0: 49 4e 47 57 33 32 5f 5f 0a 23 20 20 69 6e 63 6c  INGW32__.#  incl
03f0: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
0400: 23 20 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 73  #  include <wins
0410: 6f 63 6b 32 2e 68 3e 0a 23 65 6c 73 65 0a 23 20  ock2.h>.#else.# 
0420: 20 69 6e 63 6c 75 64 65 20 3c 61 72 70 61 2f 69   include <arpa/i
0430: 6e 65 74 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64  net.h>.#  includ
0440: 65 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e  e <sys/socket.h>
0450: 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 6e 65 74  .#  include <net
0460: 64 62 2e 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65  db.h>.#  include
0470: 20 3c 6e 65 74 69 6e 65 74 2f 69 6e 2e 68 3e 0a   <netinet/in.h>.
0480: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0490: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
04a0: 75 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68  ude <sys/types.h
04b0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e  >.#include <sign
04c0: 61 6c 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 50 65 72  al.h>../*.** Per
04d0: 73 69 73 74 65 6e 74 20 69 6e 66 6f 72 6d 61 74  sistent informat
04e0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 48 54  ion about the HT
04f0: 54 50 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  TP connection..*
0500: 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 4d 49 4e 47  /..#ifdef __MING
0510: 57 33 32 5f 5f 0a 73 74 61 74 69 63 20 57 53 41  W32__.static WSA
0520: 44 41 54 41 20 77 73 5f 69 6e 66 6f 3b 0a 73 74  DATA ws_info;.st
0530: 61 74 69 63 20 69 6e 74 20 70 53 6f 63 6b 65 74  atic int pSocket
0540: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 68 65   = 0;     /* The
0550: 20 73 6f 63 6b 65 74 20 6f 6e 20 77 68 69 63 68   socket on which
0560: 20 77 65 20 74 61 6c 6b 20 74 6f 20 74 68 65 20   we talk to the 
0570: 73 65 72 76 65 72 20 6f 6e 20 2a 2f 0a 23 65 6c  server on */.#el
0580: 73 65 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  se.static FILE *
0590: 70 53 6f 63 6b 65 74 20 3d 20 30 3b 20 20 20 2f  pSocket = 0;   /
05a0: 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 66 69 6c  * The socket fil
05b0: 65 68 61 6e 64 6c 65 20 6f 6e 20 77 68 69 63 68  ehandle on which
05c0: 20 77 65 20 74 61 6c 6b 20 74 6f 20 74 68 65 20   we talk to the 
05d0: 73 65 72 76 65 72 20 2a 2f 0a 23 65 6e 64 69 66  server */.#endif
05e0: 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 73 6f 63 6b 20  ../*.** Winsock 
05f0: 6d 75 73 74 20 62 65 20 69 6e 69 74 69 61 6c 69  must be initiali
0600: 7a 65 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20  ze before use.  
0610: 54 68 69 73 20 68 65 6c 70 65 72 20 6d 65 74 68  This helper meth
0620: 6f 64 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 0a  od allows us to.
0630: 2a 2a 20 61 6c 77 61 79 73 20 63 61 6c 6c 20 77  ** always call w
0640: 73 5f 69 6e 69 74 20 69 6e 20 6f 75 72 20 63 6f  s_init in our co
0650: 64 65 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  de regardless of
0660: 20 70 6c 61 74 66 6f 72 6d 20 62 75 74 20 6f 6e   platform but on
0670: 6c 79 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 69  ly actually.** i
0680: 6e 69 74 69 61 6c 69 7a 65 20 77 69 6e 73 6f 63  nitialize winsoc
0690: 6b 20 6f 6e 20 74 68 65 20 77 69 6e 64 6f 77 73  k on the windows
06a0: 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f 0a 73 74   platform..*/.st
06b0: 61 74 69 63 20 76 6f 69 64 20 77 73 5f 69 6e 69  atic void ws_ini
06c0: 74 28 29 7b 0a 23 69 66 64 65 66 20 5f 5f 4d 49  t(){.#ifdef __MI
06d0: 4e 47 57 33 32 5f 5f 0a 20 20 69 66 20 28 57 53  NGW32__.  if (WS
06e0: 41 53 74 61 72 74 75 70 28 4d 41 4b 45 57 4f 52  AStartup(MAKEWOR
06f0: 44 28 32 2c 30 29 2c 20 26 77 73 5f 69 6e 66 6f  D(2,0), &ws_info
0700: 29 20 21 3d 20 30 29 7b 0a 20 20 20 20 66 6f 73  ) != 0){.    fos
0710: 73 69 6c 5f 70 61 6e 69 63 28 22 63 61 6e 27 74  sil_panic("can't
0720: 20 69 6e 69 74 69 61 6c 69 7a 65 20 77 69 6e 73   initialize wins
0730: 6f 63 6b 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ock");.  }.#endi
0740: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6b 65 20  f.}../*.** Like 
0750: 77 73 5f 69 6e 69 74 2c 20 77 69 6e 73 6f 63 6b  ws_init, winsock
0760: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c   must also be cl
0770: 65 61 6e 65 64 20 75 70 20 61 66 74 65 72 2e 0a  eaned up after..
0780: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
0790: 73 5f 63 6c 65 61 6e 75 70 28 29 7b 0a 23 69 66  s_cleanup(){.#if
07a0: 64 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a  def __MINGW32__.
07b0: 20 20 57 53 41 43 6c 65 61 6e 75 70 28 29 3b 0a    WSACleanup();.
07c0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
07d0: 4f 70 65 6e 20 61 20 73 6f 63 6b 65 74 20 63 6f  Open a socket co
07e0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
07f0: 73 65 72 76 65 72 2e 20 20 52 65 74 75 72 6e 20  server.  Return 
0800: 30 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  0 on success and
0810: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
0820: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
0830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
0840: 74 74 70 5f 6f 70 65 6e 5f 73 6f 63 6b 65 74 28  ttp_open_socket(
0850: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
0860: 73 74 72 75 63 74 20 73 6f 63 6b 61 64 64 72 5f  struct sockaddr_
0870: 69 6e 20 61 64 64 72 3b 20 20 2f 2a 20 54 68 65  in addr;  /* The
0880: 20 73 65 72 76 65 72 20 61 64 64 72 65 73 73 20   server address 
0890: 2a 2f 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  */.  static int 
08a0: 61 64 64 72 49 73 49 6e 69 74 20 3d 20 30 3b 20  addrIsInit = 0; 
08b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 6f 6e        /* True on
08c0: 63 65 20 61 64 64 72 20 69 73 20 69 6e 69 74 69  ce addr is initi
08d0: 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74 20  alized */.  int 
08e0: 73 3b 0a 0a 20 20 77 73 5f 69 6e 69 74 28 29 3b  s;..  ws_init();
08f0: 0a 20 20 0a 20 20 69 66 28 20 21 61 64 64 72 49  .  .  if( !addrI
0900: 73 49 6e 69 74 20 29 7b 0a 0a 20 20 20 20 61 64  sInit ){..    ad
0910: 64 72 2e 73 69 6e 5f 66 61 6d 69 6c 79 20 3d 20  dr.sin_family = 
0920: 41 46 5f 49 4e 45 54 3b 0a 20 20 20 20 61 64 64  AF_INET;.    add
0930: 72 2e 73 69 6e 5f 70 6f 72 74 20 3d 20 68 74 6f  r.sin_port = hto
0940: 6e 73 28 67 2e 75 72 6c 50 6f 72 74 29 3b 0a 20  ns(g.urlPort);. 
0950: 20 20 20 2a 28 69 6e 74 2a 29 26 61 64 64 72 2e     *(int*)&addr.
0960: 73 69 6e 5f 61 64 64 72 20 3d 20 69 6e 65 74 5f  sin_addr = inet_
0970: 61 64 64 72 28 67 2e 75 72 6c 4e 61 6d 65 29 3b  addr(g.urlName);
0980: 0a 20 20 20 20 69 66 28 20 2d 31 20 3d 3d 20 2a  .    if( -1 == *
0990: 28 69 6e 74 2a 29 26 61 64 64 72 2e 73 69 6e 5f  (int*)&addr.sin_
09a0: 61 64 64 72 20 29 7b 0a 23 69 66 6e 64 65 66 20  addr ){.#ifndef 
09b0: 46 4f 53 53 49 4c 5f 53 54 41 54 49 43 5f 4c 49  FOSSIL_STATIC_LI
09c0: 4e 4b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  NK.      struct 
09d0: 68 6f 73 74 65 6e 74 20 2a 70 48 6f 73 74 3b 0a  hostent *pHost;.
09e0: 20 20 20 20 20 20 70 48 6f 73 74 20 3d 20 67 65        pHost = ge
09f0: 74 68 6f 73 74 62 79 6e 61 6d 65 28 67 2e 75 72  thostbyname(g.ur
0a00: 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
0a10: 28 20 70 48 6f 73 74 21 3d 30 20 29 7b 0a 20 20  ( pHost!=0 ){.  
0a20: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 64        memcpy(&ad
0a30: 64 72 2e 73 69 6e 5f 61 64 64 72 2c 70 48 6f 73  dr.sin_addr,pHos
0a40: 74 2d 3e 68 5f 61 64 64 72 5f 6c 69 73 74 5b 30  t->h_addr_list[0
0a50: 5d 2c 70 48 6f 73 74 2d 3e 68 5f 6c 65 6e 67 74  ],pHost->h_lengt
0a60: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  h);.      }else.
0a70: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
0a80: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 61         fossil_pa
0a90: 6e 69 63 28 22 63 61 6e 27 74 20 72 65 73 6f 6c  nic("can't resol
0aa0: 76 65 20 68 6f 73 74 20 6e 61 6d 65 3a 20 25 73  ve host name: %s
0ab0: 5c 6e 22 2c 20 67 2e 75 72 6c 4e 61 6d 65 29 3b  \n", g.urlName);
0ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
0ad0: 20 20 20 61 64 64 72 49 73 49 6e 69 74 20 3d 20     addrIsInit = 
0ae0: 31 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  1;..    /* Set t
0af0: 68 65 20 47 6c 6f 62 61 6c 2e 7a 49 70 41 64 64  he Global.zIpAdd
0b00: 72 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  r variable to th
0b10: 65 20 73 65 72 76 65 72 20 77 65 20 61 72 65 20  e server we are 
0b20: 74 61 6c 6b 69 6e 67 20 74 6f 2e 0a 20 20 20 20  talking to..    
0b30: 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ** This is used 
0b40: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
0b50: 69 70 61 64 64 72 20 63 6f 6c 75 6d 6e 20 6f 66  ipaddr column of
0b60: 20 74 68 65 20 72 63 76 66 72 6f 6d 20 74 61 62   the rcvfrom tab
0b70: 6c 65 2c 0a 20 20 20 20 2a 2a 20 69 66 20 61 6e  le,.    ** if an
0b80: 79 20 66 69 6c 65 73 20 61 72 65 20 72 65 63 65  y files are rece
0b90: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65  ived from the se
0ba0: 72 76 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rver..    */.   
0bb0: 20 67 2e 7a 49 70 41 64 64 72 20 3d 20 6d 70 72   g.zIpAddr = mpr
0bc0: 69 6e 74 66 28 22 25 73 22 2c 20 69 6e 65 74 5f  intf("%s", inet_
0bd0: 6e 74 6f 61 28 61 64 64 72 2e 73 69 6e 5f 61 64  ntoa(addr.sin_ad
0be0: 64 72 29 29 3b 0a 20 20 7d 0a 20 20 73 20 3d 20  dr));.  }.  s = 
0bf0: 73 6f 63 6b 65 74 28 41 46 5f 49 4e 45 54 2c 53  socket(AF_INET,S
0c00: 4f 43 4b 5f 53 54 52 45 41 4d 2c 30 29 3b 0a 20  OCK_STREAM,0);. 
0c10: 20 69 66 28 20 73 3c 30 20 29 7b 0a 20 20 20 20   if( s<0 ){.    
0c20: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 63 61  fossil_panic("ca
0c30: 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 73 6f  nnot create a so
0c40: 63 6b 65 74 22 29 3b 0a 20 20 7d 0a 20 20 69 66  cket");.  }.  if
0c50: 28 20 63 6f 6e 6e 65 63 74 28 73 2c 28 73 74 72  ( connect(s,(str
0c60: 75 63 74 20 73 6f 63 6b 61 64 64 72 2a 29 26 61  uct sockaddr*)&a
0c70: 64 64 72 2c 73 69 7a 65 6f 66 28 61 64 64 72 29  ddr,sizeof(addr)
0c80: 29 3c 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69  )<0 ){.    fossi
0c90: 6c 5f 70 61 6e 69 63 28 22 63 61 6e 6e 6f 74 20  l_panic("cannot 
0ca0: 63 6f 6e 6e 65 63 74 20 74 6f 20 68 6f 73 74 20  connect to host 
0cb0: 25 73 3a 25 64 22 2c 20 67 2e 75 72 6c 4e 61 6d  %s:%d", g.urlNam
0cc0: 65 2c 20 67 2e 75 72 6c 50 6f 72 74 29 3b 0a 20  e, g.urlPort);. 
0cd0: 20 7d 0a 23 69 66 64 65 66 20 5f 5f 4d 49 4e 47   }.#ifdef __MING
0ce0: 57 33 32 5f 5f 0a 20 20 70 53 6f 63 6b 65 74 20  W32__.  pSocket 
0cf0: 3d 20 73 3b 0a 23 65 6c 73 65 0a 20 20 70 53 6f  = s;.#else.  pSo
0d00: 63 6b 65 74 20 3d 20 66 64 6f 70 65 6e 28 73 2c  cket = fdopen(s,
0d10: 22 72 2b 22 29 3b 0a 20 20 73 69 67 6e 61 6c 28  "r+");.  signal(
0d20: 53 49 47 50 49 50 45 2c 20 53 49 47 5f 49 47 4e  SIGPIPE, SIG_IGN
0d30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
0d40: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
0d50: 65 61 64 20 74 68 65 20 73 6f 63 6b 65 74 20 75  ead the socket u
0d60: 6e 74 69 6c 20 61 20 6e 65 77 6c 69 6e 65 20 27  ntil a newline '
0d70: 5c 6e 27 20 69 73 20 66 6f 75 6e 64 2e 20 20 52  \n' is found.  R
0d80: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
0d90: 0a 2a 2a 20 6f 66 20 63 68 61 72 61 63 74 65 72  .** of character
0da0: 73 20 72 65 61 64 2e 20 70 53 6f 63 6b 49 64 20  s read. pSockId 
0db0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 6f 63  contains the soc
0dc0: 6b 65 74 20 68 61 6e 64 65 6c 2e 20 20 70 4f 75  ket handel.  pOu
0dd0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 20  t.** contains a 
0de0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
0df0: 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20 74  uffer to write t
0e00: 6f 2e 20 20 70 4f 75 74 53 69 7a 65 20 63 6f 6e  o.  pOutSize con
0e10: 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 6d 61 78  tains.** the max
0e20: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
0e30: 20 6c 69 6e 65 20 74 68 61 74 20 70 4f 75 74 20   line that pOut 
0e40: 63 61 6e 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  can handle..*/.s
0e50: 74 61 74 69 63 20 69 6e 74 20 73 6f 63 6b 65 74  tatic int socket
0e60: 5f 72 65 63 76 5f 6c 69 6e 65 28 69 6e 74 20 70  _recv_line(int p
0e70: 53 6f 63 6b 49 64 2c 20 63 68 61 72 2a 20 70 4f  SockId, char* pO
0e80: 75 74 2c 20 69 6e 74 20 70 4f 75 74 53 69 7a 65  ut, int pOutSize
0e90: 29 7b 0a 20 20 69 6e 74 20 72 65 63 65 69 76 65  ){.  int receive
0ea0: 64 3d 30 3b 0a 20 20 63 68 61 72 20 6c 65 74 74  d=0;.  char lett
0eb0: 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4f 75  er;.  memset(pOu
0ec0: 74 2c 30 2c 70 4f 75 74 53 69 7a 65 29 3b 0a 20  t,0,pOutSize);. 
0ed0: 20 66 6f 72 28 3b 20 72 65 63 65 69 76 65 64 3c   for(; received<
0ee0: 70 4f 75 74 53 69 7a 65 2d 31 3b 72 65 63 65 69  pOutSize-1;recei
0ef0: 76 65 64 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ved++){.    if( 
0f00: 72 65 63 76 28 70 53 6f 63 6b 49 64 2c 28 63 68  recv(pSockId,(ch
0f10: 61 72 2a 29 26 6c 65 74 74 65 72 2c 31 2c 30 29  ar*)&letter,1,0)
0f20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74  >0 ){.      pOut
0f30: 5b 72 65 63 65 69 76 65 64 5d 3d 6c 65 74 74 65  [received]=lette
0f40: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 74  r;.      if( let
0f50: 74 65 72 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ter=='\n' ){.   
0f60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0f70: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
0f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0f90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
0fa0: 65 63 65 69 76 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  eceived;.}../*.*
0fb0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 62  * Initialize a b
0fc0: 6c 6f 62 20 74 6f 20 74 68 65 20 64 61 74 61 20  lob to the data 
0fd0: 6f 6e 20 61 6e 20 69 6e 70 75 74 20 73 6f 63 6b  on an input sock
0fe0: 65 74 2e 20 20 72 65 74 75 72 6e 0a 2a 2a 20 74  et.  return.** t
0ff0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1000: 65 73 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65  es read into the
1010: 20 62 6c 6f 62 2e 20 20 41 6e 79 20 70 72 69 6f   blob.  Any prio
1020: 72 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  r content.** of 
1030: 74 68 65 20 62 6c 6f 62 20 69 73 20 64 69 73 63  the blob is disc
1040: 61 72 64 65 64 2c 20 6e 6f 74 20 66 72 65 65 64  arded, not freed
1050: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63  ..**.** The func
1060: 74 69 6f 6e 20 77 61 73 20 70 6c 61 63 65 64 20  tion was placed 
1070: 68 65 72 65 20 69 6e 20 68 74 74 70 2e 63 20 64  here in http.c d
1080: 75 65 20 74 6f 20 69 74 27 73 20 73 6f 63 6b 65  ue to it's socke
1090: 74 0a 2a 2a 20 6e 61 74 75 72 65 20 61 6e 64 20  t.** nature and 
10a0: 77 65 20 64 69 64 20 6e 6f 74 20 77 61 6e 74 20  we did not want 
10b0: 74 6f 20 69 6e 74 72 6f 64 75 63 65 20 73 6f 63  to introduce soc
10c0: 6b 65 74 20 68 65 61 64 65 72 73 20 69 6e 74 6f  ket headers into
10d0: 0a 2a 2a 20 74 68 65 20 73 6f 63 6b 65 74 20 6e  .** the socket n
10e0: 65 74 75 72 61 6c 20 62 6c 6f 62 2e 63 20 66 69  etural blob.c fi
10f0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 6f 63 6b 65  le..*/.int socke
1100: 74 5f 72 65 61 64 5f 62 6c 6f 62 28 42 6c 6f 62  t_read_blob(Blob
1110: 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 70 53 6f   *pBlob, int pSo
1120: 63 6b 49 64 2c 20 69 6e 74 20 6e 54 6f 52 65 61  ckId, int nToRea
1130: 64 29 7b 0a 20 20 69 6e 74 20 69 3d 30 2c 72 65  d){.  int i=0,re
1140: 61 64 3d 30 3b 0a 20 20 63 68 61 72 20 72 62 75  ad=0;.  char rbu
1150: 66 5b 35 30 5d 3b 0a 20 20 62 6c 6f 62 5f 7a 65  f[50];.  blob_ze
1160: 72 6f 28 70 42 6c 6f 62 29 3b 0a 20 20 77 68 69  ro(pBlob);.  whi
1170: 6c 65 20 28 20 69 3c 6e 54 6f 52 65 61 64 20 29  le ( i<nToRead )
1180: 7b 0a 20 20 20 20 72 65 61 64 20 3d 20 72 65 63  {.    read = rec
1190: 76 28 70 53 6f 63 6b 49 64 2c 20 72 62 75 66 2c  v(pSockId, rbuf,
11a0: 20 35 30 2c 20 30 29 3b 0a 20 20 20 20 69 20 2b   50, 0);.    i +
11b0: 3d 20 72 65 61 64 3b 0a 20 20 20 20 69 66 28 20  = read;.    if( 
11c0: 72 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  read<0 ){.      
11d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
11e0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28      blob_append(
11f0: 70 42 6c 6f 62 2c 20 72 62 75 66 2c 20 72 65 61  pBlob, rbuf, rea
1200: 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
1210: 20 62 6c 6f 62 5f 73 69 7a 65 28 70 42 6c 6f 62   blob_size(pBlob
1220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
1230: 20 61 20 73 69 6e 67 6c 65 20 61 74 74 65 6d 70   a single attemp
1240: 74 20 74 6f 20 74 61 6c 6b 20 74 6f 20 74 68 65  t to talk to the
1250: 20 73 65 72 76 65 72 2e 20 20 52 65 74 75 72 6e   server.  Return
1260: 20 54 52 55 45 20 6f 6e 20 73 75 63 63 65 73 73   TRUE on success
1270: 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 6f 6e  .** and FALSE on
1280: 20 61 20 66 61 69 6c 75 72 65 2e 0a 2a 2a 0a 2a   a failure..**.*
1290: 2a 20 70 48 65 61 64 65 72 20 63 6f 6e 74 61 69  * pHeader contai
12a0: 6e 73 20 74 68 65 20 48 54 54 50 20 68 65 61 64  ns the HTTP head
12b0: 65 72 2e 20 20 70 50 61 79 6c 6f 61 64 20 63 6f  er.  pPayload co
12c0: 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65  ntains the conte
12d0: 6e 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  nt..** The conte
12e0: 6e 74 20 6f 66 20 74 68 65 20 72 65 70 6c 79 20  nt of the reply 
12f0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1300: 70 52 65 70 6c 79 2e 20 20 70 52 65 70 6c 79 20  pReply.  pReply 
1310: 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74 6f  is assumed.** to
1320: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
1330: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20  d prior to this 
1340: 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  call..**.** If a
1350: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1360: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1370: 75 72 6e 20 66 61 6c 73 65 2c 20 72 65 73 65 74  urn false, reset
1380: 73 20 70 52 65 70 6c 79 20 61 6e 64 0a 2a 2a 20  s pReply and.** 
1390: 63 6c 6f 73 65 73 20 74 68 65 20 70 65 72 73 69  closes the persi
13a0: 73 74 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  stent connection
13b0: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61  , if any..*/.sta
13c0: 74 69 63 20 69 6e 74 20 68 74 74 70 5f 73 65 6e  tic int http_sen
13d0: 64 5f 72 65 63 76 28 42 6c 6f 62 20 2a 70 48 65  d_recv(Blob *pHe
13e0: 61 64 65 72 2c 20 42 6c 6f 62 20 2a 70 50 61 79  ader, Blob *pPay
13f0: 6c 6f 61 64 2c 20 42 6c 6f 62 20 2a 70 52 65 70  load, Blob *pRep
1400: 6c 79 29 7b 0a 20 20 69 6e 74 20 63 6c 6f 73 65  ly){.  int close
1410: 43 6f 6e 6e 65 63 74 69 6f 6e 3d 31 3b 20 20 20  Connection=1;   
1420: 2f 2a 20 64 65 66 61 75 6c 74 20 74 6f 20 63 6c  /* default to cl
1430: 6f 73 69 6e 67 20 74 68 65 20 63 6f 6e 6e 65 63  osing the connec
1440: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
1450: 3b 0a 20 20 69 6e 74 20 69 4c 65 6e 67 74 68 3b  ;.  int iLength;
1460: 0a 20 20 69 6e 74 20 69 48 74 74 70 56 65 72 73  .  int iHttpVers
1470: 69 6f 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ion;.  int i;.  
1480: 69 6e 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61  int nRead;.  cha
1490: 72 20 7a 4c 69 6e 65 5b 32 30 30 30 5d 3b 0a 0a  r zLine[2000];..
14a0: 20 20 69 66 28 20 70 53 6f 63 6b 65 74 3d 3d 30    if( pSocket==0
14b0: 20 26 26 20 68 74 74 70 5f 6f 70 65 6e 5f 73 6f   && http_open_so
14c0: 63 6b 65 74 28 29 20 29 7b 0a 20 20 20 20 72 65  cket() ){.    re
14d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 4c  turn 0;.  }.  iL
14e0: 65 6e 67 74 68 20 3d 20 2d 31 3b 0a 23 69 66 64  ength = -1;.#ifd
14f0: 65 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 20  ef __MINGW32__. 
1500: 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 20 72 65 63   /*.  ** Use rec
1510: 76 2f 73 65 6e 64 20 6f 6e 20 74 68 65 20 77 69  v/send on the wi
1520: 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 20 61  ndows platform a
1530: 73 20 77 69 6e 73 6f 63 6b 20 64 6f 65 73 20 6e  s winsock does n
1540: 6f 74 20 61 6c 6c 6f 77 0a 20 20 2a 2a 20 73 6f  ot allow.  ** so
1550: 63 6b 65 74 73 20 74 6f 20 62 65 20 75 73 65 64  ckets to be used
1560: 20 61 73 20 46 49 4c 45 20 68 61 6e 64 6c 65 73   as FILE handles
1570: 2c 20 74 68 75 73 20 66 64 6f 70 65 6e 2c 20 66  , thus fdopen, f
1580: 77 72 69 74 65 2c 20 66 67 65 74 73 0a 20 20 2a  write, fgets.  *
1590: 2a 20 64 6f 65 73 20 6e 6f 74 20 66 75 6e 63 74  * does not funct
15a0: 69 6f 6e 20 6f 6e 20 77 69 6e 64 6f 77 73 20 66  ion on windows f
15b0: 6f 72 20 73 6f 63 6b 65 74 73 2e 0a 20 20 2a 2f  or sockets..  */
15c0: 0a 20 20 72 63 20 3d 20 73 65 6e 64 28 70 53 6f  .  rc = send(pSo
15d0: 63 6b 65 74 2c 20 62 6c 6f 62 5f 62 75 66 66 65  cket, blob_buffe
15e0: 72 28 70 48 65 61 64 65 72 29 2c 20 62 6c 6f 62  r(pHeader), blob
15f0: 5f 73 69 7a 65 28 70 48 65 61 64 65 72 29 2c 20  _size(pHeader), 
1600: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 62 6c  0);.  if( rc!=bl
1610: 6f 62 5f 73 69 7a 65 28 70 48 65 61 64 65 72 29  ob_size(pHeader)
1620: 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f 65 72   ) goto write_er
1630: 72 3b 0a 20 20 72 63 20 3d 20 73 65 6e 64 28 70  r;.  rc = send(p
1640: 53 6f 63 6b 65 74 2c 20 62 6c 6f 62 5f 62 75 66  Socket, blob_buf
1650: 66 65 72 28 70 50 61 79 6c 6f 61 64 29 2c 20 62  fer(pPayload), b
1660: 6c 6f 62 5f 73 69 7a 65 28 70 50 61 79 6c 6f 61  lob_size(pPayloa
1670: 64 29 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  d), 0);.  if( rc
1680: 21 3d 62 6c 6f 62 5f 73 69 7a 65 28 70 50 61 79  !=blob_size(pPay
1690: 6c 6f 61 64 29 20 29 20 67 6f 74 6f 20 77 72 69  load) ) goto wri
16a0: 74 65 5f 65 72 72 3b 0a 20 20 0a 20 20 2f 2a 20  te_err;.  .  /* 
16b0: 52 65 61 64 20 74 68 65 20 72 65 73 70 6f 6e 73  Read the respons
16c0: 65 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 6f  e */.  while( so
16d0: 63 6b 65 74 5f 72 65 63 76 5f 6c 69 6e 65 28 70  cket_recv_line(p
16e0: 53 6f 63 6b 65 74 2c 20 7a 4c 69 6e 65 2c 20 32  Socket, zLine, 2
16f0: 30 30 30 29 20 29 7b 0a 20 20 20 20 66 6f 72 28  000) ){.    for(
1700: 20 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26   i=0; zLine[i] &
1710: 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 5c 6e 27  & zLine[i]!='\n'
1720: 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 5c   && zLine[i]!='\
1730: 72 27 3b 20 69 2b 2b 20 29 7b 7d 0a 20 20 20 20  r'; i++ ){}.    
1740: 69 66 28 20 69 3d 3d 30 20 29 20 62 72 65 61 6b  if( i==0 ) break
1750: 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d  ;.    zLine[i] =
1760: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e   0;.    if( strn
1770: 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 20 22  casecmp(zLine, "
1780: 68 74 74 70 2f 31 2e 22 2c 20 37 29 3d 3d 30 20  http/1.", 7)==0 
1790: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 73 63  ){.      if( ssc
17a0: 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 48 54 54 50  anf(zLine, "HTTP
17b0: 2f 31 2e 25 64 20 25 64 22 2c 20 26 69 48 74 74  /1.%d %d", &iHtt
17c0: 70 56 65 72 73 69 6f 6e 2c 20 26 72 63 29 21 3d  pVersion, &rc)!=
17d0: 32 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f 65  2 ) goto write_e
17e0: 72 72 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  rr;.      if( rc
17f0: 21 3d 32 30 30 20 29 20 67 6f 74 6f 20 77 72 69  !=200 ) goto wri
1800: 74 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 69 66  te_err;.      if
1810: 28 20 69 48 74 74 70 56 65 72 73 69 6f 6e 3d 3d  ( iHttpVersion==
1820: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
1830: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31  seConnection = 1
1840: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1850: 20 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e         closeConn
1860: 65 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  ection = 0;.    
1870: 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69    }.    } else i
1880: 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a  f( strncasecmp(z
1890: 4c 69 6e 65 2c 20 22 63 6f 6e 74 65 6e 74 2d 6c  Line, "content-l
18a0: 65 6e 67 74 68 3a 22 2c 20 31 35 29 3d 3d 30 20  ength:", 15)==0 
18b0: 29 7b 0a 20 20 20 20 20 20 69 4c 65 6e 67 74 68  ){.      iLength
18c0: 20 3d 20 61 74 6f 69 28 26 7a 4c 69 6e 65 5b 31   = atoi(&zLine[1
18d0: 36 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  6]);.    }else i
18e0: 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a  f( strncasecmp(z
18f0: 4c 69 6e 65 2c 20 22 63 6f 6e 6e 65 63 74 69 6f  Line, "connectio
1900: 6e 3a 22 2c 20 31 31 29 3d 3d 30 20 29 7b 0a 20  n:", 11)==0 ){. 
1910: 20 20 20 20 20 66 6f 72 28 69 3d 31 32 3b 20 69       for(i=12; i
1920: 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29  sspace(zLine[i])
1930: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69  ; i++){}.      i
1940: 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 63 27  f( zLine[i]=='c'
1950: 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 43   || zLine[i]=='C
1960: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  ' ){.        clo
1970: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31  seConnection = 1
1980: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1990: 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 6b 27 20  ( zLine[i]=='k' 
19a0: 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 4b 27  || zLine[i]=='K'
19b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73   ){.        clos
19c0: 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b  eConnection = 0;
19d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19e0: 20 7d 0a 20 20 69 66 28 20 69 4c 65 6e 67 74 68   }.  if( iLength
19f0: 3c 30 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f  <0 ) goto write_
1a00: 65 72 72 3b 0a 20 20 6e 52 65 61 64 20 3d 20 73  err;.  nRead = s
1a10: 6f 63 6b 65 74 5f 72 65 61 64 5f 62 6c 6f 62 28  ocket_read_blob(
1a20: 70 52 65 70 6c 79 2c 20 70 53 6f 63 6b 65 74 2c  pReply, pSocket,
1a30: 20 69 4c 65 6e 67 74 68 29 3b 0a 23 65 6c 73 65   iLength);.#else
1a40: 0a 20 20 72 63 20 3d 20 66 77 72 69 74 65 28 62  .  rc = fwrite(b
1a50: 6c 6f 62 5f 62 75 66 66 65 72 28 70 48 65 61 64  lob_buffer(pHead
1a60: 65 72 29 2c 20 31 2c 20 62 6c 6f 62 5f 73 69 7a  er), 1, blob_siz
1a70: 65 28 70 48 65 61 64 65 72 29 2c 20 70 53 6f 63  e(pHeader), pSoc
1a80: 6b 65 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ket);.  if( rc!=
1a90: 62 6c 6f 62 5f 73 69 7a 65 28 70 48 65 61 64 65  blob_size(pHeade
1aa0: 72 29 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f  r) ) goto write_
1ab0: 65 72 72 3b 0a 20 20 72 63 20 3d 20 66 77 72 69  err;.  rc = fwri
1ac0: 74 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70  te(blob_buffer(p
1ad0: 50 61 79 6c 6f 61 64 29 2c 20 31 2c 20 62 6c 6f  Payload), 1, blo
1ae0: 62 5f 73 69 7a 65 28 70 50 61 79 6c 6f 61 64 29  b_size(pPayload)
1af0: 2c 20 70 53 6f 63 6b 65 74 29 3b 0a 20 20 69 66  , pSocket);.  if
1b00: 28 20 72 63 21 3d 62 6c 6f 62 5f 73 69 7a 65 28  ( rc!=blob_size(
1b10: 70 50 61 79 6c 6f 61 64 29 20 29 20 67 6f 74 6f  pPayload) ) goto
1b20: 20 77 72 69 74 65 5f 65 72 72 3b 0a 20 20 69 66   write_err;.  if
1b30: 28 20 66 66 6c 75 73 68 28 70 53 6f 63 6b 65 74  ( fflush(pSocket
1b40: 29 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f 65  ) ) goto write_e
1b50: 72 72 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28  rr;.  if( fgets(
1b60: 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c  zLine, sizeof(zL
1b70: 69 6e 65 29 2c 20 70 53 6f 63 6b 65 74 29 3d 3d  ine), pSocket)==
1b80: 30 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f 65  0 ) goto write_e
1b90: 72 72 3b 0a 20 20 69 66 28 20 73 73 63 61 6e 66  rr;.  if( sscanf
1ba0: 28 7a 4c 69 6e 65 2c 20 22 48 54 54 50 2f 31 2e  (zLine, "HTTP/1.
1bb0: 25 64 20 25 64 22 2c 20 26 69 48 74 74 70 56 65  %d %d", &iHttpVe
1bc0: 72 73 69 6f 6e 2c 20 26 72 63 29 21 3d 32 20 29  rsion, &rc)!=2 )
1bd0: 20 67 6f 74 6f 20 77 72 69 74 65 5f 65 72 72 3b   goto write_err;
1be0: 0a 20 20 69 66 28 20 72 63 21 3d 32 30 30 20 29  .  if( rc!=200 )
1bf0: 20 67 6f 74 6f 20 77 72 69 74 65 5f 65 72 72 3b   goto write_err;
1c00: 0a 20 20 69 66 28 20 69 48 74 74 70 56 65 72 73  .  if( iHttpVers
1c10: 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c  ion==0 ){.    cl
1c20: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
1c30: 31 3b 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  1;   /* Connecti
1c40: 6f 6e 3a 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 7d  on: close */.  }
1c50: 65 6c 73 65 7b 0a 20 20 20 20 63 6c 6f 73 65 43  else{.    closeC
1c60: 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 30 3b 20 20  onnection = 0;  
1c70: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20   /* Connection: 
1c80: 6b 65 65 70 2d 61 6c 69 76 65 20 2a 2f 0a 20 20  keep-alive */.  
1c90: 7d 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  }.  while( fgets
1ca0: 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a  (zLine, sizeof(z
1cb0: 4c 69 6e 65 29 2c 20 70 53 6f 63 6b 65 74 29 20  Line), pSocket) 
1cc0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
1cd0: 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e  zLine[i] && zLin
1ce0: 65 5b 69 5d 21 3d 27 5c 6e 27 20 26 26 20 7a 4c  e[i]!='\n' && zL
1cf0: 69 6e 65 5b 69 5d 21 3d 27 5c 72 27 3b 20 69 2b  ine[i]!='\r'; i+
1d00: 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d  +){}.    if( i==
1d10: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a  0 ) break;.    z
1d20: 4c 69 6e 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Line[i] = 0;.   
1d30: 20 69 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70   if( strncasecmp
1d40: 28 7a 4c 69 6e 65 2c 22 63 6f 6e 74 65 6e 74 2d  (zLine,"content-
1d50: 6c 65 6e 67 74 68 3a 22 2c 31 35 29 3d 3d 30 20  length:",15)==0 
1d60: 29 7b 0a 20 20 20 20 20 20 69 4c 65 6e 67 74 68  ){.      iLength
1d70: 20 3d 20 61 74 6f 69 28 26 7a 4c 69 6e 65 5b 31   = atoi(&zLine[1
1d80: 36 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  6]);.    }else i
1d90: 66 28 20 73 74 72 6e 63 61 73 65 63 6d 70 28 7a  f( strncasecmp(z
1da0: 4c 69 6e 65 2c 20 22 63 6f 6e 6e 65 63 74 69 6f  Line, "connectio
1db0: 6e 3a 22 2c 20 31 31 29 3d 3d 30 20 29 7b 0a 20  n:", 11)==0 ){. 
1dc0: 20 20 20 20 20 66 6f 72 28 69 3d 31 32 3b 20 69       for(i=12; i
1dd0: 73 73 70 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29  sspace(zLine[i])
1de0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69  ; i++){}.      i
1df0: 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 63 27  f( zLine[i]=='c'
1e00: 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 43   || zLine[i]=='C
1e10: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  ' ){.        clo
1e20: 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20 31  seConnection = 1
1e30: 3b 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f  ;   /* Connectio
1e40: 6e 3a 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  n: close */.    
1e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6e    }else if( zLin
1e60: 65 5b 69 5d 3d 3d 27 6b 27 20 7c 7c 20 7a 4c 69  e[i]=='k' || zLi
1e70: 6e 65 5b 69 5d 3d 3d 27 4b 27 20 29 7b 0a 20 20  ne[i]=='K' ){.  
1e80: 20 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65        closeConne
1e90: 63 74 69 6f 6e 20 3d 20 30 3b 20 20 20 2f 2a 20  ction = 0;   /* 
1ea0: 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 6b 65 65 70  Connection: keep
1eb0: 2d 61 6c 69 76 65 20 2a 2f 0a 20 20 20 20 20 20  -alive */.      
1ec0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
1ed0: 28 20 69 4c 65 6e 67 74 68 3c 30 20 29 20 67 6f  ( iLength<0 ) go
1ee0: 74 6f 20 77 72 69 74 65 5f 65 72 72 3b 0a 20 20  to write_err;.  
1ef0: 6e 52 65 61 64 20 3d 20 62 6c 6f 62 5f 72 65 61  nRead = blob_rea
1f00: 64 5f 66 72 6f 6d 5f 63 68 61 6e 6e 65 6c 28 70  d_from_channel(p
1f10: 52 65 70 6c 79 2c 20 70 53 6f 63 6b 65 74 2c 20  Reply, pSocket, 
1f20: 69 4c 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66  iLength);.#endif
1f30: 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 69 4c  .  if( nRead!=iL
1f40: 65 6e 67 74 68 20 29 7b 0a 20 20 20 20 62 6c 6f  ength ){.    blo
1f50: 62 5f 72 65 73 65 74 28 70 52 65 70 6c 79 29 3b  b_reset(pReply);
1f60: 0a 20 20 20 20 67 6f 74 6f 20 77 72 69 74 65 5f  .    goto write_
1f70: 65 72 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  err;.  }.  if( c
1f80: 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 29  loseConnection )
1f90: 7b 0a 20 20 20 20 68 74 74 70 5f 63 6c 6f 73 65  {.    http_close
1fa0: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
1fb0: 20 31 3b 20 20 0a 0a 77 72 69 74 65 5f 65 72 72   1;  ..write_err
1fc0: 3a 0a 20 20 68 74 74 70 5f 63 6c 6f 73 65 28 29  :.  http_close()
1fd0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1fe0: 0a 2f 2a 0a 2a 2a 20 53 69 67 6e 20 74 68 65 20  ./*.** Sign the 
1ff0: 63 6f 6e 74 65 6e 74 20 69 6e 20 70 53 65 6e 64  content in pSend
2000: 2c 20 63 6f 6d 70 72 65 73 73 20 69 74 2c 20 61  , compress it, a
2010: 6e 64 20 73 65 6e 64 20 69 74 20 74 6f 20 74 68  nd send it to th
2020: 65 20 73 65 72 76 65 72 0a 2a 2a 20 76 69 61 20  e server.** via 
2030: 48 54 54 50 2e 20 20 47 65 74 20 61 20 72 65 70  HTTP.  Get a rep
2040: 6c 79 2c 20 75 6e 63 6f 6d 70 72 65 73 73 20 74  ly, uncompress t
2050: 68 65 20 72 65 70 6c 79 2c 20 61 6e 64 20 73 74  he reply, and st
2060: 6f 72 65 20 74 68 65 20 72 65 70 6c 79 0a 2a 2a  ore the reply.**
2070: 20 69 6e 20 70 52 65 63 76 2e 20 20 70 52 65 63   in pRecv.  pRec
2080: 76 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  v is assumed to 
2090: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
20a0: 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   when.** this ro
20b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
20c0: 2d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  - this routine w
20d0: 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  ill initialize i
20e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 72  t..**.** The ser
20f0: 76 65 72 20 61 64 64 72 65 73 73 20 69 73 20 63  ver address is c
2100: 6f 6e 74 61 69 6e 20 69 6e 20 74 68 65 20 22 67  ontain in the "g
2110: 22 20 67 6c 6f 62 61 6c 20 73 74 72 75 63 74 75  " global structu
2120: 72 65 2e 20 20 54 68 65 0a 2a 2a 20 75 72 6c 5f  re.  The.** url_
2130: 70 61 72 73 65 28 29 20 72 6f 75 74 69 6e 65 20  parse() routine 
2140: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
2150: 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
2160: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2170: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69 6c   in order to fil
2180: 6c 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  l this structure
2190: 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e 0a   appropriately..
21a0: 2a 2f 0a 76 6f 69 64 20 68 74 74 70 5f 65 78 63  */.void http_exc
21b0: 68 61 6e 67 65 28 42 6c 6f 62 20 2a 70 53 65 6e  hange(Blob *pSen
21c0: 64 2c 20 42 6c 6f 62 20 2a 70 52 65 63 76 29 7b  d, Blob *pRecv){
21d0: 0a 20 20 42 6c 6f 62 20 6c 6f 67 69 6e 2c 20 6e  .  Blob login, n
21e0: 6f 6e 63 65 2c 20 73 69 67 2c 20 70 77 2c 20 70  once, sig, pw, p
21f0: 61 79 6c 6f 61 64 2c 20 68 64 72 3b 0a 20 20 63  ayload, hdr;.  c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b  onst char *zSep;
2210: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2220: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 62 6c 6f 62  cnt = 0;..  blob
2230: 5f 7a 65 72 6f 28 26 6e 6f 6e 63 65 29 3b 0a 20  _zero(&nonce);. 
2240: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 77 29 3b   blob_zero(&pw);
2250: 0a 20 20 73 68 61 31 73 75 6d 5f 62 6c 6f 62 28  .  sha1sum_blob(
2260: 70 53 65 6e 64 2c 20 26 6e 6f 6e 63 65 29 3b 0a  pSend, &nonce);.
2270: 20 20 62 6c 6f 62 5f 63 6f 70 79 28 26 70 77 2c    blob_copy(&pw,
2280: 20 26 6e 6f 6e 63 65 29 3b 0a 20 20 62 6c 6f 62   &nonce);.  blob
2290: 5f 7a 65 72 6f 28 26 6c 6f 67 69 6e 29 3b 0a 20  _zero(&login);. 
22a0: 20 69 66 28 20 67 2e 75 72 6c 55 73 65 72 3d 3d   if( g.urlUser==
22b0: 30 20 29 7b 0a 20 20 20 20 75 73 65 72 5f 73 65  0 ){.    user_se
22c0: 6c 65 63 74 28 29 3b 0a 20 20 20 20 64 62 5f 62  lect();.    db_b
22d0: 6c 6f 62 28 26 70 77 2c 20 22 53 45 4c 45 43 54  lob(&pw, "SELECT
22e0: 20 70 77 20 46 52 4f 4d 20 75 73 65 72 20 57 48   pw FROM user WH
22f0: 45 52 45 20 75 69 64 3d 25 64 22 2c 20 67 2e 75  ERE uid=%d", g.u
2300: 73 65 72 55 69 64 29 3b 0a 20 20 20 20 73 68 61  serUid);.    sha
2310: 31 73 75 6d 5f 62 6c 6f 62 28 26 70 77 2c 20 26  1sum_blob(&pw, &
2320: 73 69 67 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61  sig);.    blob_a
2330: 70 70 65 6e 64 66 28 26 6c 6f 67 69 6e 2c 20 22  ppendf(&login, "
2340: 6c 6f 67 69 6e 20 25 73 20 25 62 20 25 62 5c 6e  login %s %b %b\n
2350: 22 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20 26 6e 6f  ", g.zLogin, &no
2360: 6e 63 65 2c 20 26 73 69 67 29 3b 0a 20 20 7d 65  nce, &sig);.  }e
2370: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 67 2e 75  lse{.    if( g.u
2380: 72 6c 50 61 73 73 77 64 3d 3d 30 20 29 7b 0a 20  rlPasswd==0 ){. 
2390: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
23a0: 67 2e 75 72 6c 55 73 65 72 2c 22 61 6e 6f 6e 79  g.urlUser,"anony
23b0: 6d 6f 75 73 22 29 21 3d 30 20 29 7b 0a 20 20 20  mous")!=0 ){.   
23c0: 20 20 20 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d       char *zProm
23d0: 70 74 20 3d 20 6d 70 72 69 6e 74 66 28 22 70 61  pt = mprintf("pa
23e0: 73 73 77 6f 72 64 20 66 6f 72 20 25 73 3a 20 22  ssword for %s: "
23f0: 2c 20 67 2e 75 72 6c 55 73 65 72 29 3b 0a 20 20  , g.urlUser);.  
2400: 20 20 20 20 20 20 42 6c 6f 62 20 78 3b 0a 20 20        Blob x;.  
2410: 20 20 20 20 20 20 70 72 6f 6d 70 74 5f 66 6f 72        prompt_for
2420: 5f 70 61 73 73 77 6f 72 64 28 7a 50 72 6f 6d 70  _password(zPromp
2430: 74 2c 20 26 78 2c 20 30 29 3b 0a 20 20 20 20 20  t, &x, 0);.     
2440: 20 20 20 66 72 65 65 28 7a 50 72 6f 6d 70 74 29     free(zPrompt)
2450: 3b 0a 20 20 20 20 20 20 20 20 67 2e 75 72 6c 50  ;.        g.urlP
2460: 61 73 73 77 64 20 3d 20 62 6c 6f 62 5f 73 74 72  asswd = blob_str
2470: 28 26 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (&x);.      }els
2480: 65 7b 0a 20 20 20 20 20 20 20 20 67 2e 75 72 6c  e{.        g.url
2490: 50 61 73 73 77 64 20 3d 20 22 22 3b 0a 20 20 20  Passwd = "";.   
24a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
24b0: 6c 6f 62 5f 61 70 70 65 6e 64 28 26 70 77 2c 20  lob_append(&pw, 
24c0: 67 2e 75 72 6c 50 61 73 73 77 64 2c 20 2d 31 29  g.urlPasswd, -1)
24d0: 3b 0a 20 20 20 20 2f 2a 20 70 72 69 6e 74 66 28  ;.    /* printf(
24e0: 22 70 72 65 73 69 67 3d 5b 25 73 5d 5c 6e 22 2c  "presig=[%s]\n",
24f0: 20 62 6c 6f 62 5f 73 74 72 28 26 70 77 29 29 3b   blob_str(&pw));
2500: 20 2a 2f 0a 20 20 20 20 73 68 61 31 73 75 6d 5f   */.    sha1sum_
2510: 62 6c 6f 62 28 26 70 77 2c 20 26 73 69 67 29 3b  blob(&pw, &sig);
2520: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  .    blob_append
2530: 66 28 26 6c 6f 67 69 6e 2c 20 22 6c 6f 67 69 6e  f(&login, "login
2540: 20 25 73 20 25 62 20 25 62 5c 6e 22 2c 20 67 2e   %s %b %b\n", g.
2550: 75 72 6c 55 73 65 72 2c 20 26 6e 6f 6e 63 65 2c  urlUser, &nonce,
2560: 20 26 73 69 67 29 3b 0a 20 20 7d 20 20 20 20 20   &sig);.  }     
2570: 20 20 20 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74     .  blob_reset
2580: 28 26 6e 6f 6e 63 65 29 3b 0a 20 20 62 6c 6f 62  (&nonce);.  blob
2590: 5f 72 65 73 65 74 28 26 70 77 29 3b 0a 20 20 62  _reset(&pw);.  b
25a0: 6c 6f 62 5f 72 65 73 65 74 28 26 73 69 67 29 3b  lob_reset(&sig);
25b0: 0a 20 20 69 66 28 20 67 2e 66 48 74 74 70 54 72  .  if( g.fHttpTr
25c0: 61 63 65 20 29 7b 0a 20 20 20 20 70 61 79 6c 6f  ace ){.    paylo
25d0: 61 64 20 3d 20 6c 6f 67 69 6e 3b 0a 20 20 20 20  ad = login;.    
25e0: 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 70 61 79  blob_append(&pay
25f0: 6c 6f 61 64 2c 20 62 6c 6f 62 5f 62 75 66 66 65  load, blob_buffe
2600: 72 28 70 53 65 6e 64 29 2c 20 62 6c 6f 62 5f 73  r(pSend), blob_s
2610: 69 7a 65 28 70 53 65 6e 64 29 29 3b 0a 20 20 7d  ize(pSend));.  }
2620: 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 63  else{.    blob_c
2630: 6f 6d 70 72 65 73 73 32 28 26 6c 6f 67 69 6e 2c  ompress2(&login,
2640: 20 70 53 65 6e 64 2c 20 26 70 61 79 6c 6f 61 64   pSend, &payload
2650: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65  );.    blob_rese
2660: 74 28 26 6c 6f 67 69 6e 29 3b 0a 20 20 7d 0a 20  t(&login);.  }. 
2670: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 68 64 72 29   blob_zero(&hdr)
2680: 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 67  ;.  i = strlen(g
2690: 2e 75 72 6c 50 61 74 68 29 3b 0a 20 20 69 66 28  .urlPath);.  if(
26a0: 20 69 3e 30 20 26 26 20 67 2e 75 72 6c 50 61 74   i>0 && g.urlPat
26b0: 68 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29 7b 0a 20  h[i-1]=='/' ){. 
26c0: 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20     zSep = "";.  
26d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20  }else{.    zSep 
26e0: 3d 20 22 2f 22 3b 0a 20 20 7d 0a 20 20 62 6c 6f  = "/";.  }.  blo
26f0: 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20  b_appendf(&hdr, 
2700: 22 50 4f 53 54 20 25 73 25 73 78 66 65 72 20 48  "POST %s%sxfer H
2710: 54 54 50 2f 31 2e 31 5c 72 5c 6e 22 2c 20 67 2e  TTP/1.1\r\n", g.
2720: 75 72 6c 50 61 74 68 2c 20 7a 53 65 70 29 3b 0a  urlPath, zSep);.
2730: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
2740: 68 64 72 2c 20 22 48 6f 73 74 3a 20 25 73 3a 25  hdr, "Host: %s:%
2750: 64 5c 72 5c 6e 22 2c 20 67 2e 75 72 6c 4e 61 6d  d\r\n", g.urlNam
2760: 65 2c 20 67 2e 75 72 6c 50 6f 72 74 29 3b 0a 20  e, g.urlPort);. 
2770: 20 69 66 28 20 67 2e 66 48 74 74 70 54 72 61 63   if( g.fHttpTrac
2780: 65 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70  e ){.    blob_ap
2790: 70 65 6e 64 66 28 26 68 64 72 2c 20 22 43 6f 6e  pendf(&hdr, "Con
27a0: 74 65 6e 74 2d 54 79 70 65 3a 20 61 70 70 6c 69  tent-Type: appli
27b0: 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 2d  cation/x-fossil-
27c0: 64 65 62 75 67 5c 72 5c 6e 22 29 3b 0a 20 20 7d  debug\r\n");.  }
27d0: 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  else{.    blob_a
27e0: 70 70 65 6e 64 66 28 26 68 64 72 2c 20 22 43 6f  ppendf(&hdr, "Co
27f0: 6e 74 65 6e 74 2d 54 79 70 65 3a 20 61 70 70 6c  ntent-Type: appl
2800: 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c  ication/x-fossil
2810: 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 62 6c  \r\n");.  }.  bl
2820: 6f 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c  ob_appendf(&hdr,
2830: 20 22 43 6f 6e 74 65 6e 74 2d 4c 65 6e 67 74 68   "Content-Length
2840: 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 22 2c 20 62  : %d\r\n\r\n", b
2850: 6c 6f 62 5f 73 69 7a 65 28 26 70 61 79 6c 6f 61  lob_size(&payloa
2860: 64 29 29 3b 0a 0a 20 20 69 66 28 20 67 2e 66 48  d));..  if( g.fH
2870: 74 74 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  ttpTrace ){.    
2880: 2f 2a 20 57 68 65 6e 20 74 72 61 63 69 6e 67 2c  /* When tracing,
2890: 20 77 72 69 74 65 20 74 68 65 20 74 72 61 6e 73   write the trans
28a0: 6d 69 74 74 65 64 20 48 54 54 50 20 6d 65 73 73  mitted HTTP mess
28b0: 61 67 65 20 62 6f 74 68 20 74 6f 20 73 74 61 6e  age both to stan
28c0: 64 61 72 64 0a 20 20 20 20 2a 2a 20 6f 75 74 70  dard.    ** outp
28d0: 75 74 20 61 6e 64 20 69 6e 74 6f 20 61 20 66 69  ut and into a fi
28e0: 6c 65 2e 20 20 54 68 65 20 66 69 6c 65 20 63 61  le.  The file ca
28f0: 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20 74  n then be used t
2900: 6f 20 64 72 69 76 65 20 74 68 65 0a 20 20 20 20  o drive the.    
2910: 2a 2a 20 73 65 72 76 65 72 2d 73 69 64 65 20 6c  ** server-side l
2920: 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
2930: 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2e 2f 66  .    **      ./f
2940: 6f 73 73 69 6c 20 68 74 74 70 20 3c 68 74 74 70  ossil http <http
2950: 2d 74 72 61 63 65 2d 31 2e 74 78 74 0a 20 20 20  -trace-1.txt.   
2960: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 69   */.    static i
2970: 6e 74 20 74 72 61 63 65 43 6e 74 20 3d 20 30 3b  nt traceCnt = 0;
2980: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 46  .    char *zOutF
2990: 69 6c 65 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  ile;.    FILE *o
29a0: 75 74 3b 0a 20 20 20 20 74 72 61 63 65 43 6e 74  ut;.    traceCnt
29b0: 2b 2b 3b 0a 20 20 20 20 7a 4f 75 74 46 69 6c 65  ++;.    zOutFile
29c0: 20 3d 20 6d 70 72 69 6e 74 66 28 22 68 74 74 70   = mprintf("http
29d0: 2d 74 72 61 63 65 2d 25 64 2e 74 78 74 22 2c 20  -trace-%d.txt", 
29e0: 74 72 61 63 65 43 6e 74 29 3b 0a 20 20 20 20 70  traceCnt);.    p
29f0: 72 69 6e 74 66 28 22 48 54 54 50 20 53 45 4e 44  rintf("HTTP SEND
2a00: 3a 20 28 25 73 29 5c 6e 25 73 25 73 3d 3d 3d 3d  : (%s)\n%s%s====
2a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a20: 3d 3d 3d 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  ===\n", .       
2a30: 20 7a 4f 75 74 46 69 6c 65 2c 20 62 6c 6f 62 5f   zOutFile, blob_
2a40: 73 74 72 28 26 68 64 72 29 2c 20 62 6c 6f 62 5f  str(&hdr), blob_
2a50: 73 74 72 28 26 70 61 79 6c 6f 61 64 29 29 3b 0a  str(&payload));.
2a60: 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28      out = fopen(
2a70: 7a 4f 75 74 46 69 6c 65 2c 20 22 77 22 29 3b 0a  zOutFile, "w");.
2a80: 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
2a90: 20 20 20 20 20 66 77 72 69 74 65 28 62 6c 6f 62       fwrite(blob
2aa0: 5f 62 75 66 66 65 72 28 26 68 64 72 29 2c 20 31  _buffer(&hdr), 1
2ab0: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 68 64 72  , blob_size(&hdr
2ac0: 29 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ), out);.      f
2ad0: 77 72 69 74 65 28 62 6c 6f 62 5f 62 75 66 66 65  write(blob_buffe
2ae0: 72 28 26 70 61 79 6c 6f 61 64 29 2c 20 31 2c 20  r(&payload), 1, 
2af0: 62 6c 6f 62 5f 73 69 7a 65 28 26 70 61 79 6c 6f  blob_size(&paylo
2b00: 61 64 29 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  ad), out);.     
2b10: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
2b20: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 63 6e    }.  }.  for(cn
2b30: 74 3d 30 3b 20 63 6e 74 3c 32 3b 20 63 6e 74 2b  t=0; cnt<2; cnt+
2b40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 68 74 74 70  +){.    if( http
2b50: 5f 73 65 6e 64 5f 72 65 63 76 28 26 68 64 72 2c  _send_recv(&hdr,
2b60: 20 26 70 61 79 6c 6f 61 64 2c 20 70 52 65 63 76   &payload, pRecv
2b70: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
2b80: 20 69 66 28 20 63 6e 74 3e 3d 32 20 29 7b 0a 20   if( cnt>=2 ){. 
2b90: 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28     fossil_panic(
2ba0: 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73  "connection to s
2bb0: 65 72 76 65 72 20 66 61 69 6c 65 64 22 29 3b 0a  erver failed");.
2bc0: 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74    }.  blob_reset
2bd0: 28 26 68 64 72 29 3b 0a 20 20 62 6c 6f 62 5f 72  (&hdr);.  blob_r
2be0: 65 73 65 74 28 26 70 61 79 6c 6f 61 64 29 3b 0a  eset(&payload);.
2bf0: 20 20 69 66 28 20 67 2e 66 48 74 74 70 54 72 61    if( g.fHttpTra
2c00: 63 65 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ce ){.    printf
2c10: 28 22 48 54 54 50 20 52 45 43 45 49 56 45 3a 5c  ("HTTP RECEIVE:\
2c20: 6e 25 73 5c 6e 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  n%s\n===========
2c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 5c 6e 22 2c  ============\n",
2c40: 20 62 6c 6f 62 5f 73 74 72 28 70 52 65 63 76 29   blob_str(pRecv)
2c50: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c60: 62 6c 6f 62 5f 75 6e 63 6f 6d 70 72 65 73 73 28  blob_uncompress(
2c70: 70 52 65 63 76 2c 20 70 52 65 63 76 29 3b 0a 20  pRecv, pRecv);. 
2c80: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b   }.}.../*.** Mak
2c90: 65 20 73 75 72 65 20 74 68 65 20 73 6f 63 6b 65  e sure the socke
2ca0: 74 20 74 6f 20 74 68 65 20 48 54 54 50 20 73 65  t to the HTTP se
2cb0: 72 76 65 72 20 69 73 20 63 6c 6f 73 65 64 20 0a  rver is closed .
2cc0: 2a 2f 0a 76 6f 69 64 20 68 74 74 70 5f 63 6c 6f  */.void http_clo
2cd0: 73 65 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  se(void){.  if( 
2ce0: 70 53 6f 63 6b 65 74 20 29 7b 0a 23 69 66 64 65  pSocket ){.#ifde
2cf0: 66 20 5f 5f 4d 49 4e 47 57 33 32 5f 5f 0a 20 20  f __MINGW32__.  
2d00: 20 20 63 6c 6f 73 65 73 6f 63 6b 65 74 28 70 53    closesocket(pS
2d10: 6f 63 6b 65 74 29 3b 0a 23 65 6c 73 65 0a 20 20  ocket);.#else.  
2d20: 20 20 66 63 6c 6f 73 65 28 70 53 6f 63 6b 65 74    fclose(pSocket
2d30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53  );.#endif.    pS
2d40: 6f 63 6b 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  ocket = 0;.  }. 
2d50: 20 2f 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   /*.  ** This is
2d60: 20 63 6f 75 6e 74 65 72 20 70 72 6f 64 75 63 74   counter product
2d70: 69 76 65 2e 20 45 61 63 68 20 74 69 6d 65 20 77  ive. Each time w
2d80: 65 20 6f 70 65 6e 20 61 20 63 6f 6e 6e 65 63 74  e open a connect
2d90: 69 6f 6e 20 77 65 20 69 6e 69 74 69 61 6c 69 7a  ion we initializ
2da0: 65 0a 20 20 2a 2a 20 77 69 6e 73 6f 63 6b 20 61  e.  ** winsock a
2db0: 6e 64 20 74 68 65 6e 20 77 68 65 6e 20 63 6c 6f  nd then when clo
2dc0: 73 69 6e 67 20 77 65 20 63 6c 65 61 6e 75 70 2e  sing we cleanup.
2dd0: 20 49 74 20 77 6f 75 6c 64 20 62 65 20 62 65 74   It would be bet
2de0: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74  ter to.  ** init
2df0: 69 61 6c 69 7a 65 20 77 69 6e 73 6f 63 6b 20 6f  ialize winsock o
2e00: 6e 63 65 20 61 74 20 61 70 70 6c 69 63 61 74 69  nce at applicati
2e10: 6f 6e 20 73 74 61 72 74 20 77 68 65 6e 20 77 65  on start when we
2e20: 20 6b 6e 6f 77 20 77 65 20 61 72 65 20 67 6f 69   know we are goi
2e30: 6e 67 20 74 6f 0a 20 20 2a 2a 20 75 73 65 20 74  ng to.  ** use t
2e40: 68 65 20 73 6f 63 6b 65 74 20 69 6e 74 65 72 66  he socket interf
2e50: 61 63 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 65  ace and then cle
2e60: 61 6e 75 70 20 6f 6e 63 65 20 61 74 20 61 70 70  anup once at app
2e70: 6c 69 63 61 74 69 6f 6e 20 65 78 69 74 20 77 68  lication exit wh
2e80: 65 6e 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 61  en.  ** we are a
2e90: 6c 6c 20 64 6f 6e 65 20 77 69 74 68 20 61 6c 6c  ll done with all
2ea0: 20 73 6f 63 6b 65 74 20 6f 70 65 72 61 74 69 6f   socket operatio
2eb0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 73 5f 63 6c  ns..  */.  ws_cl
2ec0: 65 61 6e 75 70 28 29 3b 0a 7d 0a                 eanup();.}.