Ik hoopte dat er al een standaard functie voor zou zijn, maar nee. Dus zelf maar aan de slag gegaan, om een standaard url te ontleden in alle afzonderlijke delen.
protocol://user:password@host:port/dit/is/het/pad/bestand?query=lijst
hiervoor gebruik ik de volgende snel-snel-code:
Protocol t/m Query worden nog wel netjes geGET en gePUT en de query-lijst wordt nog wel een TStringlist, maar het ging mij even om het idee.
Als het goed is behandeld deze functie de volgende gevallen:
[1] mag er staan, hoeft niet
[2] mag er staan als user@ en user:password@, maar hoeft niet
[3] moet er staan als host of als host:port
[4] pad mag er staan, hoeft niet. Indien niet, dan geld / als pad
[5] bestand mag er staan, maar hoeft niet.
[6] mag er staan maar hoeft niet.
Mijn vraag is nu eigenlijk tweeledig:
• Heb ik hiermee alle mogelijkheden gehad?
• Moet ik URLDecode gebruiken voordat ik deze split actie uitvoer, of pas achteraf?
protocol://user:password@host:port/dit/is/het/pad/bestand?query=lijst
hiervoor gebruik ik de volgende snel-snel-code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
| Type TURL=class protocol:string; user:string; pass:string; host:string; port:string; path:string; bestand:string; query:string; procedure Split(URL:string); end; |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| procedure TURL.Split(URL:string);
var
Restant,
UserPassHostPort,
PathFile:string;
VorigeSlash:integer;
begin
// Pak indien aanwezig het protocol uit de string
if pos('://',URL)>0 then
begin
protocol:=copy(URL,1,pos('://',URL)-1);
Restant:=copy(URL,pos('://',URL)+3,1000);
end
else
protocol:='';
// Het gehele gedeelte UserPassHostport vormt op uit de string
if pos('/',Restant)>0 then
begin
UserPassHostPort:=copy(Restant,1,pos('/',Restant)-1);
Restant:=copy(Restant,pos('/',Restant),1000);
end
else
begin
UserPassHostPort:=copy(Restant,1,pos('/',Restant)-1);
Restant:='/';
end;
//Splits indien aanwezig Username en wachtwoord uit voorgaande resultaat
if pos('@',UserPassHostPort)>0 then
begin
host:=copy(UserPassHostPort,pos('@',UserPassHostPort)+1,1000);
UserPassHostPort:= copy(UserPassHostPort,1,pos('@',UserPassHostPort)-1);
if pos(':',UserPassHostPort)>0 then
begin
pass:=copy(UserPassHostPort,pos(':',UserPassHostPort)+1,1000);
user:=copy(UserPassHostPort,1,pos(':',UserPassHostPort)-1);
end
else
begin
user:=UserPassHostPort;
pass:='';
end;
end
else
begin
host:=UserPassHostPort;
user:='';
pass:='';
end;
//Splits indien nodig host op in port en host
if pos(':',host)>0 then
begin
port:=copy(host,pos(':',host)+1,1000);
host:=copy(host,1,pos(':',host)-1);
end;
//Splits het restant op in query en bestand+path
if pos('?',Restant)>0 then
begin
PathFile:=copy(Restant,1,pos('?',Restant)-1);
query:=copy(Restant,pos('?',Restant)+1,1000);
end
else
begin
PathFile:=Restant;
query:='';
end;
//splits bestand en pad op bij de achterste slash
VorigeSlash:=1;
repeat
Bestand:=copy(PathFile,VorigeSlash+1,1000);
Path:=copy(PathFile,1,VorigeSlash);
VorigeSlash:=PosEx('/', PathFile, VorigeSlash+1);
until Vorige=0;
end; |
Protocol t/m Query worden nog wel netjes geGET en gePUT en de query-lijst wordt nog wel een TStringlist, maar het ging mij even om het idee.
Als het goed is behandeld deze functie de volgende gevallen:
code:
1
2
| [1] [2] [3] [4] [5] [6] protocol://user:password@host:port/dit/is/het/pad/bestand?query=lijst |
[1] mag er staan, hoeft niet
[2] mag er staan als user@ en user:password@, maar hoeft niet
[3] moet er staan als host of als host:port
[4] pad mag er staan, hoeft niet. Indien niet, dan geld / als pad
[5] bestand mag er staan, maar hoeft niet.
[6] mag er staan maar hoeft niet.
Mijn vraag is nu eigenlijk tweeledig:
• Heb ik hiermee alle mogelijkheden gehad?
• Moet ik URLDecode gebruiken voordat ik deze split actie uitvoer, of pas achteraf?
[ Voor 18% gewijzigd door jvdmeer op 11-12-2003 23:19 . Reden: Commentaar toegevoegd in code ]