Fossil

Hex Artifact Content
Login

Artifact 8e2dc63f5556d4e8581d80cc00eb979000018d090815231b5fd7011c430b81d9:


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 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 63 6f 6e  ** This file con
0260: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 70  tains code for p
0270: 61 72 73 69 6e 67 20 55 52 4c 73 20 74 68 61 74  arsing URLs that
0280: 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 63   appear on the c
0290: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 0a 2a 2f 0a 23  ommand-line.*/.#
02a0: 69 6e 63 6c 75 64 65 20 22 63 6f 6e 66 69 67 2e  include "config.
02b0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 75 72 6c  h".#include "url
02c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
02d0: 64 69 6f 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f  dio.h>..#ifdef _
02e0: 57 49 4e 33 32 0a 23 69 6e 63 6c 75 64 65 20 3c  WIN32.#include <
02f0: 69 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  io.h>.#endif..#i
0300: 66 20 49 4e 54 45 52 46 41 43 45 0a 2f 2a 0a 2a  f INTERFACE./*.*
0310: 2a 20 46 6c 61 67 73 20 66 6f 72 20 75 72 6c 5f  * Flags for url_
0320: 70 61 72 73 65 28 29 0a 2a 2f 0a 23 64 65 66 69  parse().*/.#defi
0330: 6e 65 20 55 52 4c 5f 50 52 4f 4d 50 54 5f 50 57  ne URL_PROMPT_PW
0340: 20 20 20 20 20 20 20 20 30 78 30 30 30 31 20 20          0x0001  
0350: 2f 2a 20 50 72 6f 6d 70 74 20 66 6f 72 20 70 61  /* Prompt for pa
0360: 73 73 77 6f 72 64 20 69 66 20 6e 65 65 64 65 64  ssword if needed
0370: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 52 4c 5f   */.#define URL_
0380: 52 45 4d 45 4d 42 45 52 20 20 20 20 20 20 20 20  REMEMBER        
0390: 20 30 78 30 30 30 32 20 20 2f 2a 20 52 65 6d 65   0x0002  /* Reme
03a0: 6d 62 65 72 20 74 68 65 20 75 72 6c 20 66 6f 72  mber the url for
03b0: 20 6c 61 74 65 72 20 72 65 75 73 65 20 2a 2f 0a   later reuse */.
03c0: 23 64 65 66 69 6e 65 20 55 52 4c 5f 41 53 4b 5f  #define URL_ASK_
03d0: 52 45 4d 45 4d 42 45 52 5f 50 57 20 20 30 78 30  REMEMBER_PW  0x0
03e0: 30 30 34 20 20 2f 2a 20 41 73 6b 20 77 68 65 74  004  /* Ask whet
03f0: 68 65 72 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  her to remember 
0400: 70 72 6f 6d 70 74 65 64 20 70 77 20 2a 2f 0a 23  prompted pw */.#
0410: 64 65 66 69 6e 65 20 55 52 4c 5f 52 45 4d 45 4d  define URL_REMEM
0420: 42 45 52 5f 50 57 20 20 20 20 20 20 30 78 30 30  BER_PW      0x00
0430: 30 38 20 20 2f 2a 20 53 68 6f 75 6c 64 20 72 65  08  /* Should re
0440: 6d 65 6d 62 65 72 20 70 77 20 2a 2f 0a 23 64 65  member pw */.#de
0450: 66 69 6e 65 20 55 52 4c 5f 50 52 4f 4d 50 54 45  fine URL_PROMPTE
0460: 44 20 20 20 20 20 20 20 20 20 30 78 30 30 31 30  D         0x0010
0470: 20 20 2f 2a 20 50 72 6f 6d 70 74 65 64 20 66 6f    /* Prompted fo
0480: 72 20 50 57 20 61 6c 72 65 61 64 79 20 2a 2f 0a  r PW already */.
0490: 23 64 65 66 69 6e 65 20 55 52 4c 5f 4f 4d 49 54  #define URL_OMIT
04a0: 5f 55 53 45 52 20 20 20 20 20 20 20 20 30 78 30  _USER        0x0
04b0: 30 32 30 20 20 2f 2a 20 4f 6d 69 74 20 74 68 65  020  /* Omit the
04c0: 20 75 73 65 72 20 6e 61 6d 65 20 66 72 6f 6d 20   user name from 
04d0: 55 52 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  URL */.#define U
04e0: 52 4c 5f 55 53 45 5f 43 4f 4e 46 49 47 20 20 20  RL_USE_CONFIG   
04f0: 20 20 20 20 30 78 30 30 34 30 20 20 2f 2a 20 55      0x0040  /* U
0500: 73 65 20 72 65 6d 65 6d 62 65 72 65 64 20 55 52  se remembered UR
0510: 4c 73 20 66 72 6f 6d 20 43 4f 4e 46 49 47 20 74  Ls from CONFIG t
0520: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
0530: 55 52 4c 5f 55 53 45 5f 50 41 52 45 4e 54 20 20  URL_USE_PARENT  
0540: 20 20 20 20 20 30 78 30 30 38 30 20 20 2f 2a 20       0x0080  /* 
0550: 55 73 65 20 74 68 65 20 55 52 4c 20 6f 66 20 74  Use the URL of t
0560: 68 65 20 70 61 72 65 6e 74 20 70 72 6f 6a 65 63  he parent projec
0570: 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 52 4c  t */.#define URL
0580: 5f 53 53 48 5f 50 41 54 48 20 20 20 20 20 20 20  _SSH_PATH       
0590: 20 20 30 78 30 31 30 30 20 20 2f 2a 20 49 6e 63    0x0100  /* Inc
05a0: 6c 75 64 65 20 50 41 54 48 3d 20 6f 6e 20 53 53  lude PATH= on SS
05b0: 48 20 73 79 6e 63 73 20 2a 2f 0a 23 64 65 66 69  H syncs */.#defi
05c0: 6e 65 20 55 52 4c 5f 53 53 48 5f 52 45 54 52 59  ne URL_SSH_RETRY
05d0: 20 20 20 20 20 20 20 20 30 78 30 32 30 30 20 20          0x0200  
05e0: 2f 2a 20 54 68 69 73 20 61 20 72 65 74 72 79 20  /* This a retry 
05f0: 6f 66 20 61 6e 20 53 53 48 20 2a 2f 0a 23 64 65  of an SSH */.#de
0600: 66 69 6e 65 20 55 52 4c 5f 53 53 48 5f 45 58 45  fine URL_SSH_EXE
0610: 20 20 20 20 20 20 20 20 20 20 30 78 30 34 30 30            0x0400
0620: 20 20 2f 2a 20 73 73 68 3a 20 55 52 4c 20 63 6f    /* ssh: URL co
0630: 6e 74 61 69 6e 73 20 66 6f 73 73 69 6c 3d 20 71  ntains fossil= q
0640: 75 65 72 79 20 70 61 72 61 6d 2a 2f 0a 0a 2f 2a  uery param*/../*
0650: 0a 2a 2a 20 54 68 65 20 55 52 4c 20 72 65 6c 61  .** The URL rela
0660: 74 65 64 20 64 61 74 61 20 75 73 65 64 20 77 69  ted data used wi
0670: 74 68 20 74 68 69 73 20 73 75 62 73 79 73 74 65  th this subsyste
0680: 6d 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 72 6c  m..*/.struct Url
0690: 44 61 74 61 20 7b 0a 20 20 69 6e 74 20 69 73 46  Data {.  int isF
06a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ile;           /
06b0: 2a 20 54 72 75 65 20 69 66 20 61 20 22 66 69 6c  * True if a "fil
06c0: 65 3a 22 20 75 72 6c 20 2a 2f 0a 20 20 69 6e 74  e:" url */.  int
06d0: 20 69 73 48 74 74 70 73 3b 20 20 20 20 20 20 20   isHttps;       
06e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
06f0: 22 68 74 74 70 73 3a 22 20 75 72 6c 20 2a 2f 0a  "https:" url */.
0700: 20 20 69 6e 74 20 69 73 53 73 68 3b 20 20 20 20    int isSsh;    
0710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0720: 69 66 20 61 6e 20 22 73 73 68 3a 22 20 75 72 6c  if an "ssh:" url
0730: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 6c 69 61   */.  int isAlia
0740: 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
0750: 6e 70 75 74 20 55 52 4c 20 77 61 73 20 61 6e 20  nput URL was an 
0760: 61 6c 69 61 73 20 2a 2f 0a 20 20 63 68 61 72 20  alias */.  char 
0770: 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  *name;          
0780: 20 2f 2a 20 48 6f 73 74 6e 61 6d 65 20 66 6f 72   /* Hostname for
0790: 20 68 74 74 70 3a 20 6f 72 20 66 69 6c 65 6e 61   http: or filena
07a0: 6d 65 20 66 6f 72 20 66 69 6c 65 3a 20 2a 2f 0a  me for file: */.
07b0: 20 20 63 68 61 72 20 2a 68 6f 73 74 6e 61 6d 65    char *hostname
07c0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48  ;       /* The H
07d0: 4f 53 54 3a 20 70 61 72 61 6d 65 74 65 72 20 6f  OST: parameter o
07e0: 6e 20 68 74 74 70 20 68 65 61 64 65 72 73 20 2a  n http headers *
07f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
0800: 70 72 6f 74 6f 63 6f 6c 3b 20 2f 2a 20 22 68 74  protocol; /* "ht
0810: 74 70 22 20 6f 72 20 22 68 74 74 70 73 22 20 6f  tp" or "https" o
0820: 72 20 22 73 73 68 22 20 6f 72 20 22 66 69 6c 65  r "ssh" or "file
0830: 22 20 2a 2f 0a 20 20 69 6e 74 20 70 6f 72 74 3b  " */.  int port;
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0850: 54 43 50 20 70 6f 72 74 20 6e 75 6d 62 65 72 20  TCP port number 
0860: 66 6f 72 20 68 74 74 70 3a 20 6f 72 20 68 74 74  for http: or htt
0870: 70 73 3a 20 2a 2f 0a 20 20 69 6e 74 20 64 66 6c  ps: */.  int dfl
0880: 74 50 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f  tPort;         /
0890: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 6f  * The default po
08a0: 72 74 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  rt for the given
08b0: 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 63   protocol */.  c
08c0: 68 61 72 20 2a 70 61 74 68 3b 20 20 20 20 20 20  har *path;      
08d0: 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65       /* Pathname
08e0: 20 66 6f 72 20 68 74 74 70 3a 20 2a 2f 0a 20 20   for http: */.  
08f0: 63 68 61 72 20 2a 75 73 65 72 3b 20 20 20 20 20  char *user;     
0900: 20 20 20 20 20 20 2f 2a 20 55 73 65 72 20 69 64        /* User id
0910: 20 66 6f 72 20 68 74 74 70 3a 20 2a 2f 0a 20 20   for http: */.  
0920: 63 68 61 72 20 2a 70 61 73 73 77 64 3b 20 20 20  char *passwd;   
0930: 20 20 20 20 20 20 2f 2a 20 50 61 73 73 77 6f 72        /* Passwor
0940: 64 20 66 6f 72 20 68 74 74 70 3a 20 2a 2f 0a 20  d for http: */. 
0950: 20 63 68 61 72 20 2a 63 61 6e 6f 6e 69 63 61 6c   char *canonical
0960: 3b 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69  ;      /* Canoni
0970: 63 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  cal representati
0980: 6f 6e 20 6f 66 20 74 68 65 20 55 52 4c 20 2a 2f  on of the URL */
0990: 0a 20 20 63 68 61 72 20 2a 70 72 6f 78 79 41 75  .  char *proxyAu
09a0: 74 68 3b 20 20 20 20 20 20 2f 2a 20 50 72 6f 78  th;      /* Prox
09b0: 79 2d 41 75 74 68 6f 72 69 7a 65 72 3a 20 73 74  y-Authorizer: st
09c0: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
09d0: 66 6f 73 73 69 6c 3b 20 20 20 20 20 20 20 20 20  fossil;         
09e0: 2f 2a 20 54 68 65 20 66 6f 73 73 69 6c 20 71 75  /* The fossil qu
09f0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 6f 6e  ery parameter on
0a00: 20 73 73 68 3a 20 2a 2f 0a 20 20 63 68 61 72 20   ssh: */.  char 
0a10: 2a 70 77 43 6f 6e 66 69 67 3b 20 20 20 20 20 20  *pwConfig;      
0a20: 20 2f 2a 20 43 4f 4e 46 49 47 20 74 61 62 6c 65   /* CONFIG table
0a30: 20 65 6e 74 72 79 20 74 68 61 74 20 67 61 76 65   entry that gave
0a40: 20 75 73 20 74 68 65 20 70 61 73 73 77 6f 72 64   us the password
0a50: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66   */.  unsigned f
0a60: 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20 42  lags;       /* B
0a70: 6f 6f 6c 65 61 6e 20 66 6c 61 67 73 20 63 6f 6e  oolean flags con
0a80: 74 72 6f 6c 6c 69 6e 67 20 55 52 4c 20 70 72 6f  trolling URL pro
0a90: 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  cessing */.  int
0aa0: 20 75 73 65 50 72 6f 78 79 3b 20 20 20 20 20 20   useProxy;      
0ab0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 72 65     /* Used to re
0ac0: 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 70 72  member that a pr
0ad0: 6f 78 79 20 69 73 20 69 6e 20 75 73 65 20 2a 2f  oxy is in use */
0ae0: 0a 20 20 69 6e 74 20 70 72 6f 78 79 4f 72 69 67  .  int proxyOrig
0af0: 50 6f 72 74 3b 20 20 20 20 20 20 20 2f 2a 20 54  Port;       /* T
0b00: 75 6e 6e 65 6c 65 64 20 70 6f 72 74 20 6e 75 6d  unneled port num
0b10: 62 65 72 20 66 6f 72 20 68 74 74 70 73 20 74 68  ber for https th
0b20: 72 6f 75 67 68 20 70 72 6f 78 79 20 2a 2f 0a 20  rough proxy */. 
0b30: 20 63 68 61 72 20 2a 70 72 6f 78 79 55 72 6c 50   char *proxyUrlP
0b40: 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 52 65 6d  ath;      /* Rem
0b50: 65 6d 62 65 72 20 70 61 74 68 20 77 68 65 6e 20  ember path when 
0b60: 70 72 6f 78 79 20 69 73 20 75 73 65 20 2a 2f 0a  proxy is use */.
0b70: 20 20 63 68 61 72 20 2a 70 72 6f 78 79 55 72 6c    char *proxyUrl
0b80: 43 61 6e 6f 6e 69 63 61 6c 3b 20 2f 2a 20 52 65  Canonical; /* Re
0b90: 6d 65 6d 62 65 72 20 63 61 6e 6f 6e 69 63 61 6c  member canonical
0ba0: 20 70 61 74 68 20 77 68 65 6e 20 70 72 6f 78 79   path when proxy
0bb0: 20 69 73 20 75 73 65 20 2a 2f 0a 7d 3b 0a 23 65   is use */.};.#e
0bc0: 6e 64 69 66 20 2f 2a 20 49 4e 54 45 52 46 41 43  ndif /* INTERFAC
0bd0: 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  E */.../*.** Par
0be0: 73 65 20 74 68 65 20 55 52 4c 20 69 6e 20 74 68  se the URL in th
0bf0: 65 20 7a 55 72 6c 20 61 72 67 75 6d 65 6e 74 2e  e zUrl argument.
0c00: 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73 20 69   Store results i
0c10: 6e 20 74 68 65 20 70 55 72 6c 44 61 74 61 20 6f  n the pUrlData o
0c20: 62 6a 65 63 74 2e 0a 2a 2a 20 50 6f 70 75 6c 61  bject..** Popula
0c30: 74 65 20 6d 65 6d 62 65 72 73 20 6f 66 20 70 55  te members of pU
0c40: 72 6c 44 61 74 61 20 61 73 20 66 6f 6c 6c 6f 77  rlData as follow
0c50: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 69 73  s:.**.**      is
0c60: 46 69 6c 65 20 20 20 20 20 20 54 72 75 65 20 69  File      True i
0c70: 66 20 46 49 4c 45 3a 0a 2a 2a 20 20 20 20 20 20  f FILE:.**      
0c80: 69 73 48 74 74 70 73 20 20 20 20 20 54 72 75 65  isHttps     True
0c90: 20 69 66 20 48 54 54 50 53 3a 0a 2a 2a 20 20 20   if HTTPS:.**   
0ca0: 20 20 20 69 73 53 73 68 20 20 20 20 20 20 20 54     isSsh       T
0cb0: 72 75 65 20 69 66 20 53 53 48 3a 0a 2a 2a 20 20  rue if SSH:.**  
0cc0: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 20 20 20 20      protocol    
0cd0: 22 68 74 74 70 22 20 6f 72 20 22 68 74 74 70 73  "http" or "https
0ce0: 22 20 6f 72 20 22 66 69 6c 65 22 20 6f 72 20 22  " or "file" or "
0cf0: 73 73 68 22 0a 2a 2a 20 20 20 20 20 20 6e 61 6d  ssh".**      nam
0d00: 65 20 20 20 20 20 20 20 20 48 6f 73 74 6e 61 6d  e        Hostnam
0d10: 65 20 66 6f 72 20 48 54 54 50 3a 2c 20 48 54 54  e for HTTP:, HTT
0d20: 50 53 3a 2c 20 53 53 48 3a 2e 20 20 46 69 6c 65  PS:, SSH:.  File
0d30: 6e 61 6d 65 20 66 6f 72 20 46 49 4c 45 3a 0a 2a  name for FILE:.*
0d40: 2a 20 20 20 20 20 20 70 6f 72 74 20 20 20 20 20  *      port     
0d50: 20 20 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62     TCP port numb
0d60: 65 72 20 66 6f 72 20 48 54 54 50 20 6f 72 20 48  er for HTTP or H
0d70: 54 54 50 53 2e 0a 2a 2a 20 20 20 20 20 20 64 66  TTPS..**      df
0d80: 6c 74 50 6f 72 74 20 20 20 20 44 65 66 61 75 6c  ltPort    Defaul
0d90: 74 20 54 43 50 20 70 6f 72 74 20 6e 75 6d 62 65  t TCP port numbe
0da0: 72 20 28 38 30 20 6f 72 20 34 34 33 29 2e 0a 2a  r (80 or 443)..*
0db0: 2a 20 20 20 20 20 20 70 61 74 68 20 20 20 20 20  *      path     
0dc0: 20 20 20 50 61 74 68 20 6e 61 6d 65 20 66 6f 72     Path name for
0dd0: 20 48 54 54 50 20 6f 72 20 48 54 54 50 53 2e 0a   HTTP or HTTPS..
0de0: 2a 2a 20 20 20 20 20 20 75 73 65 72 20 20 20 20  **      user    
0df0: 20 20 20 20 55 73 65 72 69 64 2e 0a 2a 2a 20 20      Userid..**  
0e00: 20 20 20 20 70 61 73 73 77 64 20 20 20 20 20 20      passwd      
0e10: 50 61 73 73 77 6f 72 64 2e 0a 2a 2a 20 20 20 20  Password..**    
0e20: 20 20 68 6f 73 74 6e 61 6d 65 20 20 20 20 48 4f    hostname    HO
0e30: 53 54 3a 50 4f 52 54 20 6f 72 20 6a 75 73 74 20  ST:PORT or just 
0e40: 48 4f 53 54 20 69 66 20 70 6f 72 74 20 69 73 20  HOST if port is 
0e50: 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20  the default..** 
0e60: 20 20 20 20 20 63 61 6e 6f 6e 69 63 61 6c 20 20       canonical  
0e70: 20 54 68 65 20 55 52 4c 20 69 6e 20 63 61 6e 6f   The URL in cano
0e80: 6e 69 63 61 6c 20 66 6f 72 6d 2c 20 6f 6d 69 74  nical form, omit
0e90: 74 69 6e 67 20 74 68 65 20 70 61 73 73 77 6f 72  ting the passwor
0ea0: 64 0a 2a 2a 0a 2a 2a 20 49 66 20 55 52 4c 5f 55  d.**.** If URL_U
0eb0: 53 45 43 4f 4e 46 49 47 20 69 73 20 73 65 74 20  SECONFIG is set 
0ec0: 61 6e 64 20 7a 55 72 6c 20 69 73 20 4e 55 4c 4c  and zUrl is NULL
0ed0: 20 6f 72 20 22 64 65 66 61 75 6c 74 22 2c 20 74   or "default", t
0ee0: 68 65 6e 20 70 61 72 73 65 20 74 68 65 0a 2a 2a  hen parse the.**
0ef0: 20 55 52 4c 20 73 74 6f 72 65 64 20 69 6e 20 6c   URL stored in l
0f00: 61 73 74 2d 73 79 6e 63 2d 75 72 6c 20 61 6e 64  ast-sync-url and
0f10: 20 6c 61 73 74 2d 73 79 6e 63 2d 70 77 20 6f 66   last-sync-pw of
0f20: 20 74 68 65 20 43 4f 4e 46 49 47 20 74 61 62 6c   the CONFIG tabl
0f30: 65 2e 20 20 4f 72 20 69 66 0a 2a 2a 20 55 52 4c  e.  Or if.** URL
0f40: 5f 55 53 45 5f 50 41 52 45 4e 54 20 69 73 20 61  _USE_PARENT is a
0f50: 6c 73 6f 20 73 65 74 2c 20 74 68 65 6e 20 75 73  lso set, then us
0f60: 65 20 70 61 72 65 6e 74 2d 70 72 6f 6a 65 63 74  e parent-project
0f70: 2d 75 72 6c 20 61 6e 64 0a 2a 2a 20 70 61 72 65  -url and.** pare
0f80: 6e 74 2d 70 72 6f 6a 65 63 74 2d 70 77 20 66 72  nt-project-pw fr
0f90: 6f 6d 20 74 68 65 20 43 4f 4e 46 49 47 20 74 61  om the CONFIG ta
0fa0: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6c  ble instead of l
0fb0: 61 73 74 2d 73 79 6e 63 2d 75 72 6c 0a 2a 2a 20  ast-sync-url.** 
0fc0: 61 6e 64 20 6c 61 73 74 2d 73 79 6e 63 2d 70 77  and last-sync-pw
0fd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 55 52 4c 5f 55  ..**.** If URL_U
0fe0: 53 45 5f 43 4f 4e 46 49 47 20 69 73 20 73 65 74  SE_CONFIG is set
0ff0: 20 61 6e 64 20 7a 55 72 6c 20 69 73 20 61 20 73   and zUrl is a s
1000: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 2c 20 74 68  ymbolic name, th
1010: 65 6e 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  en look up.** th
1020: 65 20 55 52 4c 20 69 6e 20 73 79 6e 63 2d 75 72  e URL in sync-ur
1030: 6c 3a 25 51 20 61 6e 64 20 73 79 6e 63 2d 70 77  l:%Q and sync-pw
1040: 3a 25 51 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  :%Q elements of 
1050: 74 68 65 20 43 4f 4e 46 49 47 20 74 61 62 6c 65  the CONFIG table
1060: 20 77 68 65 72 65 0a 2a 2a 20 25 51 20 69 73 20   where.** %Q is 
1070: 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  the symbolic nam
1080: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1090: 75 74 69 6e 65 20 64 69 66 66 65 72 73 20 66 72  utine differs fr
10a0: 6f 6d 20 75 72 6c 5f 70 61 72 73 65 28 29 20 69  om url_parse() i
10b0: 6e 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  n that this rout
10c0: 69 6e 65 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  ine stores the.*
10d0: 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 70 55 72  * results in pUr
10e0: 6c 44 61 74 61 20 61 6e 64 20 64 6f 65 73 20 6e  lData and does n
10f0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  ot change the va
1100: 6c 75 65 73 20 6f 66 20 67 6c 6f 62 61 6c 20 76  lues of global v
1110: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 20 54 68 65  ariables..** The
1120: 20 75 72 6c 5f 70 61 72 73 65 28 29 20 72 6f 75   url_parse() rou
1130: 74 69 6e 65 20 70 75 74 73 20 69 74 73 20 72 65  tine puts its re
1140: 73 75 6c 74 20 69 6e 20 67 2e 75 72 6c 2e 0a 2a  sult in g.url..*
1150: 2f 0a 76 6f 69 64 20 75 72 6c 5f 70 61 72 73 65  /.void url_parse
1160: 5f 6c 6f 63 61 6c 28 0a 20 20 63 6f 6e 73 74 20  _local(.  const 
1170: 63 68 61 72 20 2a 7a 55 72 6c 2c 0a 20 20 75 6e  char *zUrl,.  un
1180: 73 69 67 6e 65 64 20 69 6e 74 20 75 72 6c 46 6c  signed int urlFl
1190: 61 67 73 2c 0a 20 20 55 72 6c 44 61 74 61 20 2a  ags,.  UrlData *
11a0: 70 55 72 6c 44 61 74 61 0a 29 7b 0a 20 20 69 6e  pUrlData.){.  in
11b0: 74 20 69 2c 20 6a 2c 20 63 3b 0a 20 20 63 68 61  t i, j, c;.  cha
11c0: 72 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 0a 0a 20  r *zFile = 0;.. 
11d0: 20 6d 65 6d 73 65 74 28 70 55 72 6c 44 61 74 61   memset(pUrlData
11e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 55 72  , 0, sizeof(*pUr
11f0: 6c 44 61 74 61 29 29 3b 0a 20 20 69 66 28 20 75  lData));.  if( u
1200: 72 6c 46 6c 61 67 73 20 26 20 55 52 4c 5f 55 53  rlFlags & URL_US
1210: 45 5f 43 4f 4e 46 49 47 20 29 7b 0a 20 20 20 20  E_CONFIG ){.    
1220: 69 66 28 20 7a 55 72 6c 3d 3d 30 20 7c 7c 20 73  if( zUrl==0 || s
1230: 74 72 63 6d 70 28 7a 55 72 6c 2c 22 64 65 66 61  trcmp(zUrl,"defa
1240: 75 6c 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ult")==0 ){.    
1250: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1260: 77 43 6f 6e 66 69 67 20 3d 20 22 6c 61 73 74 2d  wConfig = "last-
1270: 73 79 6e 63 2d 70 77 22 3b 0a 20 20 20 20 20 20  sync-pw";.      
1280: 69 66 28 20 75 72 6c 46 6c 61 67 73 20 26 20 55  if( urlFlags & U
1290: 52 4c 5f 55 53 45 5f 50 41 52 45 4e 54 20 29 7b  RL_USE_PARENT ){
12a0: 0a 20 20 20 20 20 20 20 20 7a 55 72 6c 20 3d 20  .        zUrl = 
12b0: 64 62 5f 67 65 74 28 22 70 61 72 65 6e 74 2d 70  db_get("parent-p
12c0: 72 6f 6a 65 63 74 2d 75 72 6c 22 2c 20 30 29 3b  roject-url", 0);
12d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 55 72  .        if( zUr
12e0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
12f0: 20 20 7a 55 72 6c 20 3d 20 64 62 5f 67 65 74 28    zUrl = db_get(
1300: 22 6c 61 73 74 2d 73 79 6e 63 2d 75 72 6c 22 2c  "last-sync-url",
1310: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
1320: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 50 77  e{.          zPw
1330: 43 6f 6e 66 69 67 20 3d 20 22 70 61 72 65 6e 74  Config = "parent
1340: 2d 70 72 6f 6a 65 63 74 2d 70 77 22 3b 0a 20 20  -project-pw";.  
1350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 55 72  lse{.        zUr
1370: 6c 20 3d 20 64 62 5f 67 65 74 28 22 6c 61 73 74  l = db_get("last
1380: 2d 73 79 6e 63 2d 75 72 6c 22 2c 20 30 29 3b 0a  -sync-url", 0);.
1390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13a0: 28 20 7a 55 72 6c 3d 3d 30 20 29 20 72 65 74 75  ( zUrl==0 ) retu
13b0: 72 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  rn;.      if( pU
13c0: 72 6c 44 61 74 61 2d 3e 70 61 73 73 77 64 3d 3d  rlData->passwd==
13d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 55 72  0 ){.        pUr
13e0: 6c 44 61 74 61 2d 3e 70 61 73 73 77 64 20 3d 20  lData->passwd = 
13f0: 75 6e 6f 62 73 63 75 72 65 28 64 62 5f 67 65 74  unobscure(db_get
1400: 28 7a 50 77 43 6f 6e 66 69 67 2c 20 30 29 29 3b  (zPwConfig, 0));
1410: 0a 20 20 20 20 20 20 20 20 70 55 72 6c 44 61 74  .        pUrlDat
1420: 61 2d 3e 70 77 43 6f 6e 66 69 67 20 3d 20 66 6f  a->pwConfig = fo
1430: 73 73 69 6c 5f 73 74 72 64 75 70 28 7a 50 77 43  ssil_strdup(zPwC
1440: 6f 6e 66 69 67 29 3b 0a 20 20 20 20 20 20 7d 0a  onfig);.      }.
1450: 20 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e        pUrlData->
1460: 69 73 41 6c 69 61 73 20 3d 20 31 3b 0a 20 20 20  isAlias = 1;.   
1470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
1480: 61 72 20 2a 7a 4b 65 79 20 3d 20 73 71 6c 69 74  ar *zKey = sqlit
1490: 65 33 5f 6d 70 72 69 6e 74 66 28 22 73 79 6e 63  e3_mprintf("sync
14a0: 2d 75 72 6c 3a 25 71 22 2c 20 7a 55 72 6c 29 3b  -url:%q", zUrl);
14b0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 6c  .      char *zAl
14c0: 74 20 3d 20 64 62 5f 67 65 74 28 7a 4b 65 79 2c  t = db_get(zKey,
14d0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a   0);.      if( z
14e0: 41 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Alt ){.        p
14f0: 55 72 6c 44 61 74 61 2d 3e 70 77 43 6f 6e 66 69  UrlData->pwConfi
1500: 67 20 3d 20 6d 70 72 69 6e 74 66 28 22 73 79 6e  g = mprintf("syn
1510: 63 2d 70 77 3a 25 71 22 2c 20 7a 55 72 6c 29 3b  c-pw:%q", zUrl);
1520: 0a 20 20 20 20 20 20 20 20 70 55 72 6c 44 61 74  .        pUrlDat
1530: 61 2d 3e 70 61 73 73 77 64 20 3d 20 75 6e 6f 62  a->passwd = unob
1540: 73 63 75 72 65 28 0a 20 20 20 20 20 20 20 20 20  scure(.         
1550: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c   db_text(0, "SEL
1560: 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d 20 63  ECT value FROM c
1570: 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 6d 65  onfig WHERE name
1580: 3d 27 73 79 6e 63 2d 70 77 3a 25 71 27 22 2c 7a  ='sync-pw:%q'",z
1590: 55 72 6c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Url).        );.
15a0: 20 20 20 20 20 20 20 20 7a 55 72 6c 20 3d 20 7a          zUrl = z
15b0: 41 6c 74 3b 0a 20 20 20 20 20 20 20 20 75 72 6c  Alt;.        url
15c0: 46 6c 61 67 73 20 7c 3d 20 55 52 4c 5f 52 45 4d  Flags |= URL_REM
15d0: 45 4d 42 45 52 5f 50 57 3b 0a 20 20 20 20 20 20  EMBER_PW;.      
15e0: 20 20 70 55 72 6c 44 61 74 61 2d 3e 69 73 41 6c    pUrlData->isAl
15f0: 69 61 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ias = 1;.      }
1600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 55  else{.        pU
1610: 72 6c 44 61 74 61 2d 3e 69 73 41 6c 69 61 73 20  rlData->isAlias 
1620: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1630: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1640: 7a 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zKey);.    }.  }
1650: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 7a 55  else{.    if( zU
1660: 72 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  rl==0 ) return;.
1670: 20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 6e 63    }..  if( strnc
1680: 6d 70 28 7a 55 72 6c 2c 20 22 68 74 74 70 3a 2f  mp(zUrl, "http:/
1690: 2f 22 2c 20 37 29 3d 3d 30 0a 20 20 20 7c 7c 20  /", 7)==0.   || 
16a0: 73 74 72 6e 63 6d 70 28 7a 55 72 6c 2c 20 22 68  strncmp(zUrl, "h
16b0: 74 74 70 73 3a 2f 2f 22 2c 20 38 29 3d 3d 30 0a  ttps://", 8)==0.
16c0: 20 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 7a 55     || strncmp(zU
16d0: 72 6c 2c 20 22 73 73 68 3a 2f 2f 22 2c 20 36 29  rl, "ssh://", 6)
16e0: 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  ==0.  ){.    int
16f0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 63 68 61   iStart;.    cha
1700: 72 20 2a 7a 4c 6f 67 69 6e 3b 0a 20 20 20 20 63  r *zLogin;.    c
1710: 68 61 72 20 2a 7a 45 78 65 3b 0a 20 20 20 20 63  har *zExe;.    c
1720: 68 61 72 20 63 51 75 65 72 79 53 65 70 20 3d 20  har cQuerySep = 
1730: 27 3f 27 3b 0a 0a 20 20 20 20 69 66 28 20 7a 55  '?';..    if( zU
1740: 72 6c 5b 34 5d 3d 3d 27 73 27 20 29 7b 0a 20 20  rl[4]=='s' ){.  
1750: 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 69 73      pUrlData->is
1760: 48 74 74 70 73 20 3d 20 31 3b 0a 20 20 20 20 20  Https = 1;.     
1770: 20 70 55 72 6c 44 61 74 61 2d 3e 70 72 6f 74 6f   pUrlData->proto
1780: 63 6f 6c 20 3d 20 22 68 74 74 70 73 22 3b 0a 20  col = "https";. 
1790: 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 64       pUrlData->d
17a0: 66 6c 74 50 6f 72 74 20 3d 20 34 34 33 3b 0a 20  fltPort = 443;. 
17b0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 38 3b       iStart = 8;
17c0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
17d0: 55 72 6c 5b 30 5d 3d 3d 27 73 27 20 29 7b 0a 20  Url[0]=='s' ){. 
17e0: 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 69       pUrlData->i
17f0: 73 53 73 68 20 3d 20 31 3b 0a 20 20 20 20 20 20  sSsh = 1;.      
1800: 70 55 72 6c 44 61 74 61 2d 3e 70 72 6f 74 6f 63  pUrlData->protoc
1810: 6f 6c 20 3d 20 22 73 73 68 22 3b 0a 20 20 20 20  ol = "ssh";.    
1820: 20 20 70 55 72 6c 44 61 74 61 2d 3e 64 66 6c 74    pUrlData->dflt
1830: 50 6f 72 74 20 3d 20 32 32 3b 0a 20 20 20 20 20  Port = 22;.     
1840: 20 70 55 72 6c 44 61 74 61 2d 3e 66 6f 73 73 69   pUrlData->fossi
1850: 6c 20 3d 20 66 6f 73 73 69 6c 5f 73 74 72 64 75  l = fossil_strdu
1860: 70 28 22 66 6f 73 73 69 6c 22 29 3b 0a 20 20 20  p("fossil");.   
1870: 20 20 20 69 53 74 61 72 74 20 3d 20 36 3b 0a 20     iStart = 6;. 
1880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1890: 70 55 72 6c 44 61 74 61 2d 3e 69 73 48 74 74 70  pUrlData->isHttp
18a0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 55 72  s = 0;.      pUr
18b0: 6c 44 61 74 61 2d 3e 70 72 6f 74 6f 63 6f 6c 20  lData->protocol 
18c0: 3d 20 22 68 74 74 70 22 3b 0a 20 20 20 20 20 20  = "http";.      
18d0: 70 55 72 6c 44 61 74 61 2d 3e 64 66 6c 74 50 6f  pUrlData->dfltPo
18e0: 72 74 20 3d 20 38 30 3b 0a 20 20 20 20 20 20 69  rt = 80;.      i
18f0: 53 74 61 72 74 20 3d 20 37 3b 0a 20 20 20 20 7d  Start = 7;.    }
1900: 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72  .    for(i=iStar
1910: 74 3b 20 28 63 3d 7a 55 72 6c 5b 69 5d 29 21 3d  t; (c=zUrl[i])!=
1920: 30 20 26 26 20 63 21 3d 27 2f 27 20 26 26 20 63  0 && c!='/' && c
1930: 21 3d 27 40 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  !='@'; i++){}.  
1940: 20 20 69 66 28 20 63 3d 3d 27 40 27 20 29 7b 0a    if( c=='@' ){.
1950: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 75        /* Parse u
1960: 70 20 74 68 65 20 75 73 65 72 2d 69 64 20 61 6e  p the user-id an
1970: 64 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  d password */.  
1980: 20 20 20 20 66 6f 72 28 6a 3d 69 53 74 61 72 74      for(j=iStart
1990: 3b 20 6a 3c 69 20 26 26 20 7a 55 72 6c 5b 6a 5d  ; j<i && zUrl[j]
19a0: 21 3d 27 3a 27 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  !=':'; j++){}.  
19b0: 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 75 73      pUrlData->us
19c0: 65 72 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e  er = mprintf("%.
19d0: 2a 73 22 2c 20 6a 2d 69 53 74 61 72 74 2c 20 26  *s", j-iStart, &
19e0: 7a 55 72 6c 5b 69 53 74 61 72 74 5d 29 3b 0a 20  zUrl[iStart]);. 
19f0: 20 20 20 20 20 64 65 68 74 74 70 69 7a 65 28 70       dehttpize(p
1a00: 55 72 6c 44 61 74 61 2d 3e 75 73 65 72 29 3b 0a  UrlData->user);.
1a10: 20 20 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b        if( j<i ){
1a20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 20 75  .        if( ( u
1a30: 72 6c 46 6c 61 67 73 20 26 20 55 52 4c 5f 52 45  rlFlags & URL_RE
1a40: 4d 45 4d 42 45 52 20 29 20 26 26 20 70 55 72 6c  MEMBER ) && pUrl
1a50: 44 61 74 61 2d 3e 69 73 53 73 68 3d 3d 30 20 29  Data->isSsh==0 )
1a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 72 6c 46  {.          urlF
1a70: 6c 61 67 73 20 7c 3d 20 55 52 4c 5f 41 53 4b 5f  lags |= URL_ASK_
1a80: 52 45 4d 45 4d 42 45 52 5f 50 57 3b 0a 20 20 20  REMEMBER_PW;.   
1a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1aa0: 55 72 6c 44 61 74 61 2d 3e 70 61 73 73 77 64 20  UrlData->passwd 
1ab0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22  = mprintf("%.*s"
1ac0: 2c 20 69 2d 6a 2d 31 2c 20 26 7a 55 72 6c 5b 6a  , i-j-1, &zUrl[j
1ad0: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 64 65  +1]);.        de
1ae0: 68 74 74 70 69 7a 65 28 70 55 72 6c 44 61 74 61  httpize(pUrlData
1af0: 2d 3e 70 61 73 73 77 64 29 3b 0a 20 20 20 20 20  ->passwd);.     
1b00: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 55 72   }.      if( pUr
1b10: 6c 44 61 74 61 2d 3e 69 73 53 73 68 20 29 7b 0a  lData->isSsh ){.
1b20: 20 20 20 20 20 20 20 20 75 72 6c 46 6c 61 67 73          urlFlags
1b30: 20 26 3d 20 7e 55 52 4c 5f 41 53 4b 5f 52 45 4d   &= ~URL_ASK_REM
1b40: 45 4d 42 45 52 5f 50 57 3b 0a 20 20 20 20 20 20  EMBER_PW;.      
1b50: 7d 0a 20 20 20 20 20 20 69 66 28 20 75 72 6c 46  }.      if( urlF
1b60: 6c 61 67 73 20 26 20 55 52 4c 5f 4f 4d 49 54 5f  lags & URL_OMIT_
1b70: 55 53 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  USER ){.        
1b80: 7a 4c 6f 67 69 6e 20 3d 20 6d 70 72 69 6e 74 66  zLogin = mprintf
1b90: 28 22 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ("");.      }els
1ba0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 6f 67 69  e{.        zLogi
1bb0: 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 74 40  n = mprintf("%t@
1bc0: 22 2c 20 70 55 72 6c 44 61 74 61 2d 3e 75 73 65  ", pUrlData->use
1bd0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1be0: 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 28 63 3d    for(j=i+1; (c=
1bf0: 7a 55 72 6c 5b 6a 5d 29 21 3d 30 20 26 26 20 63  zUrl[j])!=0 && c
1c00: 21 3d 27 2f 27 20 26 26 20 63 21 3d 27 3a 27 3b  !='/' && c!=':';
1c10: 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 70 55   j++){}.      pU
1c20: 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 20 3d 20 6d  rlData->name = m
1c30: 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 6a  printf("%.*s", j
1c40: 2d 69 2d 31 2c 20 26 7a 55 72 6c 5b 69 2b 31 5d  -i-1, &zUrl[i+1]
1c50: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 6a 3b 0a  );.      i = j;.
1c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c70: 20 69 6e 74 20 69 6e 53 71 75 61 72 65 20 3d 20   int inSquare = 
1c80: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  0;.      int n;.
1c90: 20 20 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61        for(i=iSta
1ca0: 72 74 3b 20 28 63 3d 7a 55 72 6c 5b 69 5d 29 21  rt; (c=zUrl[i])!
1cb0: 3d 30 20 26 26 20 63 21 3d 27 2f 27 20 26 26 20  =0 && c!='/' && 
1cc0: 28 69 6e 53 71 75 61 72 65 20 7c 7c 20 63 21 3d  (inSquare || c!=
1cd0: 27 3a 27 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ':'); i++){.    
1ce0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5b 27 20 29      if( c=='[' )
1cf0: 20 69 6e 53 71 75 61 72 65 20 3d 20 31 3b 0a 20   inSquare = 1;. 
1d00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
1d10: 27 20 29 20 69 6e 53 71 75 61 72 65 20 3d 20 30  ' ) inSquare = 0
1d20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d30: 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 20 3d  pUrlData->name =
1d40: 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c   mprintf("%.*s",
1d50: 20 69 2d 69 53 74 61 72 74 2c 20 26 7a 55 72 6c   i-iStart, &zUrl
1d60: 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20  [iStart]);.     
1d70: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 55 72 6c   n = strlen(pUrl
1d80: 44 61 74 61 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  Data->name);.   
1d90: 20 20 20 69 66 28 20 70 55 72 6c 44 61 74 61 2d     if( pUrlData-
1da0: 3e 6e 61 6d 65 5b 30 5d 3d 3d 27 5b 27 20 26 26  >name[0]=='[' &&
1db0: 20 6e 3e 32 20 26 26 20 70 55 72 6c 44 61 74 61   n>2 && pUrlData
1dc0: 2d 3e 6e 61 6d 65 5b 6e 2d 31 5d 3d 3d 27 5d 27  ->name[n-1]==']'
1dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 55 72 6c   ){.        pUrl
1de0: 44 61 74 61 2d 3e 6e 61 6d 65 2b 2b 3b 0a 20 20  Data->name++;.  
1df0: 20 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e        pUrlData->
1e00: 6e 61 6d 65 5b 6e 2d 32 5d 20 3d 20 30 3b 0a 20  name[n-2] = 0;. 
1e10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4c 6f       }.      zLo
1e20: 67 69 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 22  gin = mprintf(""
1e30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 73  );.    }.    fos
1e40: 73 69 6c 5f 73 74 72 74 6f 6c 77 72 28 70 55 72  sil_strtolwr(pUr
1e50: 6c 44 61 74 61 2d 3e 6e 61 6d 65 29 3b 0a 20 20  lData->name);.  
1e60: 20 20 69 66 28 20 63 3d 3d 27 3a 27 20 29 7b 0a    if( c==':' ){.
1e70: 20 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e        pUrlData->
1e80: 70 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  port = 0;.      
1e90: 69 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  i++;.      while
1ea0: 28 20 28 63 20 3d 20 7a 55 72 6c 5b 69 5d 29 21  ( (c = zUrl[i])!
1eb0: 3d 30 20 26 26 20 66 6f 73 73 69 6c 5f 69 73 64  =0 && fossil_isd
1ec0: 69 67 69 74 28 63 29 20 29 7b 0a 20 20 20 20 20  igit(c) ){.     
1ed0: 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 70 6f 72     pUrlData->por
1ee0: 74 20 3d 20 70 55 72 6c 44 61 74 61 2d 3e 70 6f  t = pUrlData->po
1ef0: 72 74 2a 31 30 20 2b 20 63 20 2d 20 27 30 27 3b  rt*10 + c - '0';
1f00: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
1f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1f20: 63 21 3d 30 20 26 26 20 63 21 3d 27 2f 27 20 29  c!=0 && c!='/' )
1f30: 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 22 75   fossil_fatal("u
1f40: 72 6c 20 6d 69 73 73 69 6e 67 20 27 2f 27 20 61  rl missing '/' a
1f50: 66 74 65 72 20 70 6f 72 74 20 6e 75 6d 62 65 72  fter port number
1f60: 22 29 3b 0a 20 20 20 20 20 20 70 55 72 6c 44 61  ");.      pUrlDa
1f70: 74 61 2d 3e 68 6f 73 74 6e 61 6d 65 20 3d 20 6d  ta->hostname = m
1f80: 70 72 69 6e 74 66 28 22 25 73 3a 25 64 22 2c 20  printf("%s:%d", 
1f90: 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 2c 20  pUrlData->name, 
1fa0: 70 55 72 6c 44 61 74 61 2d 3e 70 6f 72 74 29 3b  pUrlData->port);
1fb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fc0: 20 20 70 55 72 6c 44 61 74 61 2d 3e 70 6f 72 74    pUrlData->port
1fd0: 20 3d 20 70 55 72 6c 44 61 74 61 2d 3e 64 66 6c   = pUrlData->dfl
1fe0: 74 50 6f 72 74 3b 0a 20 20 20 20 20 20 70 55 72  tPort;.      pUr
1ff0: 6c 44 61 74 61 2d 3e 68 6f 73 74 6e 61 6d 65 20  lData->hostname 
2000: 3d 20 70 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65  = pUrlData->name
2010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 68 74  ;.    }.    deht
2020: 74 70 69 7a 65 28 70 55 72 6c 44 61 74 61 2d 3e  tpize(pUrlData->
2030: 6e 61 6d 65 29 3b 0a 20 20 20 20 70 55 72 6c 44  name);.    pUrlD
2040: 61 74 61 2d 3e 70 61 74 68 20 3d 20 6d 70 72 69  ata->path = mpri
2050: 6e 74 66 28 22 25 73 22 2c 20 26 7a 55 72 6c 5b  ntf("%s", &zUrl[
2060: 69 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  i]);.    for(i=0
2070: 3b 20 70 55 72 6c 44 61 74 61 2d 3e 70 61 74 68  ; pUrlData->path
2080: 5b 69 5d 20 26 26 20 70 55 72 6c 44 61 74 61 2d  [i] && pUrlData-
2090: 3e 70 61 74 68 5b 69 5d 21 3d 27 3f 27 3b 20 69  >path[i]!='?'; i
20a0: 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 55  ++){}.    if( pU
20b0: 72 6c 44 61 74 61 2d 3e 70 61 74 68 5b 69 5d 20  rlData->path[i] 
20c0: 29 7b 0a 20 20 20 20 20 20 70 55 72 6c 44 61 74  ){.      pUrlDat
20d0: 61 2d 3e 70 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  a->path[i] = 0;.
20e0: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d        i++;.    }
20f0: 0a 20 20 20 20 7a 45 78 65 20 3d 20 6d 70 72 69  .    zExe = mpri
2100: 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 77 68 69  ntf("");.    whi
2110: 6c 65 28 20 70 55 72 6c 44 61 74 61 2d 3e 70 61  le( pUrlData->pa
2120: 74 68 5b 69 5d 21 3d 30 20 29 7b 0a 20 20 20 20  th[i]!=0 ){.    
2130: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2a    char *zName, *
2140: 7a 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7a 4e  zValue;.      zN
2150: 61 6d 65 20 3d 20 26 70 55 72 6c 44 61 74 61 2d  ame = &pUrlData-
2160: 3e 70 61 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  >path[i];.      
2170: 7a 56 61 6c 75 65 20 3d 20 7a 4e 61 6d 65 3b 0a  zValue = zName;.
2180: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 55 72        while( pUr
2190: 6c 44 61 74 61 2d 3e 70 61 74 68 5b 69 5d 20 26  lData->path[i] &
21a0: 26 20 70 55 72 6c 44 61 74 61 2d 3e 70 61 74 68  & pUrlData->path
21b0: 5b 69 5d 21 3d 27 3d 27 20 29 7b 20 69 2b 2b 3b  [i]!='=' ){ i++;
21c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 55 72   }.      if( pUr
21d0: 6c 44 61 74 61 2d 3e 70 61 74 68 5b 69 5d 3d 3d  lData->path[i]==
21e0: 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
21f0: 55 72 6c 44 61 74 61 2d 3e 70 61 74 68 5b 69 5d  UrlData->path[i]
2200: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 2b   = 0;.        i+
2210: 2b 3b 0a 20 20 20 20 20 20 20 20 7a 56 61 6c 75  +;.        zValu
2220: 65 20 3d 20 26 70 55 72 6c 44 61 74 61 2d 3e 70  e = &pUrlData->p
2230: 61 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ath[i];.        
2240: 77 68 69 6c 65 28 20 70 55 72 6c 44 61 74 61 2d  while( pUrlData-
2250: 3e 70 61 74 68 5b 69 5d 20 26 26 20 70 55 72 6c  >path[i] && pUrl
2260: 44 61 74 61 2d 3e 70 61 74 68 5b 69 5d 21 3d 27  Data->path[i]!='
2270: 26 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  &' ){ i++; }.   
2280: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2290: 55 72 6c 44 61 74 61 2d 3e 70 61 74 68 5b 69 5d  UrlData->path[i]
22a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 55 72 6c   ){.        pUrl
22b0: 44 61 74 61 2d 3e 70 61 74 68 5b 69 5d 20 3d 20  Data->path[i] = 
22c0: 30 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  0;.        i++;.
22d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22e0: 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28  ( fossil_strcmp(
22f0: 7a 4e 61 6d 65 2c 22 66 6f 73 73 69 6c 22 29 3d  zName,"fossil")=
2300: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  =0 ){.        fo
2310: 73 73 69 6c 5f 66 72 65 65 28 70 55 72 6c 44 61  ssil_free(pUrlDa
2320: 74 61 2d 3e 66 6f 73 73 69 6c 29 3b 0a 20 20 20  ta->fossil);.   
2330: 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 66       pUrlData->f
2340: 6f 73 73 69 6c 20 3d 20 66 6f 73 73 69 6c 5f 73  ossil = fossil_s
2350: 74 72 64 75 70 28 7a 56 61 6c 75 65 29 3b 0a 20  trdup(zValue);. 
2360: 20 20 20 20 20 20 20 64 65 68 74 74 70 69 7a 65         dehttpize
2370: 28 70 55 72 6c 44 61 74 61 2d 3e 66 6f 73 73 69  (pUrlData->fossi
2380: 6c 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 73 73  l);.        foss
2390: 69 6c 5f 66 72 65 65 28 7a 45 78 65 29 3b 0a 20  il_free(zExe);. 
23a0: 20 20 20 20 20 20 20 7a 45 78 65 20 3d 20 6d 70         zExe = mp
23b0: 72 69 6e 74 66 28 22 25 63 66 6f 73 73 69 6c 3d  rintf("%cfossil=
23c0: 25 54 22 2c 20 63 51 75 65 72 79 53 65 70 2c 20  %T", cQuerySep, 
23d0: 70 55 72 6c 44 61 74 61 2d 3e 66 6f 73 73 69 6c  pUrlData->fossil
23e0: 29 3b 0a 20 20 20 20 20 20 20 20 63 51 75 65 72  );.        cQuer
23f0: 79 53 65 70 20 3d 20 27 26 27 3b 0a 20 20 20 20  ySep = '&';.    
2400: 20 20 20 20 75 72 6c 46 6c 61 67 73 20 7c 3d 20      urlFlags |= 
2410: 55 52 4c 5f 53 53 48 5f 45 58 45 3b 0a 20 20 20  URL_SSH_EXE;.   
2420: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2430: 64 65 68 74 74 70 69 7a 65 28 70 55 72 6c 44 61  dehttpize(pUrlDa
2440: 74 61 2d 3e 70 61 74 68 29 3b 0a 20 20 20 20 69  ta->path);.    i
2450: 66 28 20 70 55 72 6c 44 61 74 61 2d 3e 64 66 6c  f( pUrlData->dfl
2460: 74 50 6f 72 74 3d 3d 70 55 72 6c 44 61 74 61 2d  tPort==pUrlData-
2470: 3e 70 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 70  >port ){.      p
2480: 55 72 6c 44 61 74 61 2d 3e 63 61 6e 6f 6e 69 63  UrlData->canonic
2490: 61 6c 20 3d 20 6d 70 72 69 6e 74 66 28 0a 20 20  al = mprintf(.  
24a0: 20 20 20 20 20 20 22 25 73 3a 2f 2f 25 73 25 54        "%s://%s%T
24b0: 25 54 25 7a 22 2c 0a 20 20 20 20 20 20 20 20 70  %T%z",.        p
24c0: 55 72 6c 44 61 74 61 2d 3e 70 72 6f 74 6f 63 6f  UrlData->protoco
24d0: 6c 2c 20 7a 4c 6f 67 69 6e 2c 20 70 55 72 6c 44  l, zLogin, pUrlD
24e0: 61 74 61 2d 3e 6e 61 6d 65 2c 20 70 55 72 6c 44  ata->name, pUrlD
24f0: 61 74 61 2d 3e 70 61 74 68 2c 20 7a 45 78 65 0a  ata->path, zExe.
2500: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c        );.    }el
2510: 73 65 7b 0a 20 20 20 20 20 20 70 55 72 6c 44 61  se{.      pUrlDa
2520: 74 61 2d 3e 63 61 6e 6f 6e 69 63 61 6c 20 3d 20  ta->canonical = 
2530: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2540: 20 22 25 73 3a 2f 2f 25 73 25 54 3a 25 64 25 54   "%s://%s%T:%d%T
2550: 25 7a 22 2c 0a 20 20 20 20 20 20 20 20 70 55 72  %z",.        pUr
2560: 6c 44 61 74 61 2d 3e 70 72 6f 74 6f 63 6f 6c 2c  lData->protocol,
2570: 20 7a 4c 6f 67 69 6e 2c 20 70 55 72 6c 44 61 74   zLogin, pUrlDat
2580: 61 2d 3e 6e 61 6d 65 2c 20 70 55 72 6c 44 61 74  a->name, pUrlDat
2590: 61 2d 3e 70 6f 72 74 2c 0a 20 20 20 20 20 20 20  a->port,.       
25a0: 20 70 55 72 6c 44 61 74 61 2d 3e 70 61 74 68 2c   pUrlData->path,
25b0: 20 7a 45 78 65 0a 20 20 20 20 20 20 29 3b 0a 20   zExe.      );. 
25c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 55 72     }.    if( pUr
25d0: 6c 44 61 74 61 2d 3e 69 73 53 73 68 20 26 26 20  lData->isSsh && 
25e0: 70 55 72 6c 44 61 74 61 2d 3e 70 61 74 68 5b 31  pUrlData->path[1
25f0: 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ] ){.      char 
2600: 2a 7a 4f 6c 64 20 3d 20 70 55 72 6c 44 61 74 61  *zOld = pUrlData
2610: 2d 3e 70 61 74 68 3b 0a 20 20 20 20 20 20 70 55  ->path;.      pU
2620: 72 6c 44 61 74 61 2d 3e 70 61 74 68 20 3d 20 6d  rlData->path = m
2630: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4f 6c  printf("%s", zOl
2640: 64 2b 31 29 3b 0a 20 20 20 20 20 20 66 6f 73 73  d+1);.      foss
2650: 69 6c 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20  il_free(zOld);. 
2660: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 7a 4c     }.    free(zL
2670: 6f 67 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ogin);.  }else i
2680: 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 6c 2c  f( strncmp(zUrl,
2690: 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
26a0: 29 7b 0a 20 20 20 20 70 55 72 6c 44 61 74 61 2d  ){.    pUrlData-
26b0: 3e 69 73 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  >isFile = 1;.   
26c0: 20 69 66 28 20 7a 55 72 6c 5b 35 5d 3d 3d 27 2f   if( zUrl[5]=='/
26d0: 27 20 26 26 20 7a 55 72 6c 5b 36 5d 3d 3d 27 2f  ' && zUrl[6]=='/
26e0: 27 20 29 7b 0a 20 20 20 20 20 20 69 20 3d 20 37  ' ){.      i = 7
26f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2700: 20 20 20 69 20 3d 20 35 3b 0a 20 20 20 20 7d 0a     i = 5;.    }.
2710: 20 20 20 20 7a 46 69 6c 65 20 3d 20 6d 70 72 69      zFile = mpri
2720: 6e 74 66 28 22 25 73 22 2c 20 26 7a 55 72 6c 5b  ntf("%s", &zUrl[
2730: 69 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  i]);.  }else if(
2740: 20 66 69 6c 65 5f 69 73 66 69 6c 65 28 7a 55 72   file_isfile(zUr
2750: 6c 2c 20 45 78 74 46 49 4c 45 29 20 29 7b 0a 20  l, ExtFILE) ){. 
2760: 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 69 73 46     pUrlData->isF
2770: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7a 46 69  ile = 1;.    zFi
2780: 6c 65 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73  le = mprintf("%s
2790: 22 2c 20 7a 55 72 6c 29 3b 0a 20 20 7d 65 6c 73  ", zUrl);.  }els
27a0: 65 20 69 66 28 20 66 69 6c 65 5f 69 73 64 69 72  e if( file_isdir
27b0: 28 7a 55 72 6c 2c 20 45 78 74 46 49 4c 45 29 3d  (zUrl, ExtFILE)=
27c0: 3d 31 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65 20  =1 ){.    zFile 
27d0: 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 2f 46 4f  = mprintf("%s/FO
27e0: 53 53 49 4c 22 2c 20 7a 55 72 6c 29 3b 0a 20 20  SSIL", zUrl);.  
27f0: 20 20 69 66 28 20 66 69 6c 65 5f 69 73 66 69 6c    if( file_isfil
2800: 65 28 7a 46 69 6c 65 2c 20 45 78 74 46 49 4c 45  e(zFile, ExtFILE
2810: 29 20 29 7b 0a 20 20 20 20 20 20 70 55 72 6c 44  ) ){.      pUrlD
2820: 61 74 61 2d 3e 69 73 46 69 6c 65 20 3d 20 31 3b  ata->isFile = 1;
2830: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2840: 20 20 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20    free(zFile);. 
2850: 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a       zFile = 0;.
2860: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 74        fossil_fat
2870: 61 6c 28 22 75 6e 6b 6e 6f 77 6e 20 72 65 70 6f  al("unknown repo
2880: 73 69 74 6f 72 79 3a 20 25 73 22 2c 20 7a 55 72  sitory: %s", zUr
2890: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  l);.    }.  }els
28a0: 65 7b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 66 61  e{.    fossil_fa
28b0: 74 61 6c 28 22 75 6e 6b 6e 6f 77 6e 20 72 65 70  tal("unknown rep
28c0: 6f 73 69 74 6f 72 79 3a 20 25 73 22 2c 20 7a 55  ository: %s", zU
28d0: 72 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  rl);.  }.  if( u
28e0: 72 6c 46 6c 61 67 73 20 29 20 70 55 72 6c 44 61  rlFlags ) pUrlDa
28f0: 74 61 2d 3e 66 6c 61 67 73 20 3d 20 75 72 6c 46  ta->flags = urlF
2900: 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 55 72 6c  lags;.  if( pUrl
2910: 44 61 74 61 2d 3e 69 73 46 69 6c 65 20 29 7b 0a  Data->isFile ){.
2920: 20 20 20 20 42 6c 6f 62 20 63 66 69 6c 65 3b 0a      Blob cfile;.
2930: 20 20 20 20 64 65 68 74 74 70 69 7a 65 28 7a 46      dehttpize(zF
2940: 69 6c 65 29 3b 0a 20 20 20 20 66 69 6c 65 5f 63  ile);.    file_c
2950: 61 6e 6f 6e 69 63 61 6c 5f 6e 61 6d 65 28 7a 46  anonical_name(zF
2960: 69 6c 65 2c 20 26 63 66 69 6c 65 2c 20 30 29 3b  ile, &cfile, 0);
2970: 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65 29  .    free(zFile)
2980: 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
2990: 0a 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 70  .    pUrlData->p
29a0: 72 6f 74 6f 63 6f 6c 20 3d 20 22 66 69 6c 65 22  rotocol = "file"
29b0: 3b 0a 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e  ;.    pUrlData->
29c0: 70 61 74 68 20 3d 20 6d 70 72 69 6e 74 66 28 22  path = mprintf("
29d0: 22 29 3b 0a 20 20 20 20 70 55 72 6c 44 61 74 61  ");.    pUrlData
29e0: 2d 3e 6e 61 6d 65 20 3d 20 6d 70 72 69 6e 74 66  ->name = mprintf
29f0: 28 22 25 62 22 2c 20 26 63 66 69 6c 65 29 3b 0a  ("%b", &cfile);.
2a00: 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 63 61      pUrlData->ca
2a10: 6e 6f 6e 69 63 61 6c 20 3d 20 6d 70 72 69 6e 74  nonical = mprint
2a20: 66 28 22 66 69 6c 65 3a 2f 2f 25 54 22 2c 20 70  f("file://%T", p
2a30: 55 72 6c 44 61 74 61 2d 3e 6e 61 6d 65 29 3b 0a  UrlData->name);.
2a40: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26      blob_reset(&
2a50: 63 66 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 20  cfile);.  }else 
2a60: 69 66 28 20 70 55 72 6c 44 61 74 61 2d 3e 75 73  if( pUrlData->us
2a70: 65 72 21 3d 30 20 26 26 20 70 55 72 6c 44 61 74  er!=0 && pUrlDat
2a80: 61 2d 3e 70 61 73 73 77 64 3d 3d 30 0a 20 20 20  a->passwd==0.   
2a90: 20 20 20 20 20 20 26 26 20 28 75 72 6c 46 6c 61        && (urlFla
2aa0: 67 73 20 26 20 55 52 4c 5f 50 52 4f 4d 50 54 5f  gs & URL_PROMPT_
2ab0: 50 57 29 21 3d 30 20 29 7b 0a 20 20 20 20 75 72  PW)!=0 ){.    ur
2ac0: 6c 5f 70 72 6f 6d 70 74 5f 66 6f 72 5f 70 61 73  l_prompt_for_pas
2ad0: 73 77 6f 72 64 5f 6c 6f 63 61 6c 28 70 55 72 6c  sword_local(pUrl
2ae0: 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Data);.  }else i
2af0: 66 28 20 70 55 72 6c 44 61 74 61 2d 3e 75 73 65  f( pUrlData->use
2b00: 72 21 3d 30 20 26 26 20 28 20 75 72 6c 46 6c 61  r!=0 && ( urlFla
2b10: 67 73 20 26 20 55 52 4c 5f 41 53 4b 5f 52 45 4d  gs & URL_ASK_REM
2b20: 45 4d 42 45 52 5f 50 57 20 29 20 29 7b 0a 20 20  EMBER_PW ) ){.  
2b30: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 61    if( fossil_isa
2b40: 74 74 79 28 66 6f 73 73 69 6c 5f 66 69 6c 65 6e  tty(fossil_filen
2b50: 6f 28 73 74 64 69 6e 29 29 0a 20 20 20 20 20 20  o(stdin)).      
2b60: 20 20 26 26 20 28 20 75 72 6c 46 6c 61 67 73 20    && ( urlFlags 
2b70: 26 20 55 52 4c 5f 52 45 4d 45 4d 42 45 52 5f 50  & URL_REMEMBER_P
2b80: 57 20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  W )==0 ){.      
2b90: 69 66 28 20 73 61 76 65 5f 70 61 73 73 77 6f 72  if( save_passwor
2ba0: 64 5f 70 72 6f 6d 70 74 28 70 55 72 6c 44 61 74  d_prompt(pUrlDat
2bb0: 61 2d 3e 70 61 73 73 77 64 29 20 29 7b 0a 20 20  a->passwd) ){.  
2bc0: 20 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e        pUrlData->
2bd0: 66 6c 61 67 73 20 3d 20 75 72 6c 46 6c 61 67 73  flags = urlFlags
2be0: 20 7c 3d 20 55 52 4c 5f 52 45 4d 45 4d 42 45 52   |= URL_REMEMBER
2bf0: 5f 50 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _PW;.      }else
2c00: 7b 0a 20 20 20 20 20 20 20 20 70 55 72 6c 44 61  {.        pUrlDa
2c10: 74 61 2d 3e 66 6c 61 67 73 20 3d 20 75 72 6c 46  ta->flags = urlF
2c20: 6c 61 67 73 20 26 3d 20 7e 55 52 4c 5f 52 45 4d  lags &= ~URL_REM
2c30: 45 4d 42 45 52 5f 50 57 3b 0a 20 20 20 20 20 20  EMBER_PW;.      
2c40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2c50: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
2c60: 68 65 20 63 6f 6d 70 6c 65 74 65 20 55 52 4c 20  he complete URL 
2c70: 66 6f 72 20 61 20 55 72 6c 44 61 74 61 20 6f 62  for a UrlData ob
2c80: 6a 65 63 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ject, including 
2c90: 74 68 65 0a 2a 2a 20 6c 6f 67 69 6e 20 6e 61 6d  the.** login nam
2ca0: 65 20 61 6e 64 20 70 61 73 73 77 6f 72 64 2c 20  e and password, 
2cb0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
2cc0: 69 6e 65 64 20 66 72 6f 6d 20 66 6f 73 73 69 6c  ined from fossil
2cd0: 5f 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64  _malloc().** and
2ce0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
2cf0: 72 20 74 6f 20 74 68 61 74 20 55 52 4c 20 74 65  r to that URL te
2d00: 78 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 75 72 6c  xt..*/.char *url
2d10: 5f 66 75 6c 6c 28 63 6f 6e 73 74 20 55 72 6c 44  _full(const UrlD
2d20: 61 74 61 20 2a 70 29 7b 0a 20 20 42 6c 6f 62 20  ata *p){.  Blob 
2d30: 78 20 3d 20 42 4c 4f 42 5f 49 4e 49 54 49 41 4c  x = BLOB_INITIAL
2d40: 49 5a 45 52 3b 0a 20 20 69 66 28 20 70 2d 3e 69  IZER;.  if( p->i
2d50: 73 46 69 6c 65 20 7c 7c 20 70 2d 3e 75 73 65 72  sFile || p->user
2d60: 3d 3d 30 20 7c 7c 20 70 2d 3e 75 73 65 72 5b 30  ==0 || p->user[0
2d70: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ]==0 ){.    retu
2d80: 72 6e 20 66 6f 73 73 69 6c 5f 73 74 72 64 75 70  rn fossil_strdup
2d90: 28 70 2d 3e 63 61 6e 6f 6e 69 63 61 6c 29 3b 0a  (p->canonical);.
2da0: 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e    }.  blob_appen
2db0: 64 66 28 26 78 2c 20 22 25 73 3a 2f 2f 22 2c 20  df(&x, "%s://", 
2dc0: 70 2d 3e 70 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20  p->protocol);.  
2dd0: 69 66 28 20 70 2d 3e 75 73 65 72 20 26 26 20 70  if( p->user && p
2de0: 2d 3e 75 73 65 72 5b 30 5d 20 29 7b 0a 20 20 20  ->user[0] ){.   
2df0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 78   blob_appendf(&x
2e00: 2c 20 22 25 74 22 2c 20 70 2d 3e 75 73 65 72 29  , "%t", p->user)
2e10: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 61 73  ;.    if( p->pas
2e20: 73 77 64 20 26 26 20 70 2d 3e 70 61 73 73 77 64  swd && p->passwd
2e30: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f  [0] ){.      blo
2e40: 62 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 3a  b_appendf(&x, ":
2e50: 25 74 22 2c 20 70 2d 3e 70 61 73 73 77 64 29 3b  %t", p->passwd);
2e60: 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f  .    }.    blob_
2e70: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 40 22 29  appendf(&x, "@")
2e80: 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 61 70 70  ;.  }.  blob_app
2e90: 65 6e 64 66 28 26 78 2c 20 22 25 54 22 2c 20 70  endf(&x, "%T", p
2ea0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  ->name);.  if( p
2eb0: 2d 3e 64 66 6c 74 50 6f 72 74 21 3d 70 2d 3e 70  ->dfltPort!=p->p
2ec0: 6f 72 74 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  ort ){.    blob_
2ed0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 3a 25 64  appendf(&x, ":%d
2ee0: 22 2c 20 70 2d 3e 70 6f 72 74 29 3b 0a 20 20 7d  ", p->port);.  }
2ef0: 0a 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28  .  blob_appendf(
2f00: 26 78 2c 20 22 25 54 22 2c 20 70 2d 3e 70 61 74  &x, "%T", p->pat
2f10: 68 29 3b 0a 20 20 28 76 6f 69 64 29 62 6c 6f 62  h);.  (void)blob
2f20: 5f 73 74 72 28 26 78 29 3b 0a 20 20 72 65 74 75  _str(&x);.  retu
2f30: 72 6e 20 78 2e 61 44 61 74 61 3b 0a 7d 0a 0a 2f  rn x.aData;.}../
2f40: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2f50: 20 55 52 4c 20 66 6f 72 20 61 20 55 72 6c 44 61   URL for a UrlDa
2f60: 74 61 20 6f 62 6a 65 63 74 20 74 68 61 74 20 6f  ta object that o
2f70: 6d 69 74 73 20 74 68 65 0a 2a 2a 20 6c 6f 67 69  mits the.** logi
2f80: 6e 20 6e 61 6d 65 20 61 6e 64 20 70 61 73 73 77  n name and passw
2f90: 6f 72 64 2c 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  ord, into memory
2fa0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 66   obtained from f
2fb0: 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 29 0a 2a  ossil_malloc().*
2fc0: 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  * and return a p
2fd0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 55  ointer to that U
2fe0: 52 4c 20 74 65 78 74 2e 0a 2a 2f 0a 63 68 61 72  RL text..*/.char
2ff0: 20 2a 75 72 6c 5f 6e 6f 75 73 65 72 28 63 6f 6e   *url_nouser(con
3000: 73 74 20 55 72 6c 44 61 74 61 20 2a 70 29 7b 0a  st UrlData *p){.
3010: 20 20 42 6c 6f 62 20 78 20 3d 20 42 4c 4f 42 5f    Blob x = BLOB_
3020: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 20 20 69  INITIALIZER;.  i
3030: 66 28 20 70 2d 3e 69 73 46 69 6c 65 20 7c 7c 20  f( p->isFile || 
3040: 70 2d 3e 75 73 65 72 3d 3d 30 20 7c 7c 20 70 2d  p->user==0 || p-
3050: 3e 75 73 65 72 5b 30 5d 3d 3d 30 20 29 7b 0a 20  >user[0]==0 ){. 
3060: 20 20 20 72 65 74 75 72 6e 20 66 6f 73 73 69 6c     return fossil
3070: 5f 73 74 72 64 75 70 28 70 2d 3e 63 61 6e 6f 6e  _strdup(p->canon
3080: 69 63 61 6c 29 3b 0a 20 20 7d 0a 20 20 62 6c 6f  ical);.  }.  blo
3090: 62 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25  b_appendf(&x, "%
30a0: 73 3a 2f 2f 22 2c 20 70 2d 3e 70 72 6f 74 6f 63  s://", p->protoc
30b0: 6f 6c 29 3b 0a 20 20 62 6c 6f 62 5f 61 70 70 65  ol);.  blob_appe
30c0: 6e 64 66 28 26 78 2c 20 22 25 54 22 2c 20 70 2d  ndf(&x, "%T", p-
30d0: 3e 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 2d  >name);.  if( p-
30e0: 3e 64 66 6c 74 50 6f 72 74 21 3d 70 2d 3e 70 6f  >dfltPort!=p->po
30f0: 72 74 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61  rt ){.    blob_a
3100: 70 70 65 6e 64 66 28 26 78 2c 20 22 3a 25 64 22  ppendf(&x, ":%d"
3110: 2c 20 70 2d 3e 70 6f 72 74 29 3b 0a 20 20 7d 0a  , p->port);.  }.
3120: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26    blob_appendf(&
3130: 78 2c 20 22 25 54 22 2c 20 70 2d 3e 70 61 74 68  x, "%T", p->path
3140: 29 3b 0a 20 20 28 76 6f 69 64 29 62 6c 6f 62 5f  );.  (void)blob_
3150: 73 74 72 28 26 78 29 3b 0a 20 20 72 65 74 75 72  str(&x);.  retur
3160: 6e 20 78 2e 61 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  n x.aData;.}../*
3170: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
3180: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 75   to remove the u
3190: 73 65 72 6e 61 6d 65 2f 70 61 73 73 77 6f 72 64  sername/password
31a0: 20 66 72 6f 6d 20 61 20 55 52 4c 0a 2a 2f 0a 76   from a URL.*/.v
31b0: 6f 69 64 20 75 72 6c 5f 6e 6f 75 73 65 72 5f 66  oid url_nouser_f
31c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
31d0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
31e0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
31f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3200: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
3210: 68 61 72 20 2a 7a 4f 72 69 67 20 3d 20 28 63 6f  har *zOrig = (co
3220: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
3230: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
3240: 76 5b 30 5d 29 3b 0a 20 20 55 72 6c 44 61 74 61  v[0]);.  UrlData
3250: 20 78 3b 0a 20 20 69 66 28 20 7a 4f 72 69 67 3d   x;.  if( zOrig=
3260: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  =0 ) return;.  m
3270: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
3280: 65 6f 66 28 78 29 29 3b 0a 20 20 75 72 6c 5f 70  eof(x));.  url_p
3290: 61 72 73 65 5f 6c 6f 63 61 6c 28 7a 4f 72 69 67  arse_local(zOrig
32a0: 2c 20 55 52 4c 5f 4f 4d 49 54 5f 55 53 45 52 2c  , URL_OMIT_USER,
32b0: 20 26 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &x);.  sqlite3_
32c0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
32d0: 65 78 74 2c 20 78 2e 63 61 6e 6f 6e 69 63 61 6c  ext, x.canonical
32e0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
32f0: 4e 53 49 45 4e 54 29 3b 0a 20 20 75 72 6c 5f 75  NSIENT);.  url_u
3300: 6e 70 61 72 73 65 28 26 78 29 3b 0a 7d 0a 0a 2f  nparse(&x);.}../
3310: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 6d 61 6c  *.** Reclaim mal
3320: 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 20 66 72 6f  loced memory fro
3330: 6d 20 61 20 55 72 6c 44 61 74 61 20 6f 62 6a 65  m a UrlData obje
3340: 63 74 0a 2a 2f 0a 76 6f 69 64 20 75 72 6c 5f 75  ct.*/.void url_u
3350: 6e 70 61 72 73 65 28 55 72 6c 44 61 74 61 20 2a  nparse(UrlData *
3360: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
3370: 7b 0a 20 20 20 20 70 20 3d 20 26 67 2e 75 72 6c  {.    p = &g.url
3380: 3b 0a 20 20 7d 0a 20 20 66 6f 73 73 69 6c 5f 66  ;.  }.  fossil_f
3390: 72 65 65 28 70 2d 3e 63 61 6e 6f 6e 69 63 61 6c  ree(p->canonical
33a0: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
33b0: 28 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 73  (p->name);.  fos
33c0: 73 69 6c 5f 66 72 65 65 28 70 2d 3e 70 61 74 68  sil_free(p->path
33d0: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
33e0: 28 70 2d 3e 75 73 65 72 29 3b 0a 20 20 66 6f 73  (p->user);.  fos
33f0: 73 69 6c 5f 66 72 65 65 28 70 2d 3e 70 61 73 73  sil_free(p->pass
3400: 77 64 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72  wd);.  fossil_fr
3410: 65 65 28 70 2d 3e 66 6f 73 73 69 6c 29 3b 0a 20  ee(p->fossil);. 
3420: 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 70 2d 3e   fossil_free(p->
3430: 70 77 43 6f 6e 66 69 67 29 3b 0a 20 20 6d 65 6d  pwConfig);.  mem
3440: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
3450: 28 2a 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (*p));.}../*.** 
3460: 4d 6f 76 65 20 61 20 55 52 4c 20 70 61 72 73 65  Move a URL parse
3470: 20 66 72 6f 6d 20 6f 6e 65 20 55 72 6c 44 61 74   from one UrlDat
3480: 61 20 6f 62 6a 65 63 74 20 74 6f 20 61 6e 6f 74  a object to anot
3490: 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 75 72 6c  her..*/.void url
34a0: 5f 6d 6f 76 65 5f 70 61 72 73 65 28 55 72 6c 44  _move_parse(UrlD
34b0: 61 74 61 20 2a 70 54 6f 2c 20 55 72 6c 44 61 74  ata *pTo, UrlDat
34c0: 61 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 75 72 6c  a *pFrom){.  url
34d0: 5f 75 6e 70 61 72 73 65 28 70 54 6f 29 3b 0a 20  _unparse(pTo);. 
34e0: 20 6d 65 6d 63 70 79 28 70 54 6f 2c 20 70 46 72   memcpy(pTo, pFr
34f0: 6f 6d 2c 20 73 69 7a 65 6f 66 28 2a 70 54 6f 29  om, sizeof(*pTo)
3500: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 72 6f  );.  memset(pFro
3510: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46  m, 0, sizeof(*pF
3520: 72 6f 6d 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rom));.}../*.** 
3530: 50 61 72 73 65 20 74 68 65 20 67 69 76 65 6e 20  Parse the given 
3540: 55 52 4c 2c 20 77 68 69 63 68 20 64 65 73 63 72  URL, which descr
3550: 69 62 65 73 20 61 20 73 79 6e 63 20 73 65 72 76  ibes a sync serv
3560: 65 72 2e 20 20 50 6f 70 75 6c 61 74 65 20 76 61  er.  Populate va
3570: 72 69 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 74 68  riables.** in th
3580: 65 20 67 6c 6f 62 61 6c 20 22 67 2e 75 72 6c 22  e global "g.url"
3590: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 73 68   structure as sh
35a0: 6f 77 6e 20 62 65 6c 6f 77 2e 20 20 49 66 20 7a  own below.  If z
35b0: 55 72 6c 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Url is NULL, the
35c0: 6e 0a 2a 2a 20 70 61 72 73 65 20 74 68 65 20 55  n.** parse the U
35d0: 52 4c 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  RL given in the 
35e0: 6c 61 73 74 2d 73 79 6e 63 2d 75 72 6c 20 73 65  last-sync-url se
35f0: 74 74 69 6e 67 2c 20 74 61 6b 69 6e 67 20 74 68  tting, taking th
3600: 65 20 70 61 73 73 77 6f 72 64 0a 2a 2a 20 66 6f  e password.** fo
3610: 72 6d 20 6c 61 73 74 2d 73 79 6e 63 2d 70 77 2e  rm last-sync-pw.
3620: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 67 2e 75 72  .**.**      g.ur
3630: 6c 2e 69 73 46 69 6c 65 20 20 20 20 20 20 54 72  l.isFile      Tr
3640: 75 65 20 69 66 20 46 49 4c 45 3a 0a 2a 2a 20 20  ue if FILE:.**  
3650: 20 20 20 20 67 2e 75 72 6c 2e 69 73 48 74 74 70      g.url.isHttp
3660: 73 20 20 20 20 20 54 72 75 65 20 69 66 20 48 54  s     True if HT
3670: 54 50 53 3a 0a 2a 2a 20 20 20 20 20 20 67 2e 75  TPS:.**      g.u
3680: 72 6c 2e 69 73 53 73 68 20 20 20 20 20 20 20 54  rl.isSsh       T
3690: 72 75 65 20 69 66 20 53 53 48 3a 0a 2a 2a 20 20  rue if SSH:.**  
36a0: 20 20 20 20 67 2e 75 72 6c 2e 70 72 6f 74 6f 63      g.url.protoc
36b0: 6f 6c 20 20 20 20 22 68 74 74 70 22 20 6f 72 20  ol    "http" or 
36c0: 22 68 74 74 70 73 22 20 6f 72 20 22 66 69 6c 65  "https" or "file
36d0: 22 20 6f 72 20 22 73 73 68 22 0a 2a 2a 20 20 20  " or "ssh".**   
36e0: 20 20 20 67 2e 75 72 6c 2e 6e 61 6d 65 20 20 20     g.url.name   
36f0: 20 20 20 20 20 48 6f 73 74 6e 61 6d 65 20 66 6f       Hostname fo
3700: 72 20 48 54 54 50 3a 2c 20 48 54 54 50 53 3a 2c  r HTTP:, HTTPS:,
3710: 20 53 53 48 3a 2e 20 20 46 69 6c 65 6e 61 6d 65   SSH:.  Filename
3720: 20 66 6f 72 20 46 49 4c 45 3a 0a 2a 2a 20 20 20   for FILE:.**   
3730: 20 20 20 67 2e 75 72 6c 2e 70 6f 72 74 20 20 20     g.url.port   
3740: 20 20 20 20 20 54 43 50 20 70 6f 72 74 20 6e 75       TCP port nu
3750: 6d 62 65 72 20 66 6f 72 20 48 54 54 50 20 6f 72  mber for HTTP or
3760: 20 48 54 54 50 53 2e 0a 2a 2a 20 20 20 20 20 20   HTTPS..**      
3770: 67 2e 75 72 6c 2e 64 66 6c 74 50 6f 72 74 20 20  g.url.dfltPort  
3780: 20 20 44 65 66 61 75 6c 74 20 54 43 50 20 70 6f    Default TCP po
3790: 72 74 20 6e 75 6d 62 65 72 20 28 38 30 20 6f 72  rt number (80 or
37a0: 20 34 34 33 29 2e 0a 2a 2a 20 20 20 20 20 20 67   443)..**      g
37b0: 2e 75 72 6c 2e 70 61 74 68 20 20 20 20 20 20 20  .url.path       
37c0: 20 50 61 74 68 20 6e 61 6d 65 20 66 6f 72 20 48   Path name for H
37d0: 54 54 50 20 6f 72 20 48 54 54 50 53 2e 0a 2a 2a  TTP or HTTPS..**
37e0: 20 20 20 20 20 20 67 2e 75 72 6c 2e 75 73 65 72        g.url.user
37f0: 20 20 20 20 20 20 20 20 55 73 65 72 69 64 2e 0a          Userid..
3800: 2a 2a 20 20 20 20 20 20 67 2e 75 72 6c 2e 70 61  **      g.url.pa
3810: 73 73 77 64 20 20 20 20 20 20 50 61 73 73 77 6f  sswd      Passwo
3820: 72 64 2e 0a 2a 2a 20 20 20 20 20 20 67 2e 75 72  rd..**      g.ur
3830: 6c 2e 68 6f 73 74 6e 61 6d 65 20 20 20 20 48 4f  l.hostname    HO
3840: 53 54 3a 50 4f 52 54 20 6f 72 20 6a 75 73 74 20  ST:PORT or just 
3850: 48 4f 53 54 20 69 66 20 70 6f 72 74 20 69 73 20  HOST if port is 
3860: 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20  the default..** 
3870: 20 20 20 20 20 67 2e 75 72 6c 2e 63 61 6e 6f 6e       g.url.canon
3880: 69 63 61 6c 20 20 20 54 68 65 20 55 52 4c 20 69  ical   The URL i
3890: 6e 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  n canonical form
38a0: 2c 20 6f 6d 69 74 74 69 6e 67 20 74 68 65 20 70  , omitting the p
38b0: 61 73 73 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  assword.**      
38c0: 67 2e 75 72 6c 2e 70 77 43 6f 6e 66 69 67 20 20  g.url.pwConfig  
38d0: 20 20 4e 61 6d 65 20 6f 66 20 43 4f 4e 46 49 47    Name of CONFIG
38e0: 20 74 61 62 6c 65 20 65 6e 74 72 79 20 63 6f 6e   table entry con
38f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61 73 73  taining the pass
3900: 77 6f 72 64 0a 2a 2a 0a 2a 2a 20 48 54 54 50 20  word.**.** HTTP 
3910: 75 72 6c 20 66 6f 72 6d 61 74 20 61 73 20 66 6f  url format as fo
3920: 6c 6c 6f 77 73 20 28 48 54 54 50 53 20 69 73 20  llows (HTTPS is 
3930: 74 68 65 20 73 61 6d 65 20 77 69 74 68 20 61 20  the same with a 
3940: 64 69 66 66 65 72 65 6e 74 20 73 63 68 65 6d 65  different scheme
3950: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68 74 74  ):.**.**     htt
3960: 70 3a 2f 2f 75 73 65 72 69 64 3a 70 61 73 73 77  p://userid:passw
3970: 6f 72 64 40 68 6f 73 74 3a 70 6f 72 74 2f 70 61  ord@host:port/pa
3980: 74 68 0a 2a 2a 0a 2a 2a 20 53 53 48 20 75 72 6c  th.**.** SSH url
3990: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
39a0: 2a 20 20 20 20 20 73 73 68 3a 2f 2f 75 73 65 72  *     ssh://user
39b0: 69 64 40 68 6f 73 74 3a 70 6f 72 74 2f 70 61 74  id@host:port/pat
39c0: 68 3f 66 6f 73 73 69 6c 3d 70 61 74 68 2f 74 6f  h?fossil=path/to
39d0: 2f 66 6f 73 73 69 6c 2e 65 78 65 0a 2a 2a 0a 2a  /fossil.exe.**.*
39e0: 2a 20 49 66 20 55 52 4c 5f 55 53 45 5f 43 4f 4e  * If URL_USE_CON
39f0: 46 49 47 20 69 73 20 73 65 74 20 74 68 65 6e 20  FIG is set then 
3a00: 74 68 65 20 55 52 4c 20 61 6e 64 20 70 61 73 73  the URL and pass
3a10: 77 6f 72 64 20 6d 69 67 68 74 20 62 65 20 70 75  word might be pu
3a20: 6c 6c 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  lled from.** the
3a30: 20 43 4f 4e 46 49 47 20 74 61 62 6c 65 20 72 61   CONFIG table ra
3a40: 74 68 65 72 20 74 68 61 6e 20 66 72 6f 6d 20 74  ther than from t
3a50: 68 65 20 7a 55 72 6c 20 70 61 72 61 6d 65 74 65  he zUrl paramete
3a60: 72 2e 20 20 49 66 20 7a 55 72 6c 20 69 73 20 4e  r.  If zUrl is N
3a70: 55 4c 4c 0a 2a 2a 20 6f 72 20 22 64 65 66 61 75  ULL.** or "defau
3a80: 6c 74 22 20 74 68 65 6e 20 74 68 65 20 55 52 4c  lt" then the URL
3a90: 20 69 73 20 67 69 76 65 6e 20 62 79 20 74 68 65   is given by the
3aa0: 20 22 6c 61 73 74 2d 73 79 6e 63 2d 75 72 6c 22   "last-sync-url"
3ab0: 20 73 65 74 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   setting and.** 
3ac0: 74 68 65 20 70 61 73 73 77 6f 72 64 20 63 6f 6d  the password com
3ad0: 65 73 20 66 6f 72 6d 20 74 68 65 20 22 6c 61 73  es form the "las
3ae0: 74 2d 73 79 6e 63 2d 70 77 22 20 73 65 74 74 69  t-sync-pw" setti
3af0: 6e 67 2e 20 20 49 66 20 7a 55 72 6c 20 69 73 20  ng.  If zUrl is 
3b00: 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6e 61  a symbolic.** na
3b10: 6d 65 2c 20 74 68 65 6e 20 74 68 65 20 55 52 4c  me, then the URL
3b20: 20 63 6f 6d 65 73 20 66 72 6f 6d 20 22 73 79 6e   comes from "syn
3b30: 63 2d 75 72 6c 3a 4e 41 4d 45 22 20 61 6e 64 20  c-url:NAME" and 
3b40: 74 68 65 20 70 61 73 73 77 6f 72 64 20 66 72 6f  the password fro
3b50: 6d 0a 2a 2a 20 22 73 79 6e 63 2d 70 77 3a 4e 41  m.** "sync-pw:NA
3b60: 4d 45 22 20 77 68 65 72 65 20 4e 41 4d 45 20 69  ME" where NAME i
3b70: 73 20 74 68 65 20 69 6e 70 75 74 20 7a 55 72 6c  s the input zUrl
3b80: 20 73 74 72 69 6e 67 2e 20 20 57 68 65 6e 65 76   string.  Whenev
3b90: 65 72 20 74 68 65 0a 2a 2a 20 70 61 73 73 77 6f  er the.** passwo
3ba0: 72 64 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  rd is taken from
3bb0: 20 74 68 65 20 43 4f 4e 46 49 47 20 74 61 62 6c   the CONFIG tabl
3bc0: 65 2c 20 74 68 65 20 67 2e 75 72 6c 2e 70 77 43  e, the g.url.pwC
3bd0: 6f 6e 66 69 67 20 66 69 65 6c 64 20 69 73 0a 2a  onfig field is.*
3be0: 2a 20 73 65 74 20 74 6f 20 74 68 65 20 43 4f 4e  * set to the CON
3bf0: 46 49 47 2e 4e 41 4d 45 20 76 61 6c 75 65 20 66  FIG.NAME value f
3c00: 72 6f 6d 20 77 68 69 63 68 20 74 68 61 74 20 70  rom which that p
3c10: 61 73 73 77 6f 72 64 20 69 73 20 74 61 6b 65 6e  assword is taken
3c20: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
3c30: 20 67 2e 75 72 6c 2e 70 77 43 6f 6e 66 69 67 20   g.url.pwConfig 
3c40: 69 73 20 4e 55 4c 4c 2e 0a 2a 2f 0a 76 6f 69 64  is NULL..*/.void
3c50: 20 75 72 6c 5f 70 61 72 73 65 28 63 6f 6e 73 74   url_parse(const
3c60: 20 63 68 61 72 20 2a 7a 55 72 6c 2c 20 75 6e 73   char *zUrl, uns
3c70: 69 67 6e 65 64 20 69 6e 74 20 75 72 6c 46 6c 61  igned int urlFla
3c80: 67 73 29 7b 0a 20 20 75 72 6c 5f 70 61 72 73 65  gs){.  url_parse
3c90: 5f 6c 6f 63 61 6c 28 7a 55 72 6c 2c 20 75 72 6c  _local(zUrl, url
3ca0: 46 6c 61 67 73 2c 20 26 67 2e 75 72 6c 29 3b 0a  Flags, &g.url);.
3cb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
3cc0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 67 2e  he content of g.
3cd0: 75 72 6c 0a 2a 2f 0a 76 6f 69 64 20 75 72 6c 70  url.*/.void urlp
3ce0: 61 72 73 65 5f 70 72 69 6e 74 28 69 6e 74 20 73  arse_print(int s
3cf0: 68 6f 77 50 77 29 7b 0a 20 20 66 6f 73 73 69 6c  howPw){.  fossil
3d00: 5f 70 72 69 6e 74 28 22 67 2e 75 72 6c 2e 69 73  _print("g.url.is
3d10: 46 69 6c 65 20 20 20 20 3d 20 25 64 5c 6e 22 2c  File    = %d\n",
3d20: 20 67 2e 75 72 6c 2e 69 73 46 69 6c 65 29 3b 0a   g.url.isFile);.
3d30: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
3d40: 67 2e 75 72 6c 2e 69 73 48 74 74 70 73 20 20 20  g.url.isHttps   
3d50: 3d 20 25 64 5c 6e 22 2c 20 67 2e 75 72 6c 2e 69  = %d\n", g.url.i
3d60: 73 48 74 74 70 73 29 3b 0a 20 20 66 6f 73 73 69  sHttps);.  fossi
3d70: 6c 5f 70 72 69 6e 74 28 22 67 2e 75 72 6c 2e 69  l_print("g.url.i
3d80: 73 53 73 68 20 20 20 20 20 3d 20 25 64 5c 6e 22  sSsh     = %d\n"
3d90: 2c 20 67 2e 75 72 6c 2e 69 73 53 73 68 29 3b 0a  , g.url.isSsh);.
3da0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
3db0: 67 2e 75 72 6c 2e 70 72 6f 74 6f 63 6f 6c 20 20  g.url.protocol  
3dc0: 3d 20 25 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e 70  = %s\n", g.url.p
3dd0: 72 6f 74 6f 63 6f 6c 29 3b 0a 20 20 66 6f 73 73  rotocol);.  foss
3de0: 69 6c 5f 70 72 69 6e 74 28 22 67 2e 75 72 6c 2e  il_print("g.url.
3df0: 6e 61 6d 65 20 20 20 20 20 20 3d 20 25 73 5c 6e  name      = %s\n
3e00: 22 2c 20 67 2e 75 72 6c 2e 6e 61 6d 65 29 3b 0a  ", g.url.name);.
3e10: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
3e20: 67 2e 75 72 6c 2e 70 6f 72 74 20 20 20 20 20 20  g.url.port      
3e30: 3d 20 25 64 5c 6e 22 2c 20 67 2e 75 72 6c 2e 70  = %d\n", g.url.p
3e40: 6f 72 74 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70  ort);.  fossil_p
3e50: 72 69 6e 74 28 22 67 2e 75 72 6c 2e 64 66 6c 74  rint("g.url.dflt
3e60: 50 6f 72 74 20 20 3d 20 25 64 5c 6e 22 2c 20 67  Port  = %d\n", g
3e70: 2e 75 72 6c 2e 64 66 6c 74 50 6f 72 74 29 3b 0a  .url.dfltPort);.
3e80: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
3e90: 67 2e 75 72 6c 2e 68 6f 73 74 6e 61 6d 65 20 20  g.url.hostname  
3ea0: 3d 20 25 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e 68  = %s\n", g.url.h
3eb0: 6f 73 74 6e 61 6d 65 29 3b 0a 20 20 66 6f 73 73  ostname);.  foss
3ec0: 69 6c 5f 70 72 69 6e 74 28 22 67 2e 75 72 6c 2e  il_print("g.url.
3ed0: 70 61 74 68 20 20 20 20 20 20 3d 20 25 73 5c 6e  path      = %s\n
3ee0: 22 2c 20 67 2e 75 72 6c 2e 70 61 74 68 29 3b 0a  ", g.url.path);.
3ef0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
3f00: 67 2e 75 72 6c 2e 75 73 65 72 20 20 20 20 20 20  g.url.user      
3f10: 3d 20 25 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e 75  = %s\n", g.url.u
3f20: 73 65 72 29 3b 0a 20 20 69 66 28 20 73 68 6f 77  ser);.  if( show
3f30: 50 77 20 7c 7c 20 67 2e 75 72 6c 2e 70 77 43 6f  Pw || g.url.pwCo
3f40: 6e 66 69 67 3d 3d 30 20 29 7b 0a 20 20 20 20 66  nfig==0 ){.    f
3f50: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 67 2e 75  ossil_print("g.u
3f60: 72 6c 2e 70 61 73 73 77 64 20 20 20 20 3d 20 25  rl.passwd    = %
3f70: 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e 70 61 73 73  s\n", g.url.pass
3f80: 77 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wd);.  }else{.  
3f90: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
3fa0: 67 2e 75 72 6c 2e 70 61 73 73 77 64 20 20 20 20  g.url.passwd    
3fb0: 3d 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e  = ************\n
3fc0: 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 73 73 69 6c  ");.  }.  fossil
3fd0: 5f 70 72 69 6e 74 28 22 67 2e 75 72 6c 2e 70 77  _print("g.url.pw
3fe0: 43 6f 6e 66 69 67 20 20 3d 20 25 73 5c 6e 22 2c  Config  = %s\n",
3ff0: 20 67 2e 75 72 6c 2e 70 77 43 6f 6e 66 69 67 29   g.url.pwConfig)
4000: 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74  ;.  fossil_print
4010: 28 22 67 2e 75 72 6c 2e 63 61 6e 6f 6e 69 63 61  ("g.url.canonica
4020: 6c 20 3d 20 25 73 5c 6e 22 2c 20 67 2e 75 72 6c  l = %s\n", g.url
4030: 2e 63 61 6e 6f 6e 69 63 61 6c 29 3b 0a 20 20 66  .canonical);.  f
4040: 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 67 2e 75  ossil_print("g.u
4050: 72 6c 2e 66 6f 73 73 69 6c 20 20 20 20 3d 20 25  rl.fossil    = %
4060: 73 5c 6e 22 2c 20 67 2e 75 72 6c 2e 66 6f 73 73  s\n", g.url.foss
4070: 69 6c 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 70 72  il);.  fossil_pr
4080: 69 6e 74 28 22 67 2e 75 72 6c 2e 66 6c 61 67 73  int("g.url.flags
4090: 20 20 20 20 20 3d 20 30 78 25 30 34 78 5c 6e 22       = 0x%04x\n"
40a0: 2c 20 67 2e 75 72 6c 2e 66 6c 61 67 73 29 3b 0a  , g.url.flags);.
40b0: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22    fossil_print("
40c0: 75 72 6c 5f 66 75 6c 6c 28 67 2e 75 72 6c 29 20  url_full(g.url) 
40d0: 3d 20 25 7a 5c 6e 22 2c 20 75 72 6c 5f 66 75 6c  = %z\n", url_ful
40e0: 6c 28 26 67 2e 75 72 6c 29 29 3b 0a 7d 0a 0a 2f  l(&g.url));.}../
40f0: 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74 65  *.** COMMAND: te
4100: 73 74 2d 75 72 6c 70 61 72 73 65 72 0a 2a 2a 0a  st-urlparser.**.
4110: 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73 69  ** Usage: %fossi
4120: 6c 20 74 65 73 74 2d 75 72 6c 70 61 72 73 65 72  l test-urlparser
4130: 20 55 52 4c 20 3f 6f 70 74 69 6f 6e 73 3f 0a 2a   URL ?options?.*
4140: 2a 0a 2a 2a 20 20 20 20 2d 2d 70 72 6f 6d 70 74  *.**    --prompt
4150: 2d 70 77 20 20 20 20 20 50 72 6f 6d 70 74 20 66  -pw     Prompt f
4160: 6f 72 20 70 61 73 73 77 6f 72 64 20 69 66 20 6d  or password if m
4170: 69 73 73 69 6e 67 0a 2a 2a 20 20 20 20 2d 2d 72  issing.**    --r
4180: 65 6d 65 6d 62 65 72 20 20 20 20 20 20 53 74 6f  emember      Sto
4190: 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 6c 61  re results in la
41a0: 73 74 2d 73 79 6e 63 2d 75 72 6c 0a 2a 2a 20 20  st-sync-url.**  
41b0: 20 20 2d 2d 73 68 6f 77 2d 70 77 20 20 20 20 20    --show-pw     
41c0: 20 20 53 68 6f 77 20 74 68 65 20 43 4f 4e 46 49    Show the CONFI
41d0: 47 2d 64 65 72 69 76 65 64 20 70 61 73 73 77 6f  G-derived passwo
41e0: 72 64 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  rd in the output
41f0: 0a 2a 2a 20 20 20 20 2d 2d 75 73 65 2d 63 6f 6e  .**    --use-con
4200: 66 69 67 20 20 20 20 50 75 6c 6c 20 55 52 4c 20  fig    Pull URL 
4210: 61 6e 64 20 70 61 73 73 77 6f 72 64 20 66 72 6f  and password fro
4220: 6d 20 74 68 65 20 43 4f 4e 46 49 47 20 74 61 62  m the CONFIG tab
4230: 6c 65 0a 2a 2a 20 20 20 20 2d 2d 75 73 65 2d 70  le.**    --use-p
4240: 61 72 65 6e 74 20 20 20 20 55 73 65 20 74 68 65  arent    Use the
4250: 20 70 61 72 65 6e 74 20 70 72 6f 6a 65 63 74 20   parent project 
4260: 55 52 4c 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f  URL.*/.void cmd_
4270: 74 65 73 74 5f 75 72 6c 70 61 72 73 65 72 28 76  test_urlparser(v
4280: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
4290: 20 75 6e 73 69 67 6e 65 64 20 66 67 20 3d 20 30   unsigned fg = 0
42a0: 3b 0a 20 20 69 6e 74 20 73 68 6f 77 50 77 20 3d  ;.  int showPw =
42b0: 20 30 3b 0a 20 20 64 62 5f 6d 75 73 74 5f 62 65   0;.  db_must_be
42c0: 5f 77 69 74 68 69 6e 5f 74 72 65 65 28 29 3b 0a  _within_tree();.
42d0: 20 20 75 72 6c 5f 70 72 6f 78 79 5f 6f 70 74 69    url_proxy_opti
42e0: 6f 6e 73 28 29 3b 0a 20 20 69 66 28 20 66 69 6e  ons();.  if( fin
42f0: 64 5f 6f 70 74 69 6f 6e 28 22 72 65 6d 65 6d 62  d_option("rememb
4300: 65 72 22 2c 30 2c 30 29 20 29 20 20 20 20 66 67  er",0,0) )    fg
4310: 20 7c 3d 20 55 52 4c 5f 52 45 4d 45 4d 42 45 52   |= URL_REMEMBER
4320: 3b 0a 20 20 69 66 28 20 66 69 6e 64 5f 6f 70 74  ;.  if( find_opt
4330: 69 6f 6e 28 22 70 72 6f 6d 70 74 2d 70 77 22 2c  ion("prompt-pw",
4340: 30 2c 30 29 20 29 20 20 20 66 67 20 7c 3d 20 55  0,0) )   fg |= U
4350: 52 4c 5f 50 52 4f 4d 50 54 5f 50 57 3b 0a 20 20  RL_PROMPT_PW;.  
4360: 69 66 28 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28  if( find_option(
4370: 22 75 73 65 2d 70 61 72 65 6e 74 22 2c 30 2c 30  "use-parent",0,0
4380: 29 20 29 20 20 66 67 20 7c 3d 20 55 52 4c 5f 55  ) )  fg |= URL_U
4390: 53 45 5f 50 41 52 45 4e 54 7c 55 52 4c 5f 55 53  SE_PARENT|URL_US
43a0: 45 5f 43 4f 4e 46 49 47 3b 0a 20 20 69 66 28 20  E_CONFIG;.  if( 
43b0: 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 75 73 65  find_option("use
43c0: 2d 63 6f 6e 66 69 67 22 2c 30 2c 30 29 20 29 20  -config",0,0) ) 
43d0: 20 66 67 20 7c 3d 20 55 52 4c 5f 55 53 45 5f 43   fg |= URL_USE_C
43e0: 4f 4e 46 49 47 3b 0a 20 20 69 66 28 20 66 69 6e  ONFIG;.  if( fin
43f0: 64 5f 6f 70 74 69 6f 6e 28 22 73 68 6f 77 2d 70  d_option("show-p
4400: 77 22 2c 30 2c 30 29 20 29 20 20 20 20 20 73 68  w",0,0) )     sh
4410: 6f 77 50 77 20 3d 20 31 3b 0a 20 20 69 66 28 20  owPw = 1;.  if( 
4420: 28 66 67 20 26 20 55 52 4c 5f 55 53 45 5f 43 4f  (fg & URL_USE_CO
4430: 4e 46 49 47 29 3d 3d 30 20 29 20 20 20 20 20 20  NFIG)==0 )      
4440: 20 73 68 6f 77 50 77 20 3d 20 31 3b 0a 20 20 69   showPw = 1;.  i
4450: 66 28 20 67 2e 61 72 67 63 21 3d 33 20 26 26 20  f( g.argc!=3 && 
4460: 67 2e 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20  g.argc!=4 ){.   
4470: 20 75 73 61 67 65 28 22 55 52 4c 22 29 3b 0a 20   usage("URL");. 
4480: 20 7d 0a 20 20 75 72 6c 5f 70 61 72 73 65 28 67   }.  url_parse(g
4490: 2e 61 72 67 76 5b 32 5d 2c 20 66 67 29 3b 0a 20  .argv[2], fg);. 
44a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
44b0: 2b 2b 29 7b 0a 20 20 20 20 75 72 6c 70 61 72 73  ++){.    urlpars
44c0: 65 5f 70 72 69 6e 74 28 73 68 6f 77 50 77 29 3b  e_print(showPw);
44d0: 0a 20 20 20 20 69 66 28 20 67 2e 75 72 6c 2e 69  .    if( g.url.i
44e0: 73 46 69 6c 65 20 7c 7c 20 67 2e 75 72 6c 2e 69  sFile || g.url.i
44f0: 73 53 73 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  sSsh ) break;.  
4500: 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
4510: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74      fossil_print
4520: 28 22 2a 2a 2a 2a 2a 2a 2a 2a 5c 6e 22 29 3b 0a  ("********\n");.
4530: 20 20 20 20 20 20 75 72 6c 5f 65 6e 61 62 6c 65        url_enable
4540: 5f 70 72 6f 78 79 28 22 55 73 69 6e 67 20 70 72  _proxy("Using pr
4550: 6f 78 79 3a 20 22 29 3b 0a 20 20 20 20 7d 0a 20  oxy: ");.    }. 
4560: 20 20 20 75 72 6c 5f 75 6e 70 61 72 73 65 28 30     url_unparse(0
4570: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
4580: 50 72 6f 78 79 20 73 70 65 63 69 66 69 65 64 20  Proxy specified 
4590: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c  on the command-l
45a0: 69 6e 65 20 75 73 69 6e 67 20 74 68 65 20 2d 2d  ine using the --
45b0: 70 72 6f 78 79 20 6f 70 74 69 6f 6e 2e 0a 2a 2a  proxy option..**
45c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
45d0: 2d 2d 70 72 6f 78 79 20 6f 70 74 69 6f 6e 20 6f  --proxy option o
45e0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69  n the command-li
45f0: 6e 65 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  ne then this.** 
4600: 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
4610: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
4620: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
4630: 68 61 72 20 2a 7a 50 72 6f 78 79 4f 70 74 20 3d  har *zProxyOpt =
4640: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61   0;../*.** Extra
4650: 63 74 20 61 6e 79 20 70 72 6f 78 79 20 6f 70 74  ct any proxy opt
4660: 69 6f 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 6f  ions from the co
4670: 6d 6d 61 6e 64 2d 6c 69 6e 65 2e 0a 2a 2a 0a 2a  mmand-line..**.*
4680: 2a 20 20 20 20 2d 2d 70 72 6f 78 79 20 55 52 4c  *    --proxy URL
4690: 7c 6f 66 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  |off.**.** The o
46a0: 72 69 67 69 6e 61 6c 20 70 75 72 70 6f 73 65 20  riginal purpose 
46b0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
46c0: 69 73 20 74 68 65 20 61 62 6f 76 65 2e 20 20 42  is the above.  B
46d0: 75 74 20 74 68 69 73 0a 2a 2a 20 61 6c 73 6f 20  ut this.** also 
46e0: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
46f0: 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
4700: 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 20 6f 74 68   to look for oth
4710: 65 72 0a 2a 2a 20 6e 65 74 77 6f 72 6b 2d 72 65  er.** network-re
4720: 6c 61 74 65 64 20 6f 70 74 69 6f 6e 73 3a 0a 2a  lated options:.*
4730: 2a 0a 2a 2a 20 20 20 20 2d 2d 6e 6f 73 79 6e 63  *.**    --nosync
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 65 6d               Tem
4750: 70 6f 72 61 72 69 6c 79 20 64 69 73 61 62 6c 65  porarily disable
4760: 20 22 61 75 74 6f 73 79 6e 63 22 0a 2a 2a 0a 2a   "autosync".**.*
4770: 2a 20 20 20 20 2d 2d 69 70 76 34 20 20 20 20 20  *    --ipv4     
4780: 20 20 20 20 20 20 20 20 20 20 44 69 73 61 6c 6c            Disall
4790: 6f 77 20 49 50 76 36 2e 20 20 55 73 65 20 6f 6e  ow IPv6.  Use on
47a0: 6c 79 20 49 50 76 34 2e 0a 2a 2a 0a 2a 2a 20 20  ly IPv4..**.**  
47b0: 20 20 2d 2d 61 63 63 65 70 74 2d 61 6e 79 2d 63    --accept-any-c
47c0: 65 72 74 20 20 20 20 44 69 73 61 62 6c 65 20 73  ert    Disable s
47d0: 65 72 76 65 72 20 53 53 4c 20 63 65 72 74 20 76  erver SSL cert v
47e0: 61 6c 69 64 61 74 69 6f 6e 2e 20 41 63 63 65 70  alidation. Accep
47f0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
4810: 20 53 53 4c 20 63 65 72 74 20 74 68 61 74 20 74   SSL cert that t
4820: 68 65 20 73 65 72 76 65 72 20 70 72 6f 76 69 64  he server provid
4830: 65 73 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  es..**          
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
4850: 41 52 4e 49 4e 47 3a 20 74 68 69 73 20 6f 70 74  ARNING: this opt
4860: 69 6f 6e 20 6f 70 65 6e 73 20 79 6f 75 20 75 70  ion opens you up
4870: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
4890: 6f 72 67 65 64 2d 44 4e 53 20 61 6e 64 20 6d 61  orged-DNS and ma
48a0: 6e 2d 69 6e 2d 74 68 65 2d 6d 69 64 64 6c 65 20  n-in-the-middle 
48b0: 61 74 74 61 63 6b 73 21 0a 2a 2f 0a 76 6f 69 64  attacks!.*/.void
48c0: 20 75 72 6c 5f 70 72 6f 78 79 5f 6f 70 74 69 6f   url_proxy_optio
48d0: 6e 73 28 76 6f 69 64 29 7b 0a 20 20 7a 50 72 6f  ns(void){.  zPro
48e0: 78 79 4f 70 74 20 3d 20 66 69 6e 64 5f 6f 70 74  xyOpt = find_opt
48f0: 69 6f 6e 28 22 70 72 6f 78 79 22 2c 20 30 2c 20  ion("proxy", 0, 
4900: 31 29 3b 0a 20 20 69 66 28 20 66 69 6e 64 5f 6f  1);.  if( find_o
4910: 70 74 69 6f 6e 28 22 6e 6f 73 79 6e 63 22 2c 30  ption("nosync",0
4920: 2c 30 29 20 29 20 67 2e 66 4e 6f 53 79 6e 63 20  ,0) ) g.fNoSync 
4930: 3d 20 31 3b 0a 20 20 69 66 28 20 66 69 6e 64 5f  = 1;.  if( find_
4940: 6f 70 74 69 6f 6e 28 22 69 70 76 34 22 2c 30 2c  option("ipv4",0,
4950: 30 29 20 29 20 67 2e 66 49 50 76 34 20 3d 20 31  0) ) g.fIPv4 = 1
4960: 3b 0a 23 69 66 64 65 66 20 46 4f 53 53 49 4c 5f  ;.#ifdef FOSSIL_
4970: 45 4e 41 42 4c 45 5f 53 53 4c 0a 20 20 69 66 28  ENABLE_SSL.  if(
4980: 20 66 69 6e 64 5f 6f 70 74 69 6f 6e 28 22 61 63   find_option("ac
4990: 63 65 70 74 2d 61 6e 79 2d 63 65 72 74 22 2c 30  cept-any-cert",0
49a0: 2c 30 29 20 29 7b 0a 20 20 20 20 73 73 6c 5f 64  ,0) ){.    ssl_d
49b0: 69 73 61 62 6c 65 5f 63 65 72 74 5f 76 65 72 69  isable_cert_veri
49c0: 66 69 63 61 74 69 6f 6e 28 29 3b 0a 20 20 7d 0a  fication();.  }.
49d0: 23 65 6e 64 69 66 20 2f 2a 20 46 4f 53 53 49 4c  #endif /* FOSSIL
49e0: 5f 45 4e 41 42 4c 45 5f 53 53 4c 20 2a 2f 0a 7d  _ENABLE_SSL */.}
49f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ../*.** If the "
4a00: 70 72 6f 78 79 22 20 73 65 74 74 69 6e 67 20 69  proxy" setting i
4a10: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
4a20: 63 68 61 6e 67 65 20 74 68 65 20 55 52 4c 20 73  change the URL s
4a30: 65 74 74 69 6e 67 73 0a 2a 2a 20 28 69 6e 69 74  ettings.** (init
4a40: 69 61 6c 69 7a 65 64 20 62 79 20 61 20 70 72 69  ialized by a pri
4a50: 6f 72 20 63 61 6c 6c 20 74 6f 20 75 72 6c 5f 70  or call to url_p
4a60: 61 72 73 65 28 29 29 20 73 6f 20 74 68 61 74 20  arse()) so that 
4a70: 74 68 65 20 48 54 54 50 0a 2a 2a 20 68 65 61 64  the HTTP.** head
4a80: 65 72 20 77 69 6c 6c 20 62 65 20 61 70 70 72 6f  er will be appro
4a90: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 70  priate for the p
4aa0: 72 6f 78 79 20 61 6e 64 20 73 6f 20 74 68 61 74  roxy and so that
4ab0: 20 74 68 65 20 54 43 50 2f 49 50 0a 2a 2a 20 63   the TCP/IP.** c
4ac0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62  onnection will b
4ad0: 65 20 6f 70 65 6e 65 64 20 74 6f 20 74 68 65 20  e opened to the 
4ae0: 70 72 6f 78 79 20 72 61 74 68 65 72 20 74 68 61  proxy rather tha
4af0: 6e 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 2e  n to the server.
4b00: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 73 67 20 69  .**.** If zMsg i
4b10: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 61  s not NULL and a
4b20: 20 70 72 6f 78 79 20 69 73 20 75 73 65 64 2c 20   proxy is used, 
4b30: 74 68 65 6e 20 70 72 69 6e 74 20 7a 4d 73 67 20  then print zMsg 
4b40: 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 74  followed.** by t
4b50: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d  he canonical nam
4b60: 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 28  e of the proxy (
4b70: 77 69 74 68 20 75 73 65 72 69 64 20 61 6e 64 20  with userid and 
4b80: 70 61 73 73 77 6f 72 64 20 73 75 70 70 72 65 73  password suppres
4b90: 73 65 64 29 2e 0a 2a 2f 0a 76 6f 69 64 20 75 72  sed)..*/.void ur
4ba0: 6c 5f 65 6e 61 62 6c 65 5f 70 72 6f 78 79 28 63  l_enable_proxy(c
4bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29  onst char *zMsg)
4bc0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
4bd0: 7a 50 72 6f 78 79 3b 0a 20 20 7a 50 72 6f 78 79  zProxy;.  zProxy
4be0: 20 3d 20 7a 50 72 6f 78 79 4f 70 74 3b 0a 20 20   = zProxyOpt;.  
4bf0: 69 66 28 20 7a 50 72 6f 78 79 3d 3d 30 20 29 7b  if( zProxy==0 ){
4c00: 0a 20 20 20 20 7a 50 72 6f 78 79 20 3d 20 64 62  .    zProxy = db
4c10: 5f 67 65 74 28 22 70 72 6f 78 79 22 2c 20 22 73  _get("proxy", "s
4c20: 79 73 74 65 6d 22 29 3b 0a 20 20 20 20 69 66 28  ystem");.    if(
4c30: 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a   fossil_strcmp(z
4c40: 50 72 6f 78 79 2c 20 22 73 79 73 74 65 6d 22 29  Proxy, "system")
4c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 50 72  ==0 ){.      zPr
4c60: 6f 78 79 20 3d 20 66 6f 73 73 69 6c 5f 67 65 74  oxy = fossil_get
4c70: 65 6e 76 28 22 68 74 74 70 5f 70 72 6f 78 79 22  env("http_proxy"
4c80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
4c90: 66 28 20 7a 50 72 6f 78 79 20 26 26 20 7a 50 72  f( zProxy && zPr
4ca0: 6f 78 79 5b 30 5d 20 26 26 20 21 69 73 5f 66 61  oxy[0] && !is_fa
4cb0: 6c 73 65 28 7a 50 72 6f 78 79 29 0a 20 20 20 20  lse(zProxy).    
4cc0: 20 20 26 26 20 21 67 2e 75 72 6c 2e 69 73 53 73    && !g.url.isSs
4cd0: 68 20 26 26 20 21 67 2e 75 72 6c 2e 69 73 46 69  h && !g.url.isFi
4ce0: 6c 65 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  le ){.    char *
4cf0: 7a 4f 72 69 67 69 6e 61 6c 55 72 6c 20 3d 20 67  zOriginalUrl = g
4d00: 2e 75 72 6c 2e 63 61 6e 6f 6e 69 63 61 6c 3b 0a  .url.canonical;.
4d10: 20 20 20 20 63 68 61 72 20 2a 7a 4f 72 69 67 69      char *zOrigi
4d20: 6e 61 6c 48 6f 73 74 20 3d 20 67 2e 75 72 6c 2e  nalHost = g.url.
4d30: 68 6f 73 74 6e 61 6d 65 3b 0a 20 20 20 20 69 6e  hostname;.    in
4d40: 74 20 66 4f 72 69 67 69 6e 61 6c 49 73 48 74 74  t fOriginalIsHtt
4d50: 70 73 20 3d 20 67 2e 75 72 6c 2e 69 73 48 74 74  ps = g.url.isHtt
4d60: 70 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f  ps;.    char *zO
4d70: 72 69 67 69 6e 61 6c 55 73 65 72 20 3d 20 67 2e  riginalUser = g.
4d80: 75 72 6c 2e 75 73 65 72 3b 0a 20 20 20 20 63 68  url.user;.    ch
4d90: 61 72 20 2a 7a 4f 72 69 67 69 6e 61 6c 50 61 73  ar *zOriginalPas
4da0: 73 77 64 20 3d 20 67 2e 75 72 6c 2e 70 61 73 73  swd = g.url.pass
4db0: 77 64 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f  wd;.    char *zO
4dc0: 72 69 67 69 6e 61 6c 55 72 6c 50 61 74 68 20 3d  riginalUrlPath =
4dd0: 20 67 2e 75 72 6c 2e 70 61 74 68 3b 0a 20 20 20   g.url.path;.   
4de0: 20 69 6e 74 20 69 4f 72 69 67 69 6e 61 6c 50 6f   int iOriginalPo
4df0: 72 74 20 3d 20 67 2e 75 72 6c 2e 70 6f 72 74 3b  rt = g.url.port;
4e00: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 75 4f  .    unsigned uO
4e10: 72 69 67 69 6e 61 6c 46 6c 61 67 73 20 3d 20 67  riginalFlags = g
4e20: 2e 75 72 6c 2e 66 6c 61 67 73 3b 0a 20 20 20 20  .url.flags;.    
4e30: 67 2e 75 72 6c 2e 75 73 65 72 20 3d 20 30 3b 0a  g.url.user = 0;.
4e40: 20 20 20 20 67 2e 75 72 6c 2e 70 61 73 73 77 64      g.url.passwd
4e50: 20 3d 20 22 22 3b 0a 20 20 20 20 75 72 6c 5f 70   = "";.    url_p
4e60: 61 72 73 65 28 7a 50 72 6f 78 79 2c 20 30 29 3b  arse(zProxy, 0);
4e70: 0a 20 20 20 20 69 66 28 20 7a 4d 73 67 20 29 20  .    if( zMsg ) 
4e80: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 25 73  fossil_print("%s
4e90: 25 73 5c 6e 22 2c 20 7a 4d 73 67 2c 20 67 2e 75  %s\n", zMsg, g.u
4ea0: 72 6c 2e 63 61 6e 6f 6e 69 63 61 6c 29 3b 0a 20  rl.canonical);. 
4eb0: 20 20 20 67 2e 75 72 6c 2e 70 61 74 68 20 3d 20     g.url.path = 
4ec0: 7a 4f 72 69 67 69 6e 61 6c 55 72 6c 3b 0a 20 20  zOriginalUrl;.  
4ed0: 20 20 67 2e 75 72 6c 2e 68 6f 73 74 6e 61 6d 65    g.url.hostname
4ee0: 20 3d 20 7a 4f 72 69 67 69 6e 61 6c 48 6f 73 74   = zOriginalHost
4ef0: 3b 0a 20 20 20 20 69 66 28 20 67 2e 75 72 6c 2e  ;.    if( g.url.
4f00: 75 73 65 72 20 29 7b 0a 20 20 20 20 20 20 63 68  user ){.      ch
4f10: 61 72 20 2a 7a 43 72 65 64 65 6e 74 69 61 6c 73  ar *zCredentials
4f20: 31 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 73 3a  1 = mprintf("%s:
4f30: 25 73 22 2c 20 67 2e 75 72 6c 2e 75 73 65 72 2c  %s", g.url.user,
4f40: 20 67 2e 75 72 6c 2e 70 61 73 73 77 64 29 3b 0a   g.url.passwd);.
4f50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 72 65        char *zCre
4f60: 64 65 6e 74 69 61 6c 73 32 20 3d 20 65 6e 63 6f  dentials2 = enco
4f70: 64 65 36 34 28 7a 43 72 65 64 65 6e 74 69 61 6c  de64(zCredential
4f80: 73 31 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 67  s1, -1);.      g
4f90: 2e 75 72 6c 2e 70 72 6f 78 79 41 75 74 68 20 3d  .url.proxyAuth =
4fa0: 20 6d 70 72 69 6e 74 66 28 22 42 61 73 69 63 20   mprintf("Basic 
4fb0: 25 7a 22 2c 20 7a 43 72 65 64 65 6e 74 69 61 6c  %z", zCredential
4fc0: 73 32 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  s2);.      free(
4fd0: 7a 43 72 65 64 65 6e 74 69 61 6c 73 31 29 3b 0a  zCredentials1);.
4fe0: 20 20 20 20 7d 0a 20 20 20 20 67 2e 75 72 6c 2e      }.    g.url.
4ff0: 75 73 65 72 20 3d 20 7a 4f 72 69 67 69 6e 61 6c  user = zOriginal
5000: 55 73 65 72 3b 0a 20 20 20 20 67 2e 75 72 6c 2e  User;.    g.url.
5010: 70 61 73 73 77 64 20 3d 20 7a 4f 72 69 67 69 6e  passwd = zOrigin
5020: 61 6c 50 61 73 73 77 64 3b 0a 20 20 20 20 67 2e  alPasswd;.    g.
5030: 75 72 6c 2e 69 73 48 74 74 70 73 20 3d 20 66 4f  url.isHttps = fO
5040: 72 69 67 69 6e 61 6c 49 73 48 74 74 70 73 3b 0a  riginalIsHttps;.
5050: 20 20 20 20 67 2e 75 72 6c 2e 75 73 65 50 72 6f      g.url.usePro
5060: 78 79 20 3d 20 31 3b 0a 20 20 20 20 67 2e 75 72  xy = 1;.    g.ur
5070: 6c 2e 70 72 6f 78 79 55 72 6c 43 61 6e 6f 6e 69  l.proxyUrlCanoni
5080: 63 61 6c 20 3d 20 7a 4f 72 69 67 69 6e 61 6c 55  cal = zOriginalU
5090: 72 6c 3b 3b 0a 20 20 20 20 67 2e 75 72 6c 2e 70  rl;;.    g.url.p
50a0: 72 6f 78 79 55 72 6c 50 61 74 68 20 3d 20 7a 4f  roxyUrlPath = zO
50b0: 72 69 67 69 6e 61 6c 55 72 6c 50 61 74 68 3b 0a  riginalUrlPath;.
50c0: 20 20 20 20 67 2e 75 72 6c 2e 70 72 6f 78 79 4f      g.url.proxyO
50d0: 72 69 67 50 6f 72 74 20 3d 20 69 4f 72 69 67 69  rigPort = iOrigi
50e0: 6e 61 6c 50 6f 72 74 3b 0a 20 20 20 20 67 2e 75  nalPort;.    g.u
50f0: 72 6c 2e 66 6c 61 67 73 20 3d 20 75 4f 72 69 67  rl.flags = uOrig
5100: 69 6e 61 6c 46 6c 61 67 73 3b 0a 20 20 7d 0a 7d  inalFlags;.  }.}
5110: 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a  ..#if INTERFACE.
5120: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
5130: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
5140: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
5150: 64 20 61 20 55 52 4c 20 77 69 74 68 20 71 75 65  d a URL with que
5160: 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
5170: 2f 0a 73 74 72 75 63 74 20 48 51 75 65 72 79 20  /.struct HQuery 
5180: 7b 0a 20 20 42 6c 6f 62 20 75 72 6c 3b 20 20 20  {.  Blob url;   
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 54 68 65 20 55 52 4c 20 2a 2f 0a 20 20 63  * The URL */.  c
51b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
51c0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
51d0: 20 62 61 73 65 20 55 52 4c 20 2a 2f 0a 20 20 69   base URL */.  i
51e0: 6e 74 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  nt nParam;      
51f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5200: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
5210: 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  s. */.  int nAll
5220: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
5230: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5240: 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
5250: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5260: 2a 2a 61 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  **azName;       
5270: 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 61 6d  /* Parameter nam
5280: 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  es */.  const ch
5290: 61 72 20 2a 2a 61 7a 56 61 6c 75 65 3b 20 20 20  ar **azValue;   
52a0: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20     /* Parameter 
52b0: 76 61 6c 75 65 73 20 2a 2f 0a 7d 3b 0a 23 65 6e  values */.};.#en
52c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
52d0: 61 6c 69 7a 65 20 74 68 65 20 55 52 4c 20 6f 62  alize the URL ob
52e0: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 75 72  ject..*/.void ur
52f0: 6c 5f 69 6e 69 74 69 61 6c 69 7a 65 28 48 51 75  l_initialize(HQu
5300: 65 72 79 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ery *p, const ch
5310: 61 72 20 2a 7a 42 61 73 65 29 7b 0a 20 20 6d 65  ar *zBase){.  me
5320: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
5330: 66 28 2a 70 29 29 3b 0a 20 20 62 6c 6f 62 5f 7a  f(*p));.  blob_z
5340: 65 72 6f 28 26 70 2d 3e 75 72 6c 29 3b 0a 20 20  ero(&p->url);.  
5350: 70 2d 3e 7a 42 61 73 65 20 3d 20 7a 42 61 73 65  p->zBase = zBase
5360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
5370: 73 20 74 68 65 20 67 69 76 65 6e 20 55 52 4c 20  s the given URL 
5380: 6f 62 6a 65 63 74 2c 20 64 65 61 6c 6c 6f 63 61  object, dealloca
5390: 74 69 6e 67 20 61 6e 79 20 6d 65 6d 6f 72 79 0a  ting any memory.
53a0: 2a 2a 20 69 74 20 75 73 65 73 2e 0a 2a 2f 0a 76  ** it uses..*/.v
53b0: 6f 69 64 20 75 72 6c 5f 72 65 73 65 74 28 48 51  oid url_reset(HQ
53c0: 75 65 72 79 20 2a 70 29 7b 0a 20 20 62 6c 6f 62  uery *p){.  blob
53d0: 5f 72 65 73 65 74 28 26 70 2d 3e 75 72 6c 29 3b  _reset(&p->url);
53e0: 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28 28  .  fossil_free((
53f0: 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 4e 61 6d 65  void *)p->azName
5400: 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 66 72 65 65  );.  fossil_free
5410: 28 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 56 61  ((void *)p->azVa
5420: 6c 75 65 29 3b 0a 20 20 75 72 6c 5f 69 6e 69 74  lue);.  url_init
5430: 69 61 6c 69 7a 65 28 70 2c 20 70 2d 3e 7a 42 61  ialize(p, p->zBa
5440: 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  se);.}../*.** Ad
5450: 64 20 61 20 66 69 78 65 64 20 70 61 72 61 6d 65  d a fixed parame
5460: 74 65 72 20 74 6f 20 61 6e 20 48 51 75 65 72 79  ter to an HQuery
5470: 2e 20 20 4f 72 20 72 65 6d 6f 76 65 20 74 68 65  .  Or remove the
5480: 20 70 61 72 61 6d 65 74 65 72 73 20 69 66 20 7a   parameters if z
5490: 56 61 6c 75 65 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69  Value==0..*/.voi
54a0: 64 20 75 72 6c 5f 61 64 64 5f 70 61 72 61 6d 65  d url_add_parame
54b0: 74 65 72 28 48 51 75 65 72 79 20 2a 70 2c 20 63  ter(HQuery *p, c
54c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
54d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56  , const char *zV
54e0: 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  alue){.  int i;.
54f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
5500: 6e 50 61 72 61 6d 3b 20 69 2b 2b 29 7b 0a 20 20  nParam; i++){.  
5510: 20 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72    if( fossil_str
5520: 63 6d 70 28 70 2d 3e 61 7a 4e 61 6d 65 5b 69 5d  cmp(p->azName[i]
5530: 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  ,zName)==0 ){.  
5540: 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 3d 3d      if( zValue==
5550: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
5560: 6e 50 61 72 61 6d 2d 2d 3b 0a 20 20 20 20 20 20  nParam--;.      
5570: 20 20 70 2d 3e 61 7a 56 61 6c 75 65 5b 69 5d 20    p->azValue[i] 
5580: 3d 20 70 2d 3e 61 7a 56 61 6c 75 65 5b 70 2d 3e  = p->azValue[p->
5590: 6e 50 61 72 61 6d 5d 3b 0a 20 20 20 20 20 20 20  nParam];.       
55a0: 20 70 2d 3e 61 7a 4e 61 6d 65 5b 69 5d 20 3d 20   p->azName[i] = 
55b0: 70 2d 3e 61 7a 4e 61 6d 65 5b 70 2d 3e 6e 50 61  p->azName[p->nPa
55c0: 72 61 6d 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ram];.      }els
55d0: 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 7a  e{.        p->az
55e0: 56 61 6c 75 65 5b 69 5d 20 3d 20 7a 56 61 6c 75  Value[i] = zValu
55f0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
5600: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
5610: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 3d 3d   }.  assert( i==
5620: 70 2d 3e 6e 50 61 72 61 6d 20 29 3b 0a 20 20 69  p->nParam );.  i
5630: 66 28 20 7a 56 61 6c 75 65 3d 3d 30 20 29 20 72  f( zValue==0 ) r
5640: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 69 3e 3d  eturn;.  if( i>=
5650: 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p->nAlloc ){.   
5660: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e   p->nAlloc = p->
5670: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20  nAlloc*2 + 10;. 
5680: 20 20 20 70 2d 3e 61 7a 4e 61 6d 65 20 3d 20 66     p->azName = f
5690: 6f 73 73 69 6c 5f 72 65 61 6c 6c 6f 63 28 28 76  ossil_realloc((v
56a0: 6f 69 64 20 2a 29 70 2d 3e 61 7a 4e 61 6d 65 2c  oid *)p->azName,
56b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 4e 61 6d 65  sizeof(p->azName
56e0: 5b 30 5d 29 2a 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  [0])*p->nAlloc);
56f0: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 6c 75 65 20  .    p->azValue 
5700: 3d 20 66 6f 73 73 69 6c 5f 72 65 61 6c 6c 6f 63  = fossil_realloc
5710: 28 28 76 6f 69 64 20 2a 29 70 2d 3e 61 7a 56 61  ((void *)p->azVa
5720: 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61       sizeof(p->a
5750: 7a 56 61 6c 75 65 5b 30 5d 29 2a 70 2d 3e 6e 41  zValue[0])*p->nA
5760: 6c 6c 6f 63 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  lloc);.  }.  p->
5770: 61 7a 4e 61 6d 65 5b 69 5d 20 3d 20 7a 4e 61 6d  azName[i] = zNam
5780: 65 3b 0a 20 20 70 2d 3e 61 7a 56 61 6c 75 65 5b  e;.  p->azValue[
5790: 69 5d 20 3d 20 7a 56 61 6c 75 65 3b 0a 20 20 70  i] = zValue;.  p
57a0: 2d 3e 6e 50 61 72 61 6d 2b 2b 3b 0a 7d 0a 0a 2f  ->nParam++;.}../
57b0: 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 74 68 65 20  *.** Render the 
57c0: 55 52 4c 20 77 69 74 68 20 61 20 70 61 72 61 6d  URL with a param
57d0: 65 74 65 72 20 6f 76 65 72 72 69 64 65 2e 0a 2a  eter override..*
57e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 65 64 20 6d 65  *.** Returned me
57f0: 6d 6f 72 79 20 69 73 20 74 72 61 6e 73 69 65 6e  mory is transien
5800: 74 20 61 6e 64 20 69 73 20 6f 76 65 72 77 72 69  t and is overwri
5810: 74 74 65 6e 20 6f 6e 20 74 68 65 20 6e 65 78 74  tten on the next
5820: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 2a 2a   call to this.**
5830: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65   routine for the
5840: 20 73 61 6d 65 20 48 51 75 65 72 79 2c 20 6f 72   same HQuery, or
5850: 20 75 6e 74 69 6c 20 74 68 65 20 48 51 75 65 72   until the HQuer
5860: 79 20 6f 62 6a 65 63 74 20 69 73 20 64 65 73 74  y object is dest
5870: 72 6f 79 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  royed..*/.char *
5880: 75 72 6c 5f 72 65 6e 64 65 72 28 0a 20 20 48 51  url_render(.  HQ
5890: 75 65 72 79 20 2a 70 2c 20 20 20 20 20 20 20 20  uery *p,        
58a0: 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 55 52        /* Base UR
58b0: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
58c0: 72 20 2a 7a 4e 61 6d 65 31 2c 20 20 20 20 20 2f  r *zName1,     /
58d0: 2a 20 46 69 72 73 74 20 6f 76 65 72 72 69 64 65  * First override
58e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
58f0: 20 2a 7a 56 61 6c 75 65 31 2c 20 20 20 20 2f 2a   *zValue1,    /*
5900: 20 46 69 72 73 74 20 6f 76 65 72 72 69 64 65 20   First override 
5910: 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  value */.  const
5920: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 32 2c 20 20   char *zName2,  
5930: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6f 76 65     /* Second ove
5940: 72 72 69 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  rride */.  const
5950: 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 32 20 20   char *zValue2  
5960: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6f 76 65     /* Second ove
5970: 72 72 69 64 65 20 76 61 6c 75 65 20 2a 2f 0a 29  rride value */.)
5980: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
5990: 7a 53 65 70 20 3d 20 22 3f 22 3b 0a 20 20 69 6e  zSep = "?";.  in
59a0: 74 20 69 3b 0a 0a 20 20 62 6c 6f 62 5f 72 65 73  t i;..  blob_res
59b0: 65 74 28 26 70 2d 3e 75 72 6c 29 3b 0a 20 20 62  et(&p->url);.  b
59c0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 70 2d 3e  lob_appendf(&p->
59d0: 75 72 6c 2c 20 22 25 52 2f 25 73 22 2c 20 70 2d  url, "%R/%s", p-
59e0: 3e 7a 42 61 73 65 29 3b 0a 20 20 66 6f 72 28 69  >zBase);.  for(i
59f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 50 61 72 61 6d 3b  =0; i<p->nParam;
5a00: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
5a10: 20 63 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 61 7a   char *z = p->az
5a20: 56 61 6c 75 65 5b 69 5d 3b 0a 20 20 20 20 69 66  Value[i];.    if
5a30: 28 20 7a 4e 61 6d 65 31 20 26 26 20 66 6f 73 73  ( zName1 && foss
5a40: 69 6c 5f 73 74 72 63 6d 70 28 7a 4e 61 6d 65 31  il_strcmp(zName1
5a50: 2c 70 2d 3e 61 7a 4e 61 6d 65 5b 69 5d 29 3d 3d  ,p->azName[i])==
5a60: 30 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65  0 ){.      zName
5a70: 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 3d  1 = 0;.      z =
5a80: 20 7a 56 61 6c 75 65 31 3b 0a 20 20 20 20 20 20   zValue1;.      
5a90: 69 66 28 20 7a 3d 3d 30 20 29 20 63 6f 6e 74 69  if( z==0 ) conti
5aa0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
5ab0: 66 28 20 7a 4e 61 6d 65 32 20 26 26 20 66 6f 73  f( zName2 && fos
5ac0: 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4e 61 6d 65  sil_strcmp(zName
5ad0: 32 2c 70 2d 3e 61 7a 4e 61 6d 65 5b 69 5d 29 3d  2,p->azName[i])=
5ae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  =0 ){.      zNam
5af0: 65 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  e2 = 0;.      z 
5b00: 3d 20 7a 56 61 6c 75 65 32 3b 0a 20 20 20 20 20  = zValue2;.     
5b10: 20 69 66 28 20 7a 3d 3d 30 20 29 20 63 6f 6e 74   if( z==0 ) cont
5b20: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
5b30: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 70 2d  blob_appendf(&p-
5b40: 3e 75 72 6c 2c 20 22 25 73 25 73 22 2c 20 7a 53  >url, "%s%s", zS
5b50: 65 70 2c 20 70 2d 3e 61 7a 4e 61 6d 65 5b 69 5d  ep, p->azName[i]
5b60: 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 26 26 20  );.    if( z && 
5b70: 7a 5b 30 5d 20 29 20 62 6c 6f 62 5f 61 70 70 65  z[0] ) blob_appe
5b80: 6e 64 66 28 26 70 2d 3e 75 72 6c 2c 20 22 3d 25  ndf(&p->url, "=%
5b90: 54 22 2c 20 7a 29 3b 0a 20 20 20 20 7a 53 65 70  T", z);.    zSep
5ba0: 20 3d 20 22 26 22 3b 0a 20 20 7d 0a 20 20 69 66   = "&";.  }.  if
5bb0: 28 20 7a 4e 61 6d 65 31 20 26 26 20 7a 56 61 6c  ( zName1 && zVal
5bc0: 75 65 31 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f  ue1 ){.    blob_
5bd0: 61 70 70 65 6e 64 66 28 26 70 2d 3e 75 72 6c 2c  appendf(&p->url,
5be0: 20 22 25 73 25 73 22 2c 20 7a 53 65 70 2c 20 7a   "%s%s", zSep, z
5bf0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
5c00: 7a 56 61 6c 75 65 31 5b 30 5d 20 29 20 62 6c 6f  zValue1[0] ) blo
5c10: 62 5f 61 70 70 65 6e 64 66 28 26 70 2d 3e 75 72  b_appendf(&p->ur
5c20: 6c 2c 20 22 3d 25 54 22 2c 20 7a 56 61 6c 75 65  l, "=%T", zValue
5c30: 31 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  1);.    zSep = "
5c40: 26 22 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e  &";.  }.  if( zN
5c50: 61 6d 65 32 20 26 26 20 7a 56 61 6c 75 65 32 20  ame2 && zValue2 
5c60: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65  ){.    blob_appe
5c70: 6e 64 66 28 26 70 2d 3e 75 72 6c 2c 20 22 25 73  ndf(&p->url, "%s
5c80: 25 73 22 2c 20 7a 53 65 70 2c 20 7a 4e 61 6d 65  %s", zSep, zName
5c90: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c  2);.    if( zVal
5ca0: 75 65 32 5b 30 5d 20 29 20 62 6c 6f 62 5f 61 70  ue2[0] ) blob_ap
5cb0: 70 65 6e 64 66 28 26 70 2d 3e 75 72 6c 2c 20 22  pendf(&p->url, "
5cc0: 3d 25 54 22 2c 20 7a 56 61 6c 75 65 32 29 3b 0a  =%T", zValue2);.
5cd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 6c 6f    }.  return blo
5ce0: 62 5f 73 74 72 28 26 70 2d 3e 75 72 6c 29 3b 0a  b_str(&p->url);.
5cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20  }../*.** Prompt 
5d00: 74 68 65 20 75 73 65 72 20 66 6f 72 20 74 68 65  the user for the
5d10: 20 70 61 73 73 77 6f 72 64 20 74 68 61 74 20 63   password that c
5d20: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
5d30: 65 20 22 75 73 65 72 22 20 6d 65 6d 62 65 72 20  e "user" member 
5d40: 6f 66 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64  of.** the provid
5d50: 65 64 20 55 72 6c 44 61 74 61 20 73 74 72 75 63  ed UrlData struc
5d60: 74 75 72 65 2e 20 20 53 74 6f 72 65 20 74 68 65  ture.  Store the
5d70: 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 74 68 65   result into the
5d80: 20 22 70 61 73 73 77 64 22 20 6d 65 6d 62 65 72   "passwd" member
5d90: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 72 6f 76 69  .** of the provi
5da0: 64 65 64 20 55 72 6c 44 61 74 61 20 73 74 72 75  ded UrlData stru
5db0: 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 75  cture..*/.void u
5dc0: 72 6c 5f 70 72 6f 6d 70 74 5f 66 6f 72 5f 70 61  rl_prompt_for_pa
5dd0: 73 73 77 6f 72 64 5f 6c 6f 63 61 6c 28 55 72 6c  ssword_local(Url
5de0: 44 61 74 61 20 2a 70 55 72 6c 44 61 74 61 29 7b  Data *pUrlData){
5df0: 0a 20 20 69 66 28 20 70 55 72 6c 44 61 74 61 2d  .  if( pUrlData-
5e00: 3e 69 73 53 73 68 20 7c 7c 20 70 55 72 6c 44 61  >isSsh || pUrlDa
5e10: 74 61 2d 3e 69 73 46 69 6c 65 20 29 20 72 65 74  ta->isFile ) ret
5e20: 75 72 6e 3b 0a 20 20 69 66 28 20 66 6f 73 73 69  urn;.  if( fossi
5e30: 6c 5f 69 73 61 74 74 79 28 66 6f 73 73 69 6c 5f  l_isatty(fossil_
5e40: 66 69 6c 65 6e 6f 28 73 74 64 69 6e 29 29 0a 20  fileno(stdin)). 
5e50: 20 20 26 26 20 28 70 55 72 6c 44 61 74 61 2d 3e    && (pUrlData->
5e60: 66 6c 61 67 73 20 26 20 55 52 4c 5f 50 52 4f 4d  flags & URL_PROM
5e70: 50 54 5f 50 57 29 21 3d 30 0a 20 20 20 26 26 20  PT_PW)!=0.   && 
5e80: 28 70 55 72 6c 44 61 74 61 2d 3e 66 6c 61 67 73  (pUrlData->flags
5e90: 20 26 20 55 52 4c 5f 50 52 4f 4d 50 54 45 44 29   & URL_PROMPTED)
5ea0: 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 55 72  ==0.  ){.    pUr
5eb0: 6c 44 61 74 61 2d 3e 66 6c 61 67 73 20 7c 3d 20  lData->flags |= 
5ec0: 55 52 4c 5f 50 52 4f 4d 50 54 45 44 3b 0a 20 20  URL_PROMPTED;.  
5ed0: 20 20 70 55 72 6c 44 61 74 61 2d 3e 70 61 73 73    pUrlData->pass
5ee0: 77 64 20 3d 20 70 72 6f 6d 70 74 5f 66 6f 72 5f  wd = prompt_for_
5ef0: 75 73 65 72 5f 70 61 73 73 77 6f 72 64 28 70 55  user_password(pU
5f00: 72 6c 44 61 74 61 2d 3e 63 61 6e 6f 6e 69 63 61  rlData->canonica
5f10: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 55 72 6c  l);.    if( pUrl
5f20: 44 61 74 61 2d 3e 70 61 73 73 77 64 5b 30 5d 0a  Data->passwd[0].
5f30: 20 20 20 20 20 26 26 20 28 70 55 72 6c 44 61 74       && (pUrlDat
5f40: 61 2d 3e 66 6c 61 67 73 20 26 20 28 55 52 4c 5f  a->flags & (URL_
5f50: 52 45 4d 45 4d 42 45 52 7c 55 52 4c 5f 41 53 4b  REMEMBER|URL_ASK
5f60: 5f 52 45 4d 45 4d 42 45 52 5f 50 57 29 29 21 3d  _REMEMBER_PW))!=
5f70: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  0.    ){.      i
5f80: 66 28 20 73 61 76 65 5f 70 61 73 73 77 6f 72 64  f( save_password
5f90: 5f 70 72 6f 6d 70 74 28 70 55 72 6c 44 61 74 61  _prompt(pUrlData
5fa0: 2d 3e 70 61 73 73 77 64 29 20 29 7b 0a 20 20 20  ->passwd) ){.   
5fb0: 20 20 20 20 20 70 55 72 6c 44 61 74 61 2d 3e 66       pUrlData->f
5fc0: 6c 61 67 73 20 7c 3d 20 55 52 4c 5f 52 45 4d 45  lags |= URL_REME
5fd0: 4d 42 45 52 5f 50 57 3b 0a 20 20 20 20 20 20 7d  MBER_PW;.      }
5fe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 55  else{.        pU
5ff0: 72 6c 44 61 74 61 2d 3e 66 6c 61 67 73 20 26 3d  rlData->flags &=
6000: 20 7e 55 52 4c 5f 52 45 4d 45 4d 42 45 52 5f 50   ~URL_REMEMBER_P
6010: 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  W;.      }.    }
6020: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
6030: 73 73 69 6c 5f 66 61 74 61 6c 28 22 6d 69 73 73  ssil_fatal("miss
6040: 69 6e 67 20 6f 72 20 69 6e 63 6f 72 72 65 63 74  ing or incorrect
6050: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 75 73   password for us
6060: 65 72 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  er \"%s\"",.    
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55 72               pUr
6080: 6c 44 61 74 61 2d 3e 75 73 65 72 29 3b 0a 20 20  lData->user);.  
6090: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70  }.}../*.** Promp
60a0: 74 20 74 68 65 20 75 73 65 72 20 66 6f 72 20 74  t the user for t
60b0: 68 65 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20  he password for 
60c0: 67 2e 75 72 6c 2e 75 73 65 72 2e 20 20 53 74 6f  g.url.user.  Sto
60d0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  re the result.**
60e0: 20 69 6e 20 67 2e 75 72 6c 2e 70 61 73 73 77 64   in g.url.passwd
60f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 75 72 6c 5f 70 72  ..*/.void url_pr
6100: 6f 6d 70 74 5f 66 6f 72 5f 70 61 73 73 77 6f 72  ompt_for_passwor
6110: 64 28 76 6f 69 64 29 7b 0a 20 20 75 72 6c 5f 70  d(void){.  url_p
6120: 72 6f 6d 70 74 5f 66 6f 72 5f 70 61 73 73 77 6f  rompt_for_passwo
6130: 72 64 5f 6c 6f 63 61 6c 28 26 67 2e 75 72 6c 29  rd_local(&g.url)
6140: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
6150: 62 65 72 20 74 68 65 20 55 52 4c 20 61 6e 64 20  ber the URL and 
6160: 70 61 73 73 77 6f 72 64 20 69 66 20 72 65 71 75  password if requ
6170: 65 73 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 75  ested..*/.void u
6180: 72 6c 5f 72 65 6d 65 6d 62 65 72 28 76 6f 69 64  rl_remember(void
6190: 29 7b 0a 20 20 69 66 28 20 67 2e 75 72 6c 2e 66  ){.  if( g.url.f
61a0: 6c 61 67 73 20 26 20 55 52 4c 5f 52 45 4d 45 4d  lags & URL_REMEM
61b0: 42 45 52 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  BER ){.    const
61c0: 20 63 68 61 72 20 2a 75 72 6c 3b 0a 20 20 20 20   char *url;.    
61d0: 69 66 28 20 67 2e 75 72 6c 2e 75 73 65 50 72 6f  if( g.url.usePro
61e0: 78 79 20 29 7b 0a 20 20 20 20 20 20 75 72 6c 20  xy ){.      url 
61f0: 3d 20 67 2e 75 72 6c 2e 70 72 6f 78 79 55 72 6c  = g.url.proxyUrl
6200: 43 61 6e 6f 6e 69 63 61 6c 3b 0a 20 20 20 20 7d  Canonical;.    }
6210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 72 6c 20  else{.      url 
6220: 3d 20 67 2e 75 72 6c 2e 63 61 6e 6f 6e 69 63 61  = g.url.canonica
6230: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  l;.    }.    if(
6240: 20 67 2e 75 72 6c 2e 66 6c 61 67 73 20 26 20 55   g.url.flags & U
6250: 52 4c 5f 55 53 45 5f 50 41 52 45 4e 54 20 29 7b  RL_USE_PARENT ){
6260: 0a 20 20 20 20 20 20 64 62 5f 73 65 74 28 22 70  .      db_set("p
6270: 61 72 65 6e 74 2d 70 72 6f 6a 65 63 74 2d 75 72  arent-project-ur
6280: 6c 22 2c 20 75 72 6c 2c 20 30 29 3b 0a 20 20 20  l", url, 0);.   
6290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 62   }else{.      db
62a0: 5f 73 65 74 28 22 6c 61 73 74 2d 73 79 6e 63 2d  _set("last-sync-
62b0: 75 72 6c 22 2c 20 75 72 6c 2c 20 30 29 3b 0a 20  url", url, 0);. 
62c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 75     }.    if( g.u
62d0: 72 6c 2e 75 73 65 72 21 3d 30 20 26 26 20 67 2e  rl.user!=0 && g.
62e0: 75 72 6c 2e 70 61 73 73 77 64 21 3d 30 20 26 26  url.passwd!=0 &&
62f0: 20 28 20 67 2e 75 72 6c 2e 66 6c 61 67 73 20 26   ( g.url.flags &
6300: 20 55 52 4c 5f 52 45 4d 45 4d 42 45 52 5f 50 57   URL_REMEMBER_PW
6310: 20 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   ) ){.      if( 
6320: 67 2e 75 72 6c 2e 66 6c 61 67 73 20 26 20 55 52  g.url.flags & UR
6330: 4c 5f 55 53 45 5f 50 41 52 45 4e 54 20 29 7b 0a  L_USE_PARENT ){.
6340: 20 20 20 20 20 20 20 20 64 62 5f 73 65 74 28 22          db_set("
6350: 70 61 72 65 6e 74 2d 70 72 6f 6a 65 63 74 2d 70  parent-project-p
6360: 77 22 2c 20 6f 62 73 63 75 72 65 28 67 2e 75 72  w", obscure(g.ur
6370: 6c 2e 70 61 73 73 77 64 29 2c 20 30 29 3b 0a 20  l.passwd), 0);. 
6380: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6390: 20 20 20 20 64 62 5f 73 65 74 28 22 6c 61 73 74      db_set("last
63a0: 2d 73 79 6e 63 2d 70 77 22 2c 20 6f 62 73 63 75  -sync-pw", obscu
63b0: 72 65 28 67 2e 75 72 6c 2e 70 61 73 73 77 64 29  re(g.url.passwd)
63c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
63d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72    }.  }.}../* Pr
63e0: 65 65 6d 70 74 69 76 65 6c 79 20 70 72 6f 6d 70  eemptively promp
63f0: 74 20 66 6f 72 20 61 20 70 61 73 73 77 6f 72 64  t for a password
6400: 20 69 66 20 61 20 75 73 65 72 6e 61 6d 65 20 69   if a username i
6410: 73 20 67 69 76 65 6e 20 69 6e 20 74 68 65 0a 2a  s given in the.*
6420: 2a 20 55 52 4c 20 62 75 74 20 6e 6f 20 70 61 73  * URL but no pas
6430: 73 77 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 75  sword..*/.void u
6440: 72 6c 5f 67 65 74 5f 70 61 73 73 77 6f 72 64 5f  rl_get_password_
6450: 69 66 5f 6e 65 65 64 65 64 28 76 6f 69 64 29 7b  if_needed(void){
6460: 0a 20 20 69 66 28 20 28 67 2e 75 72 6c 2e 75 73  .  if( (g.url.us
6470: 65 72 20 26 26 20 67 2e 75 72 6c 2e 75 73 65 72  er && g.url.user
6480: 5b 30 5d 29 0a 20 20 20 26 26 20 28 67 2e 75 72  [0]).   && (g.ur
6490: 6c 2e 70 61 73 73 77 64 3d 3d 30 20 7c 7c 20 67  l.passwd==0 || g
64a0: 2e 75 72 6c 2e 70 61 73 73 77 64 5b 30 5d 3d 3d  .url.passwd[0]==
64b0: 30 29 0a 20 20 20 26 26 20 66 6f 73 73 69 6c 5f  0).   && fossil_
64c0: 69 73 61 74 74 79 28 66 6f 73 73 69 6c 5f 66 69  isatty(fossil_fi
64d0: 6c 65 6e 6f 28 73 74 64 69 6e 29 29 0a 20 20 29  leno(stdin)).  )
64e0: 7b 0a 20 20 20 20 75 72 6c 5f 70 72 6f 6d 70 74  {.    url_prompt
64f0: 5f 66 6f 72 5f 70 61 73 73 77 6f 72 64 28 29 3b  _for_password();
6500: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  .  }.}../*.** Gi
6510: 76 65 6e 20 61 20 55 52 4c 20 66 6f 72 20 61 20  ven a URL for a 
6520: 72 65 6d 6f 74 65 20 72 65 70 6f 73 69 74 6f 72  remote repositor
6530: 79 20 63 6c 6f 6e 65 20 70 6f 69 6e 74 2c 20 74  y clone point, t
6540: 72 79 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69  ry to come up wi
6550: 74 68 20 61 0a 2a 2a 20 72 65 61 73 6f 6e 61 62  th a.** reasonab
6560: 6c 65 20 62 61 73 65 6e 61 6d 65 20 6f 66 20 61  le basename of a
6570: 20 6c 6f 63 61 6c 20 63 6c 6f 6e 65 20 6f 66 20   local clone of 
6580: 74 68 61 74 20 72 65 70 6f 73 69 74 6f 72 79 2e  that repository.
6590: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 49 66 20  .**.**    *  If 
65a0: 74 68 65 20 55 52 4c 20 68 61 73 20 61 20 70 61  the URL has a pa
65b0: 74 68 2c 20 75 73 65 20 74 68 65 20 74 61 69 6c  th, use the tail
65c0: 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 77 69   of the path, wi
65d0: 74 68 20 61 6e 79 20 73 75 66 66 69 78 0a 2a 2a  th any suffix.**
65e0: 20 20 20 20 20 20 20 65 6c 69 64 65 64 2e 0a 2a         elided..*
65f0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 49 66 20 74 68  *.**    *  If th
6600: 65 20 55 52 4c 20 69 73 20 6a 75 73 74 20 61 20  e URL is just a 
6610: 64 6f 6d 61 69 6e 20 6e 61 6d 65 2c 20 77 69 74  domain name, wit
6620: 68 6f 75 74 20 61 20 70 61 74 68 2c 20 74 68 65  hout a path, the
6630: 6e 20 75 73 65 20 74 68 65 0a 2a 2a 20 20 20 20  n use the.**    
6640: 20 20 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74     first element
6650: 20 6f 66 20 74 68 65 20 64 6f 6d 61 69 6e 20 6e   of the domain n
6660: 61 6d 65 2c 20 65 78 63 65 70 74 20 73 6b 69 70  ame, except skip
6670: 20 6f 76 65 72 20 22 77 77 77 2e 22 20 69 66 0a   over "www." if.
6680: 2a 2a 20 20 20 20 20 20 20 70 72 65 73 65 6e 74  **       present
6690: 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73   and if there is
66a0: 20 61 20 22 2e 63 6f 6d 22 20 6f 72 20 22 2e 6f   a ".com" or ".o
66b0: 72 67 22 20 6f 72 20 73 69 6d 69 6c 61 72 20 73  rg" or similar s
66c0: 75 66 66 69 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffix..**.** The
66d0: 20 73 74 72 69 6e 67 20 72 65 74 75 72 6e 65 64   string returned
66e0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
66f0: 6d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28  m fossil_malloc(
6700: 29 2e 20 20 4e 55 4c 4c 20 6d 69 67 68 74 20 62  ).  NULL might b
6710: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66  e.** returned if
6720: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
6730: 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20 2a 75 72 6c  or..*/.char *url
6740: 5f 74 6f 5f 72 65 70 6f 5f 62 61 73 65 6e 61 6d  _to_repo_basenam
6750: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  e(const char *zU
6760: 72 6c 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rl){.  const cha
6770: 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  r *zTail = 0;.  
6780: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 55 72  int i;.  if( zUr
6790: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
67a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 55 72 6c  .  for(i=0; zUrl
67b0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
67c0: 66 28 20 7a 55 72 6c 5b 69 5d 3d 3d 27 3f 27 20  f( zUrl[i]=='?' 
67d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
67e0: 20 28 7a 55 72 6c 5b 69 5d 3d 3d 27 2f 27 20 7c   (zUrl[i]=='/' |
67f0: 7c 20 7a 55 72 6c 5b 69 5d 3d 3d 27 40 27 29 20  | zUrl[i]=='@') 
6800: 26 26 20 7a 55 72 6c 5b 69 2b 31 5d 21 3d 30 20  && zUrl[i+1]!=0 
6810: 29 20 7a 54 61 69 6c 20 3d 20 26 7a 55 72 6c 5b  ) zTail = &zUrl[
6820: 69 2b 31 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  i+1];.  }.  if( 
6830: 7a 54 61 69 6c 3d 3d 30 20 29 20 72 65 74 75 72  zTail==0 ) retur
6840: 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
6850: 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 54 61 69  e3_strnicmp(zTai
6860: 6c 2c 20 22 77 77 77 2e 22 2c 20 34 29 3d 3d 30  l, "www.", 4)==0
6870: 20 26 26 20 73 74 72 63 68 72 28 7a 54 61 69 6c   && strchr(zTail
6880: 2b 34 2c 27 2e 27 29 21 3d 30 20 29 7b 0a 20 20  +4,'.')!=0 ){.  
6890: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
68a0: 22 77 77 77 2e 22 20 70 72 65 66 69 78 20 69 66  "www." prefix if
68b0: 20 74 68 65 72 65 20 61 72 65 20 6d 6f 72 65 20   there are more 
68c0: 22 2e 22 20 63 68 61 72 61 63 74 65 72 73 20 6c  "." characters l
68d0: 61 74 65 72 2e 0a 20 20 20 20 2a 2a 20 42 75 74  ater..    ** But
68e0: 20 64 6f 6e 27 74 20 72 65 6d 6f 76 65 20 74 68   don't remove th
68f0: 65 20 22 77 77 77 2e 22 20 70 72 65 66 69 78 20  e "www." prefix 
6900: 69 66 20 77 68 61 74 20 66 6f 6c 6c 6f 77 73 20  if what follows 
6910: 69 73 20 74 68 65 20 73 75 66 66 69 78 2e 0a 20  is the suffix.. 
6920: 20 20 20 2a 2a 20 66 6f 72 75 6d 3a 2f 66 6f 72     ** forum:/for
6930: 75 6d 70 6f 73 74 2f 37 34 65 31 31 31 61 32 65  umpost/74e111a2e
6940: 65 20 2a 2f 0a 20 20 20 20 7a 54 61 69 6c 20 2b  e */.    zTail +
6950: 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  = 4;.  }.  if( z
6960: 54 61 69 6c 5b 30 5d 3d 3d 30 20 29 20 72 65 74  Tail[0]==0 ) ret
6970: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
6980: 3b 20 7a 54 61 69 6c 5b 69 5d 20 26 26 20 7a 54  ; zTail[i] && zT
6990: 61 69 6c 5b 69 5d 21 3d 27 2e 27 20 26 26 20 7a  ail[i]!='.' && z
69a0: 54 61 69 6c 5b 69 5d 21 3d 27 3f 27 20 26 26 0a  Tail[i]!='?' &&.
69b0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 61 69 6c             zTail
69c0: 5b 69 5d 21 3d 27 3a 27 20 26 26 20 7a 54 61 69  [i]!=':' && zTai
69d0: 6c 5b 69 5d 21 3d 27 2f 27 3b 20 69 2b 2b 29 7b  l[i]!='/'; i++){
69e0: 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 20 72  }.  if( i==0 ) r
69f0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
6a00: 6e 20 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22  n mprintf("%.*s"
6a10: 2c 20 69 2c 20 7a 54 61 69 6c 29 3b 0a 7d 0a 0a  , i, zTail);.}..
6a20: 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 74  /*.** COMMAND: t
6a30: 65 73 74 2d 75 72 6c 2d 62 61 73 65 6e 61 6d 65  est-url-basename
6a40: 0a 2a 2a 20 55 73 61 67 65 3a 20 25 66 6f 73 73  .** Usage: %foss
6a50: 69 6c 20 74 65 73 74 2d 75 72 6c 2d 62 61 73 65  il test-url-base
6a60: 6e 61 6d 65 73 20 55 52 4c 20 2e 2e 2e 0a 2a 2a  names URL ....**
6a70: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
6a80: 20 69 73 20 75 73 65 64 20 66 6f 72 20 75 6e 69   is used for uni
6a90: 74 20 74 65 73 74 69 6e 67 20 6f 66 20 74 68 65  t testing of the
6aa0: 20 75 72 6c 5f 74 6f 5f 72 65 70 6f 5f 62 61 73   url_to_repo_bas
6ab0: 65 6e 61 6d 65 28 29 0a 2a 2a 20 72 6f 75 74 69  ename().** routi
6ac0: 6e 65 2e 20 20 54 68 65 20 63 6f 6d 6d 61 6e 64  ne.  The command
6ad0: 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20  -line arguments 
6ae0: 61 72 65 20 55 52 4c 2c 20 70 72 65 73 75 6d 61  are URL, presuma
6af0: 62 6c 79 20 66 6f 72 20 72 65 6d 6f 74 65 0a 2a  bly for remote.*
6b00: 2a 20 46 6f 73 73 69 6c 20 72 65 70 6f 73 69 74  * Fossil reposit
6b10: 6f 72 69 65 73 2e 20 20 54 68 69 73 20 63 6f 6d  ories.  This com
6b20: 6d 61 6e 64 20 72 75 6e 73 20 75 72 6c 5f 74 6f  mand runs url_to
6b30: 5f 72 65 70 6f 5f 62 61 73 65 6e 61 6d 65 28 29  _repo_basename()
6b40: 20 6f 6e 20 65 61 63 68 0a 2a 2a 20 6f 66 20 74   on each.** of t
6b50: 68 6f 73 65 20 69 6e 70 75 74 73 20 61 6e 64 20  hose inputs and 
6b60: 64 69 73 70 6c 61 79 73 20 74 68 65 20 72 65 73  displays the res
6b70: 75 6c 74 2e 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64  ult..*/.void cmd
6b80: 5f 74 65 73 74 5f 75 72 6c 5f 62 61 73 65 6e 61  _test_url_basena
6b90: 6d 65 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20  me(void){.  int 
6ba0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
6bb0: 66 6f 72 28 69 3d 32 3b 20 69 3c 67 2e 61 72 67  for(i=2; i<g.arg
6bc0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 20 3d  c; i++){.    z =
6bd0: 20 75 72 6c 5f 74 6f 5f 72 65 70 6f 5f 62 61 73   url_to_repo_bas
6be0: 65 6e 61 6d 65 28 67 2e 61 72 67 76 5b 69 5d 29  ename(g.argv[i])
6bf0: 3b 0a 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69  ;.    fossil_pri
6c00: 6e 74 28 22 25 73 20 2d 3e 20 25 73 5c 6e 22 2c  nt("%s -> %s\n",
6c10: 20 67 2e 61 72 67 76 5b 69 5d 2c 20 7a 29 3b 0a   g.argv[i], z);.
6c20: 20 20 20 20 66 6f 73 73 69 6c 5f 66 72 65 65 28      fossil_free(
6c30: 7a 29 3b 0a 20 20 7d 0a 7d 0a                    z);.  }.}.