Hex Artifact Content
Not logged in

Artifact e887c92c4d34a4eba4f464f7c59d965b81a564b2:

File src/http.c part of check-in [36edf3fd5c] - Populate the ipaddr column of the rcvfrom table when a file is received from a remote source (push/pull/sync). by dan on 2007-08-01 09:04:46. Also file src/http.c part of check-in [04f7535ee3] - The merge at dd9633a03d did not work because of the bug just fixed. This change moves the changes that should have been in that merge into the main line of the tree. by drh on 2007-08-01 12:20:24.

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 6e 63 6c 75 64 65 20 3c  tp.h".#include <
03e0: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
03f0: 64 65 20 3c 61 72 70 61 2f 69 6e 65 74 2e 68 3e  de <arpa/inet.h>
0400: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0410: 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypes.h>.#include
0420: 20 3c 73 79 73 2f 73 6f 63 6b 65 74 2e 68 3e 0a   <sys/socket.h>.
0430: 23 69 6e 63 6c 75 64 65 20 3c 6e 65 74 64 62 2e  #include <netdb.
0440: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6e 65 74  h>.#include <net
0450: 69 6e 65 74 2f 69 6e 2e 68 3e 0a 0a 2f 2a 0a 2a  inet/in.h>../*.*
0460: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 69 6e 66  * Persistent inf
0470: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
0480: 68 65 20 48 54 54 50 20 63 6f 6e 6e 65 63 74 69  he HTTP connecti
0490: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49  on..*/.static FI
04a0: 4c 45 20 2a 70 53 6f 63 6b 65 74 20 3d 20 30 3b  LE *pSocket = 0;
04b0: 20 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74     /* The socket
04c0: 20 6f 6e 20 77 68 69 63 68 20 77 65 20 74 61 6c   on which we tal
04d0: 6b 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 20  k to the server 
04e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  */../*.** Open a
04f0: 20 73 6f 63 6b 65 74 20 63 6f 6e 6e 65 63 74 69   socket connecti
0500: 6f 6e 20 74 6f 20 74 68 65 20 73 65 72 76 65 72  on to the server
0510: 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73  .  Return 0 on s
0520: 75 63 63 65 73 73 20 61 6e 64 0a 2a 2a 20 6e 6f  uccess and.** no
0530: 6e 2d 7a 65 72 6f 20 69 66 20 61 6e 20 65 72 72  n-zero if an err
0540: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  or occurs..*/.st
0550: 61 74 69 63 20 69 6e 74 20 68 74 74 70 5f 6f 70  atic int http_op
0560: 65 6e 5f 73 6f 63 6b 65 74 28 76 6f 69 64 29 7b  en_socket(void){
0570: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
0580: 20 73 6f 63 6b 61 64 64 72 5f 69 6e 20 61 64 64   sockaddr_in add
0590: 72 3b 20 20 2f 2a 20 54 68 65 20 73 65 72 76 65  r;  /* The serve
05a0: 72 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20 73  r address */.  s
05b0: 74 61 74 69 63 20 69 6e 74 20 61 64 64 72 49 73  tatic int addrIs
05c0: 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Init = 0;       
05d0: 2f 2a 20 54 72 75 65 20 6f 6e 63 65 20 61 64 64  /* True once add
05e0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
05f0: 20 2a 2f 0a 20 20 69 6e 74 20 73 3b 0a 0a 20 20   */.  int s;..  
0600: 69 66 28 20 21 61 64 64 72 49 73 49 6e 69 74 20  if( !addrIsInit 
0610: 29 7b 0a 20 20 20 20 61 64 64 72 2e 73 69 6e 5f  ){.    addr.sin_
0620: 66 61 6d 69 6c 79 20 3d 20 41 46 5f 49 4e 45 54  family = AF_INET
0630: 3b 0a 20 20 20 20 61 64 64 72 2e 73 69 6e 5f 70  ;.    addr.sin_p
0640: 6f 72 74 20 3d 20 68 74 6f 6e 73 28 67 2e 75 72  ort = htons(g.ur
0650: 6c 50 6f 72 74 29 3b 0a 20 20 20 20 2a 28 69 6e  lPort);.    *(in
0660: 74 2a 29 26 61 64 64 72 2e 73 69 6e 5f 61 64 64  t*)&addr.sin_add
0670: 72 20 3d 20 69 6e 65 74 5f 61 64 64 72 28 67 2e  r = inet_addr(g.
0680: 75 72 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  urlName);.    if
0690: 28 20 2d 31 20 3d 3d 20 2a 28 69 6e 74 2a 29 26  ( -1 == *(int*)&
06a0: 61 64 64 72 2e 73 69 6e 5f 61 64 64 72 20 29 7b  addr.sin_addr ){
06b0: 0a 23 69 66 6e 64 65 66 20 46 4f 53 53 49 4c 5f  .#ifndef FOSSIL_
06c0: 53 54 41 54 49 43 5f 4c 49 4e 4b 0a 20 20 20 20  STATIC_LINK.    
06d0: 20 20 73 74 72 75 63 74 20 68 6f 73 74 65 6e 74    struct hostent
06e0: 20 2a 70 48 6f 73 74 3b 0a 20 20 20 20 20 20 70   *pHost;.      p
06f0: 48 6f 73 74 20 3d 20 67 65 74 68 6f 73 74 62 79  Host = gethostby
0700: 6e 61 6d 65 28 67 2e 75 72 6c 4e 61 6d 65 29 3b  name(g.urlName);
0710: 0a 20 20 20 20 20 20 69 66 28 20 70 48 6f 73 74  .      if( pHost
0720: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  !=0 ){.        m
0730: 65 6d 63 70 79 28 26 61 64 64 72 2e 73 69 6e 5f  emcpy(&addr.sin_
0740: 61 64 64 72 2c 70 48 6f 73 74 2d 3e 68 5f 61 64  addr,pHost->h_ad
0750: 64 72 5f 6c 69 73 74 5b 30 5d 2c 70 48 6f 73 74  dr_list[0],pHost
0760: 2d 3e 68 5f 6c 65 6e 67 74 68 29 3b 0a 20 20 20  ->h_length);.   
0770: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
0780: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
0790: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 63 61  fossil_panic("ca
07a0: 6e 27 74 20 72 65 73 6f 6c 76 65 20 68 6f 73 74  n't resolve host
07b0: 20 6e 61 6d 65 3a 20 25 73 5c 6e 22 2c 20 67 2e   name: %s\n", g.
07c0: 75 72 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  urlName);.      
07d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  }.    }.    addr
07e0: 49 73 49 6e 69 74 20 3d 20 31 3b 0a 0a 20 20 20  IsInit = 1;..   
07f0: 20 2f 2a 20 53 65 74 20 74 68 65 20 47 6c 6f 62   /* Set the Glob
0800: 61 6c 2e 7a 49 70 41 64 64 72 20 76 61 72 69 61  al.zIpAddr varia
0810: 62 6c 65 20 74 6f 20 74 68 65 20 73 65 72 76 65  ble to the serve
0820: 72 20 77 65 20 61 72 65 20 74 61 6c 6b 69 6e 67  r we are talking
0830: 20 74 6f 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   to..    ** This
0840: 20 69 73 20 75 73 65 64 20 74 6f 20 70 6f 70 75   is used to popu
0850: 6c 61 74 65 20 74 68 65 20 69 70 61 64 64 72 20  late the ipaddr 
0860: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 63  column of the rc
0870: 76 66 72 6f 6d 20 74 61 62 6c 65 2c 0a 20 20 20  vfrom table,.   
0880: 20 2a 2a 20 69 66 20 61 6e 79 20 66 69 6c 65 73   ** if any files
0890: 20 61 72 65 20 72 65 63 65 69 76 65 64 20 66 72   are received fr
08a0: 6f 6d 20 74 68 65 20 73 65 72 76 65 72 2e 0a 20  om the server.. 
08b0: 20 20 20 2a 2f 0a 20 20 20 20 67 2e 7a 49 70 41     */.    g.zIpA
08c0: 64 64 72 20 3d 20 6d 70 72 69 6e 74 66 28 22 25  ddr = mprintf("%
08d0: 73 22 2c 20 69 6e 65 74 5f 6e 74 6f 61 28 61 64  s", inet_ntoa(ad
08e0: 64 72 2e 73 69 6e 5f 61 64 64 72 29 29 3b 0a 20  dr.sin_addr));. 
08f0: 20 7d 0a 20 20 73 20 3d 20 73 6f 63 6b 65 74 28   }.  s = socket(
0900: 41 46 5f 49 4e 45 54 2c 53 4f 43 4b 5f 53 54 52  AF_INET,SOCK_STR
0910: 45 41 4d 2c 30 29 3b 0a 20 20 69 66 28 20 73 3c  EAM,0);.  if( s<
0920: 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f  0 ){.    fossil_
0930: 70 61 6e 69 63 28 22 63 61 6e 6e 6f 74 20 63 72  panic("cannot cr
0940: 65 61 74 65 20 61 20 73 6f 63 6b 65 74 22 29 3b  eate a socket");
0950: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 6e 6e 65  .  }.  if( conne
0960: 63 74 28 73 2c 28 73 74 72 75 63 74 20 73 6f 63  ct(s,(struct soc
0970: 6b 61 64 64 72 2a 29 26 61 64 64 72 2c 73 69 7a  kaddr*)&addr,siz
0980: 65 6f 66 28 61 64 64 72 29 29 3c 30 20 29 7b 0a  eof(addr))<0 ){.
0990: 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63      fossil_panic
09a0: 28 22 63 61 6e 6e 6f 74 20 63 6f 6e 6e 65 63 74  ("cannot connect
09b0: 20 74 6f 20 68 6f 73 74 20 25 73 3a 25 64 22 2c   to host %s:%d",
09c0: 20 67 2e 75 72 6c 4e 61 6d 65 2c 20 67 2e 75 72   g.urlName, g.ur
09d0: 6c 50 6f 72 74 29 3b 0a 20 20 7d 0a 20 20 70 53  lPort);.  }.  pS
09e0: 6f 63 6b 65 74 20 3d 20 66 64 6f 70 65 6e 28 73  ocket = fdopen(s
09f0: 2c 22 72 2b 22 29 3b 0a 20 20 72 65 74 75 72 6e  ,"r+");.  return
0a00: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b   0;.}../*.** Mak
0a10: 65 20 61 20 73 69 6e 67 6c 65 20 61 74 74 65 6d  e a single attem
0a20: 70 74 20 74 6f 20 74 61 6c 6b 20 74 6f 20 74 68  pt to talk to th
0a30: 65 20 73 65 72 76 65 72 2e 20 20 52 65 74 75 72  e server.  Retur
0a40: 6e 20 54 52 55 45 20 6f 6e 20 73 75 63 63 65 73  n TRUE on succes
0a50: 73 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 6f  s.** and FALSE o
0a60: 6e 20 61 20 66 61 69 6c 75 72 65 2e 0a 2a 2a 0a  n a failure..**.
0a70: 2a 2a 20 70 48 65 61 64 65 72 20 63 6f 6e 74 61  ** pHeader conta
0a80: 69 6e 73 20 74 68 65 20 48 54 54 50 20 68 65 61  ins the HTTP hea
0a90: 64 65 72 2e 20 20 70 50 61 79 6c 6f 61 64 20 63  der.  pPayload c
0aa0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74  ontains the cont
0ab0: 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ent..** The cont
0ac0: 65 6e 74 20 6f 66 20 74 68 65 20 72 65 70 6c 79  ent of the reply
0ad0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
0ae0: 20 70 52 65 70 6c 79 2e 20 20 70 52 65 70 6c 79   pReply.  pReply
0af0: 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 74   is assumed.** t
0b00: 6f 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  o be uninitializ
0b10: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 69 73  ed prior to this
0b20: 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
0b30: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
0b40: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
0b50: 74 75 72 6e 20 66 61 6c 73 65 2c 20 72 65 73 65  turn false, rese
0b60: 74 73 20 70 52 65 70 6c 79 20 61 6e 64 0a 2a 2a  ts pReply and.**
0b70: 20 63 6c 6f 73 65 73 20 74 68 65 20 70 65 72 73   closes the pers
0b80: 69 73 74 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  istent connectio
0b90: 6e 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74  n, if any..*/.st
0ba0: 61 74 69 63 20 69 6e 74 20 68 74 74 70 5f 73 65  atic int http_se
0bb0: 6e 64 5f 72 65 63 76 28 42 6c 6f 62 20 2a 70 48  nd_recv(Blob *pH
0bc0: 65 61 64 65 72 2c 20 42 6c 6f 62 20 2a 70 50 61  eader, Blob *pPa
0bd0: 79 6c 6f 61 64 2c 20 42 6c 6f 62 20 2a 70 52 65  yload, Blob *pRe
0be0: 70 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ply){.  int rc;.
0bf0: 20 20 69 6e 74 20 63 6c 6f 73 65 43 6f 6e 6e 65    int closeConne
0c00: 63 74 69 6f 6e 3b 0a 20 20 69 6e 74 20 69 4c 65  ction;.  int iLe
0c10: 6e 67 74 68 3b 0a 20 20 69 6e 74 20 69 48 74 74  ngth;.  int iHtt
0c20: 70 56 65 72 73 69 6f 6e 3b 0a 20 20 69 6e 74 20  pVersion;.  int 
0c30: 69 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 0a  i;.  int nRead;.
0c40: 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30    char zLine[200
0c50: 30 5d 3b 0a 0a 20 20 69 66 28 20 70 53 6f 63 6b  0];..  if( pSock
0c60: 65 74 3d 3d 30 20 26 26 20 68 74 74 70 5f 6f 70  et==0 && http_op
0c70: 65 6e 5f 73 6f 63 6b 65 74 28 29 20 29 7b 0a 20  en_socket() ){. 
0c80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
0c90: 0a 20 20 72 63 20 3d 20 66 77 72 69 74 65 28 62  .  rc = fwrite(b
0ca0: 6c 6f 62 5f 62 75 66 66 65 72 28 70 48 65 61 64  lob_buffer(pHead
0cb0: 65 72 29 2c 20 31 2c 20 62 6c 6f 62 5f 73 69 7a  er), 1, blob_siz
0cc0: 65 28 70 48 65 61 64 65 72 29 2c 20 70 53 6f 63  e(pHeader), pSoc
0cd0: 6b 65 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ket);.  if( rc!=
0ce0: 62 6c 6f 62 5f 73 69 7a 65 28 70 48 65 61 64 65  blob_size(pHeade
0cf0: 72 29 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f  r) ) goto write_
0d00: 65 72 72 3b 0a 20 20 72 63 20 3d 20 66 77 72 69  err;.  rc = fwri
0d10: 74 65 28 62 6c 6f 62 5f 62 75 66 66 65 72 28 70  te(blob_buffer(p
0d20: 50 61 79 6c 6f 61 64 29 2c 20 31 2c 20 62 6c 6f  Payload), 1, blo
0d30: 62 5f 73 69 7a 65 28 70 50 61 79 6c 6f 61 64 29  b_size(pPayload)
0d40: 2c 20 70 53 6f 63 6b 65 74 29 3b 0a 20 20 69 66  , pSocket);.  if
0d50: 28 20 72 63 21 3d 62 6c 6f 62 5f 73 69 7a 65 28  ( rc!=blob_size(
0d60: 70 50 61 79 6c 6f 61 64 29 20 29 20 67 6f 74 6f  pPayload) ) goto
0d70: 20 77 72 69 74 65 5f 65 72 72 3b 0a 20 20 69 66   write_err;.  if
0d80: 28 20 66 66 6c 75 73 68 28 70 53 6f 63 6b 65 74  ( fflush(pSocket
0d90: 29 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f 65  ) ) goto write_e
0da0: 72 72 3b 0a 20 20 69 66 28 20 66 67 65 74 73 28  rr;.  if( fgets(
0db0: 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c  zLine, sizeof(zL
0dc0: 69 6e 65 29 2c 20 70 53 6f 63 6b 65 74 29 3d 3d  ine), pSocket)==
0dd0: 30 20 29 20 67 6f 74 6f 20 77 72 69 74 65 5f 65  0 ) goto write_e
0de0: 72 72 3b 0a 20 20 69 66 28 20 73 73 63 61 6e 66  rr;.  if( sscanf
0df0: 28 7a 4c 69 6e 65 2c 20 22 48 54 54 50 2f 31 2e  (zLine, "HTTP/1.
0e00: 25 64 20 25 64 22 2c 20 26 69 48 74 74 70 56 65  %d %d", &iHttpVe
0e10: 72 73 69 6f 6e 2c 20 26 72 63 29 21 3d 32 20 29  rsion, &rc)!=2 )
0e20: 20 67 6f 74 6f 20 77 72 69 74 65 5f 65 72 72 3b   goto write_err;
0e30: 0a 20 20 69 66 28 20 72 63 21 3d 32 30 30 20 29  .  if( rc!=200 )
0e40: 20 67 6f 74 6f 20 77 72 69 74 65 5f 65 72 72 3b   goto write_err;
0e50: 0a 20 20 69 66 28 20 69 48 74 74 70 56 65 72 73  .  if( iHttpVers
0e60: 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6c  ion==0 ){.    cl
0e70: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
0e80: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
0e90: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
0ea0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 4c 65 6e 67  = 0;.  }.  iLeng
0eb0: 74 68 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65  th = -1;.  while
0ec0: 28 20 66 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73  ( fgets(zLine, s
0ed0: 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 70 53  izeof(zLine), pS
0ee0: 6f 63 6b 65 74 29 20 29 7b 0a 20 20 20 20 66 6f  ocket) ){.    fo
0ef0: 72 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20  r(i=0; zLine[i] 
0f00: 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 5c 6e  && zLine[i]!='\n
0f10: 27 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27  ' && zLine[i]!='
0f20: 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \r'; i++){}.    
0f30: 69 66 28 20 69 3d 3d 30 20 29 20 62 72 65 61 6b  if( i==0 ) break
0f40: 3b 0a 20 20 20 20 7a 4c 69 6e 65 5b 69 5d 20 3d  ;.    zLine[i] =
0f50: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e   0;.    if( strn
0f60: 63 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 20 22  casecmp(zLine, "
0f70: 63 6f 6e 74 65 6e 74 2d 6c 65 6e 67 74 68 3a 22  content-length:"
0f80: 2c 31 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,15)==0 ){.     
0f90: 20 69 4c 65 6e 67 74 68 20 3d 20 61 74 6f 69 28   iLength = atoi(
0fa0: 26 7a 4c 69 6e 65 5b 31 36 5d 29 3b 0a 20 20 20  &zLine[16]);.   
0fb0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
0fc0: 61 73 65 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 63  asecmp(zLine, "c
0fd0: 6f 6e 6e 65 63 74 69 6f 6e 3a 22 2c 20 31 31 29  onnection:", 11)
0fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
0ff0: 28 69 3d 31 32 3b 20 69 73 73 70 61 63 65 28 7a  (i=12; isspace(z
1000: 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  Line[i]); i++){}
1010: 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
1020: 5b 69 5d 3d 3d 27 63 27 20 7c 7c 20 7a 4c 69 6e  [i]=='c' || zLin
1030: 65 5b 69 5d 3d 3d 27 43 27 20 29 7b 0a 20 20 20  e[i]=='C' ){.   
1040: 20 20 20 20 20 63 6c 6f 73 65 43 6f 6e 6e 65 63       closeConnec
1050: 74 69 6f 6e 20 3d 20 31 3b 20 20 20 2f 2a 20 43  tion = 1;   /* C
1060: 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f 73 65  onnection: close
1070: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   */.      }else 
1080: 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 6b  if( zLine[i]=='k
1090: 27 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27  ' || zLine[i]=='
10a0: 4b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  K' ){.        cl
10b0: 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 20  oseConnection = 
10c0: 30 3b 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  0;   /* Connecti
10d0: 6f 6e 3a 20 6b 65 65 70 2d 61 6c 69 76 65 20 2a  on: keep-alive *
10e0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
10f0: 20 20 7d 0a 20 20 69 66 28 20 69 4c 65 6e 67 74    }.  if( iLengt
1100: 68 3c 30 20 29 20 67 6f 74 6f 20 77 72 69 74 65  h<0 ) goto write
1110: 5f 65 72 72 3b 0a 20 20 6e 52 65 61 64 20 3d 20  _err;.  nRead = 
1120: 62 6c 6f 62 5f 72 65 61 64 5f 66 72 6f 6d 5f 63  blob_read_from_c
1130: 68 61 6e 6e 65 6c 28 70 52 65 70 6c 79 2c 20 70  hannel(pReply, p
1140: 53 6f 63 6b 65 74 2c 20 69 4c 65 6e 67 74 68 29  Socket, iLength)
1150: 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 69  ;.  if( nRead!=i
1160: 4c 65 6e 67 74 68 20 29 7b 0a 20 20 20 20 62 6c  Length ){.    bl
1170: 6f 62 5f 72 65 73 65 74 28 70 52 65 70 6c 79 29  ob_reset(pReply)
1180: 3b 0a 20 20 20 20 67 6f 74 6f 20 77 72 69 74 65  ;.    goto write
1190: 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _err;.  }.  if( 
11a0: 63 6c 6f 73 65 43 6f 6e 6e 65 63 74 69 6f 6e 20  closeConnection 
11b0: 29 7b 0a 20 20 20 20 68 74 74 70 5f 63 6c 6f 73  ){.    http_clos
11c0: 65 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  e();.  }.  retur
11d0: 6e 20 31 3b 20 20 0a 0a 77 72 69 74 65 5f 65 72  n 1;  ..write_er
11e0: 72 3a 0a 20 20 68 74 74 70 5f 63 6c 6f 73 65 28  r:.  http_close(
11f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1200: 0a 0a 2f 2a 0a 2a 2a 20 53 69 67 6e 20 74 68 65  ../*.** Sign the
1210: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 53 65 6e   content in pSen
1220: 64 2c 20 63 6f 6d 70 72 65 73 73 20 69 74 2c 20  d, compress it, 
1230: 61 6e 64 20 73 65 6e 64 20 69 74 20 74 6f 20 74  and send it to t
1240: 68 65 20 73 65 72 76 65 72 0a 2a 2a 20 76 69 61  he server.** via
1250: 20 48 54 54 50 2e 20 20 47 65 74 20 61 20 72 65   HTTP.  Get a re
1260: 70 6c 79 2c 20 75 6e 63 6f 6d 70 72 65 73 73 20  ply, uncompress 
1270: 74 68 65 20 72 65 70 6c 79 2c 20 61 6e 64 20 73  the reply, and s
1280: 74 6f 72 65 20 74 68 65 20 72 65 70 6c 79 0a 2a  tore the reply.*
1290: 2a 20 69 6e 20 70 52 65 63 76 2e 20 20 70 52 65  * in pRecv.  pRe
12a0: 63 76 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  cv is assumed to
12b0: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
12c0: 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  d when.** this r
12d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12e0: 20 2d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20   - this routine 
12f0: 77 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20  will initialize 
1300: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  it..**.** The se
1310: 72 76 65 72 20 61 64 64 72 65 73 73 20 69 73 20  rver address is 
1320: 63 6f 6e 74 61 69 6e 20 69 6e 20 74 68 65 20 22  contain in the "
1330: 67 22 20 67 6c 6f 62 61 6c 20 73 74 72 75 63 74  g" global struct
1340: 75 72 65 2e 20 20 54 68 65 0a 2a 2a 20 75 72 6c  ure.  The.** url
1350: 5f 70 61 72 73 65 28 29 20 72 6f 75 74 69 6e 65  _parse() routine
1360: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
1370: 6e 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  n called prior t
1380: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  o this routine.*
1390: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 69  * in order to fi
13a0: 6c 6c 20 74 68 69 73 20 73 74 72 75 63 74 75 72  ll this structur
13b0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2e  e appropriately.
13c0: 0a 2a 2f 0a 76 6f 69 64 20 68 74 74 70 5f 65 78  .*/.void http_ex
13d0: 63 68 61 6e 67 65 28 42 6c 6f 62 20 2a 70 53 65  change(Blob *pSe
13e0: 6e 64 2c 20 42 6c 6f 62 20 2a 70 52 65 63 76 29  nd, Blob *pRecv)
13f0: 7b 0a 20 20 42 6c 6f 62 20 6c 6f 67 69 6e 2c 20  {.  Blob login, 
1400: 6e 6f 6e 63 65 2c 20 73 69 67 2c 20 70 77 2c 20  nonce, sig, pw, 
1410: 70 61 79 6c 6f 61 64 2c 20 68 64 72 3b 0a 20 20  payload, hdr;.  
1420: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 70  const char *zSep
1430: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1440: 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 62 6c 6f   cnt = 0;..  blo
1450: 62 5f 7a 65 72 6f 28 26 6e 6f 6e 63 65 29 3b 0a  b_zero(&nonce);.
1460: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 70 77 29    blob_zero(&pw)
1470: 3b 0a 20 20 64 62 5f 62 6c 6f 62 28 26 6e 6f 6e  ;.  db_blob(&non
1480: 63 65 2c 20 22 53 45 4c 45 43 54 20 68 65 78 28  ce, "SELECT hex(
1490: 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 30 29 29 22  randomblob(20))"
14a0: 29 3b 0a 20 20 62 6c 6f 62 5f 63 6f 70 79 28 26  );.  blob_copy(&
14b0: 70 77 2c 20 26 6e 6f 6e 63 65 29 3b 0a 20 20 62  pw, &nonce);.  b
14c0: 6c 6f 62 5f 7a 65 72 6f 28 26 6c 6f 67 69 6e 29  lob_zero(&login)
14d0: 3b 0a 20 20 69 66 28 20 67 2e 75 72 6c 55 73 65  ;.  if( g.urlUse
14e0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 75 73 65 72  r==0 ){.    user
14f0: 5f 73 65 6c 65 63 74 28 29 3b 0a 20 20 20 20 64  _select();.    d
1500: 62 5f 62 6c 6f 62 28 26 70 77 2c 20 22 53 45 4c  b_blob(&pw, "SEL
1510: 45 43 54 20 70 77 20 46 52 4f 4d 20 75 73 65 72  ECT pw FROM user
1520: 20 57 48 45 52 45 20 75 69 64 3d 25 64 22 2c 20   WHERE uid=%d", 
1530: 67 2e 75 73 65 72 55 69 64 29 3b 0a 20 20 20 20  g.userUid);.    
1540: 73 68 61 31 73 75 6d 5f 62 6c 6f 62 28 26 70 77  sha1sum_blob(&pw
1550: 2c 20 26 73 69 67 29 3b 0a 20 20 20 20 62 6c 6f  , &sig);.    blo
1560: 62 5f 61 70 70 65 6e 64 66 28 26 6c 6f 67 69 6e  b_appendf(&login
1570: 2c 20 22 6c 6f 67 69 6e 20 25 73 20 25 62 20 25  , "login %s %b %
1580: 62 5c 6e 22 2c 20 67 2e 7a 4c 6f 67 69 6e 2c 20  b\n", g.zLogin, 
1590: 26 6e 6f 6e 63 65 2c 20 26 73 69 67 29 3b 0a 20  &nonce, &sig);. 
15a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
15b0: 67 2e 75 72 6c 50 61 73 73 77 64 3d 3d 30 20 29  g.urlPasswd==0 )
15c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
15d0: 6d 70 28 67 2e 75 72 6c 55 73 65 72 2c 22 61 6e  mp(g.urlUser,"an
15e0: 6f 6e 79 6d 6f 75 73 22 29 21 3d 30 20 29 7b 0a  onymous")!=0 ){.
15f0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50          char *zP
1600: 72 6f 6d 70 74 20 3d 20 6d 70 72 69 6e 74 66 28  rompt = mprintf(
1610: 22 70 61 73 73 77 6f 72 64 20 66 6f 72 20 25 73  "password for %s
1620: 3a 20 22 2c 20 67 2e 75 72 6c 55 73 65 72 29 3b  : ", g.urlUser);
1630: 0a 20 20 20 20 20 20 20 20 42 6c 6f 62 20 78 3b  .        Blob x;
1640: 0a 20 20 20 20 20 20 20 20 70 72 6f 6d 70 74 5f  .        prompt_
1650: 66 6f 72 5f 70 61 73 73 77 6f 72 64 28 7a 50 72  for_password(zPr
1660: 6f 6d 70 74 2c 20 26 78 2c 20 30 29 3b 0a 20 20  ompt, &x, 0);.  
1670: 20 20 20 20 20 20 66 72 65 65 28 7a 50 72 6f 6d        free(zProm
1680: 70 74 29 3b 0a 20 20 20 20 20 20 20 20 67 2e 75  pt);.        g.u
1690: 72 6c 50 61 73 73 77 64 20 3d 20 62 6c 6f 62 5f  rlPasswd = blob_
16a0: 73 74 72 28 26 78 29 3b 0a 20 20 20 20 20 20 7d  str(&x);.      }
16b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 67 2e  else{.        g.
16c0: 75 72 6c 50 61 73 73 77 64 20 3d 20 22 22 3b 0a  urlPasswd = "";.
16d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26 70    blob_append(&p
16f0: 77 2c 20 67 2e 75 72 6c 50 61 73 73 77 64 2c 20  w, g.urlPasswd, 
1700: 2d 31 29 3b 0a 20 20 20 20 2f 2a 20 70 72 69 6e  -1);.    /* prin
1710: 74 66 28 22 70 72 65 73 69 67 3d 5b 25 73 5d 5c  tf("presig=[%s]\
1720: 6e 22 2c 20 62 6c 6f 62 5f 73 74 72 28 26 70 77  n", blob_str(&pw
1730: 29 29 3b 20 2a 2f 0a 20 20 20 20 73 68 61 31 73  )); */.    sha1s
1740: 75 6d 5f 62 6c 6f 62 28 26 70 77 2c 20 26 73 69  um_blob(&pw, &si
1750: 67 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70  g);.    blob_app
1760: 65 6e 64 66 28 26 6c 6f 67 69 6e 2c 20 22 6c 6f  endf(&login, "lo
1770: 67 69 6e 20 25 73 20 25 62 20 25 62 5c 6e 22 2c  gin %s %b %b\n",
1780: 20 67 2e 75 72 6c 55 73 65 72 2c 20 26 6e 6f 6e   g.urlUser, &non
1790: 63 65 2c 20 26 73 69 67 29 3b 0a 20 20 7d 20 20  ce, &sig);.  }  
17a0: 20 20 20 20 20 20 0a 20 20 62 6c 6f 62 5f 72 65        .  blob_re
17b0: 73 65 74 28 26 6e 6f 6e 63 65 29 3b 0a 20 20 62  set(&nonce);.  b
17c0: 6c 6f 62 5f 72 65 73 65 74 28 26 70 77 29 3b 0a  lob_reset(&pw);.
17d0: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 73 69    blob_reset(&si
17e0: 67 29 3b 0a 20 20 69 66 28 20 67 2e 66 48 74 74  g);.  if( g.fHtt
17f0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 61  pTrace ){.    pa
1800: 79 6c 6f 61 64 20 3d 20 6c 6f 67 69 6e 3b 0a 20  yload = login;. 
1810: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 26     blob_append(&
1820: 70 61 79 6c 6f 61 64 2c 20 62 6c 6f 62 5f 62 75  payload, blob_bu
1830: 66 66 65 72 28 70 53 65 6e 64 29 2c 20 62 6c 6f  ffer(pSend), blo
1840: 62 5f 73 69 7a 65 28 70 53 65 6e 64 29 29 3b 0a  b_size(pSend));.
1850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f    }else{.    blo
1860: 62 5f 63 6f 6d 70 72 65 73 73 32 28 26 6c 6f 67  b_compress2(&log
1870: 69 6e 2c 20 70 53 65 6e 64 2c 20 26 70 61 79 6c  in, pSend, &payl
1880: 6f 61 64 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72  oad);.    blob_r
1890: 65 73 65 74 28 26 6c 6f 67 69 6e 29 3b 0a 20 20  eset(&login);.  
18a0: 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 68  }.  blob_zero(&h
18b0: 64 72 29 3b 0a 20 20 69 20 3d 20 73 74 72 6c 65  dr);.  i = strle
18c0: 6e 28 67 2e 75 72 6c 50 61 74 68 29 3b 0a 20 20  n(g.urlPath);.  
18d0: 69 66 28 20 69 3e 30 20 26 26 20 67 2e 75 72 6c  if( i>0 && g.url
18e0: 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 2f 27 20 29  Path[i-1]=='/' )
18f0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
1900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
1910: 65 70 20 3d 20 22 2f 22 3b 0a 20 20 7d 0a 20 20  ep = "/";.  }.  
1920: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 68 64  blob_appendf(&hd
1930: 72 2c 20 22 50 4f 53 54 20 25 73 25 73 78 66 65  r, "POST %s%sxfe
1940: 72 20 48 54 54 50 2f 31 2e 31 5c 72 5c 6e 22 2c  r HTTP/1.1\r\n",
1950: 20 67 2e 75 72 6c 50 61 74 68 2c 20 7a 53 65 70   g.urlPath, zSep
1960: 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64  );.  blob_append
1970: 66 28 26 68 64 72 2c 20 22 48 6f 73 74 3a 20 25  f(&hdr, "Host: %
1980: 73 3a 25 64 5c 72 5c 6e 22 2c 20 67 2e 75 72 6c  s:%d\r\n", g.url
1990: 4e 61 6d 65 2c 20 67 2e 75 72 6c 50 6f 72 74 29  Name, g.urlPort)
19a0: 3b 0a 20 20 69 66 28 20 67 2e 66 48 74 74 70 54  ;.  if( g.fHttpT
19b0: 72 61 63 65 20 29 7b 0a 20 20 20 20 62 6c 6f 62  race ){.    blob
19c0: 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20 22  _appendf(&hdr, "
19d0: 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 61 70  Content-Type: ap
19e0: 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73  plication/x-foss
19f0: 69 6c 2d 64 65 62 75 67 5c 72 5c 6e 22 29 3b 0a  il-debug\r\n");.
1a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 6c 6f    }else{.    blo
1a10: 62 5f 61 70 70 65 6e 64 66 28 26 68 64 72 2c 20  b_appendf(&hdr, 
1a20: 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 61  "Content-Type: a
1a30: 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73  pplication/x-fos
1a40: 73 69 6c 5c 72 5c 6e 22 29 3b 0a 20 20 7d 0a 20  sil\r\n");.  }. 
1a50: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 68   blob_appendf(&h
1a60: 64 72 2c 20 22 43 6f 6e 74 65 6e 74 2d 4c 65 6e  dr, "Content-Len
1a70: 67 74 68 3a 20 25 64 5c 72 5c 6e 5c 72 5c 6e 22  gth: %d\r\n\r\n"
1a80: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 70 61 79  , blob_size(&pay
1a90: 6c 6f 61 64 29 29 3b 0a 0a 20 20 69 66 28 20 67  load));..  if( g
1aa0: 2e 66 48 74 74 70 54 72 61 63 65 20 29 7b 0a 20  .fHttpTrace ){. 
1ab0: 20 20 20 2f 2a 20 57 68 65 6e 20 74 72 61 63 69     /* When traci
1ac0: 6e 67 2c 20 77 72 69 74 65 20 74 68 65 20 74 72  ng, write the tr
1ad0: 61 6e 73 6d 69 74 74 65 64 20 48 54 54 50 20 6d  ansmitted HTTP m
1ae0: 65 73 73 61 67 65 20 62 6f 74 68 20 74 6f 20 73  essage both to s
1af0: 74 61 6e 64 61 72 64 0a 20 20 20 20 2a 2a 20 6f  tandard.    ** o
1b00: 75 74 70 75 74 20 61 6e 64 20 69 6e 74 6f 20 61  utput and into a
1b10: 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65   file.  The file
1b20: 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65   can then be use
1b30: 64 20 74 6f 20 64 72 69 76 65 20 74 68 65 0a 20  d to drive the. 
1b40: 20 20 20 2a 2a 20 73 65 72 76 65 72 2d 73 69 64     ** server-sid
1b50: 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  e like this:.   
1b60: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1b70: 2e 2f 66 6f 73 73 69 6c 20 68 74 74 70 20 3c 68  ./fossil http <h
1b80: 74 74 70 2d 74 72 61 63 65 2d 31 2e 74 78 74 0a  ttp-trace-1.txt.
1b90: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
1ba0: 63 20 69 6e 74 20 74 72 61 63 65 43 6e 74 20 3d  c int traceCnt =
1bb0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   0;.    char *zO
1bc0: 75 74 46 69 6c 65 3b 0a 20 20 20 20 46 49 4c 45  utFile;.    FILE
1bd0: 20 2a 6f 75 74 3b 0a 20 20 20 20 74 72 61 63 65   *out;.    trace
1be0: 43 6e 74 2b 2b 3b 0a 20 20 20 20 7a 4f 75 74 46  Cnt++;.    zOutF
1bf0: 69 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 68  ile = mprintf("h
1c00: 74 74 70 2d 74 72 61 63 65 2d 25 64 2e 74 78 74  ttp-trace-%d.txt
1c10: 22 2c 20 74 72 61 63 65 43 6e 74 29 3b 0a 20 20  ", traceCnt);.  
1c20: 20 20 70 72 69 6e 74 66 28 22 48 54 54 50 20 53    printf("HTTP S
1c30: 45 4e 44 3a 20 28 25 73 29 5c 6e 25 73 25 73 3d  END: (%s)\n%s%s=
1c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c50: 3d 3d 3d 3d 3d 3d 5c 6e 22 2c 20 0a 20 20 20 20  ======\n", .    
1c60: 20 20 20 20 7a 4f 75 74 46 69 6c 65 2c 20 62 6c      zOutFile, bl
1c70: 6f 62 5f 73 74 72 28 26 68 64 72 29 2c 20 62 6c  ob_str(&hdr), bl
1c80: 6f 62 5f 73 74 72 28 26 70 61 79 6c 6f 61 64 29  ob_str(&payload)
1c90: 29 3b 0a 20 20 20 20 6f 75 74 20 3d 20 66 6f 70  );.    out = fop
1ca0: 65 6e 28 7a 4f 75 74 46 69 6c 65 2c 20 22 77 22  en(zOutFile, "w"
1cb0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
1cc0: 7b 0a 20 20 20 20 20 20 66 77 72 69 74 65 28 62  {.      fwrite(b
1cd0: 6c 6f 62 5f 62 75 66 66 65 72 28 26 68 64 72 29  lob_buffer(&hdr)
1ce0: 2c 20 31 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26  , 1, blob_size(&
1cf0: 68 64 72 29 2c 20 6f 75 74 29 3b 0a 20 20 20 20  hdr), out);.    
1d00: 20 20 66 77 72 69 74 65 28 62 6c 6f 62 5f 62 75    fwrite(blob_bu
1d10: 66 66 65 72 28 26 70 61 79 6c 6f 61 64 29 2c 20  ffer(&payload), 
1d20: 31 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 70 61  1, blob_size(&pa
1d30: 79 6c 6f 61 64 29 2c 20 6f 75 74 29 3b 0a 20 20  yload), out);.  
1d40: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
1d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
1d60: 28 63 6e 74 3d 30 3b 20 63 6e 74 3c 32 3b 20 63  (cnt=0; cnt<2; c
1d70: 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 68  nt++){.    if( h
1d80: 74 74 70 5f 73 65 6e 64 5f 72 65 63 76 28 26 68  ttp_send_recv(&h
1d90: 64 72 2c 20 26 70 61 79 6c 6f 61 64 2c 20 70 52  dr, &payload, pR
1da0: 65 63 76 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ecv) ) break;.  
1db0: 7d 0a 20 20 69 66 28 20 63 6e 74 3e 3d 32 20 29  }.  if( cnt>=2 )
1dc0: 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 61 6e  {.    fossil_pan
1dd0: 69 63 28 22 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ic("connection t
1de0: 6f 20 73 65 72 76 65 72 20 66 61 69 6c 65 64 22  o server failed"
1df0: 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 72 65  );.  }.  blob_re
1e00: 73 65 74 28 26 68 64 72 29 3b 0a 20 20 62 6c 6f  set(&hdr);.  blo
1e10: 62 5f 72 65 73 65 74 28 26 70 61 79 6c 6f 61 64  b_reset(&payload
1e20: 29 3b 0a 20 20 69 66 28 20 67 2e 66 48 74 74 70  );.  if( g.fHttp
1e30: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 70 72 69  Trace ){.    pri
1e40: 6e 74 66 28 22 48 54 54 50 20 52 45 43 45 49 56  ntf("HTTP RECEIV
1e50: 45 3a 5c 6e 25 73 5c 6e 3d 3d 3d 3d 3d 3d 3d 3d  E:\n%s\n========
1e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 5c  ===============\
1e70: 6e 22 2c 20 62 6c 6f 62 5f 73 74 72 28 70 52 65  n", blob_str(pRe
1e80: 63 76 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  cv));.  }else{. 
1e90: 20 20 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 72 65     blob_uncompre
1ea0: 73 73 28 70 52 65 63 76 2c 20 70 52 65 63 76 29  ss(pRecv, pRecv)
1eb0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1ec0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f  Make sure the so
1ed0: 63 6b 65 74 20 74 6f 20 74 68 65 20 48 54 54 50  cket to the HTTP
1ee0: 20 73 65 72 76 65 72 20 69 73 20 63 6c 6f 73 65   server is close
1ef0: 64 20 0a 2a 2f 0a 76 6f 69 64 20 68 74 74 70 5f  d .*/.void http_
1f00: 63 6c 6f 73 65 28 76 6f 69 64 29 7b 0a 20 20 69  close(void){.  i
1f10: 66 28 20 70 53 6f 63 6b 65 74 20 29 7b 0a 20 20  f( pSocket ){.  
1f20: 20 20 66 63 6c 6f 73 65 28 70 53 6f 63 6b 65 74    fclose(pSocket
1f30: 29 3b 0a 20 20 20 20 70 53 6f 63 6b 65 74 20 3d  );.    pSocket =
1f40: 20 30 3b 0a 20 20 7d 0a 7d 0a                     0;.  }.}.