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);. }.}.