Inleiding
Dit is een (zeer) lange, uitgebreide post
Ik ben nu bezig met het leren van C++, omdat ik ISAPI Filters moet schrijven.
Ik heb al programmeerervaring (VB), maar het is de bedoeling dat C++ mijn standaardprogrammeertaal wordt, want op de universiteit zal ik toch nooit meer VB gebruiken.
Om mijn code goed te testen, heb ik een command-line programma geschreven. (Als het eenmaal goed werkt maak ik er een ISAPI DLL van - dat is niet zo moeilijk).
Wat is de bedoeling?
De Filter draait op de server, een bezoeker typt een URL in, bijv:
http://www.testserver.com/virtdir/dit/is/een/url.asp?dit=een&query=string
De filter ontvangt:
/virtdir/dit/is/een/url.asp?dit=een&query=string
Daarbij is het de bedoeling dat de gehele querystring (mits aanwezig) wordt verwijderd (heeft de filter nl. niet nodig). (Dit is in de code 'stap 1').
Als de querystring is verwijderd, dan blijft het volgende over:
/virtdir/dit/is/een/url.asp
Stap 2 in m'n code is het bepalen van de 'VDName'. Dat is de naam van de virtual directory.
In bovenstaande voorbeeld is "virtdir" de naam van de virtual directory.
Als als URL
/index.htm
wordt opgegeven, dan is dat geen probleem, want er wordt in een later stadium gecontroleerd of de gevonden waarde voor VDName wel een directory is.
Als als URL bijvoorbeeld
/?querystring
wordt opgegeven, dan is er geen waarde voor VDName... in dat geval krijgt de variabele VDName de waarde "VD_EMPTY".
De Code
De code is eigenlijk langer, maar ik heb niet relevante en minder belangrijke stukken eruit gelaten.
Input: (command line arguments): een url (bijv: "/ditiseentest/home/test/")
Output: Virtual Directory Name: {VDName} (bijv: Virtual Directory Name: ditiseentest)
Code testen
Er zijn heel veel verschillende (geldige & ongeldige) URLs mogelijk, de ISAPI Filter DLL moet ze allemaal aankunnen zonder te crashen.
Daarom heb ik een batchbestand gemaakt, waarmee ik het programma snel met een aantal verschillende URLs kan testen.
Het probleem
Als alles goed zou werken, zou dit de correcte output van m'n batchbestand moeten zijn:
Maar ik krijg dit:
Het valt op dat bij sommige URLs, VDName vreemde tekens erbij heeft gekregen. (=☻, ☺, ¢Ÿ, etc)
Hier wordt het niet goed weergegeven ivm HTML etc. maar de tekens die ik bedoel zijn dingen in het begin van de ASCII set, zoals een hartje, een smiley, etc)
Ik vermoed dat dat te maken heeft met een verkeerd gebruik van pointers (ik ben nog steeds newbie).
Ik heb gelezen dat dat soms 'garbage' kan opleveren of dat het gevaarlijk is, etc.
Ik zit al weken vast, dus misschien dat hier iemand me kan helpen.
Alvast bedankt
Extra Info
Compiler: g++ voor Windows
(Microsoft VC++ werkt hier helemaal niet)
Dit is een (zeer) lange, uitgebreide post
Ik ben nu bezig met het leren van C++, omdat ik ISAPI Filters moet schrijven.
Ik heb al programmeerervaring (VB), maar het is de bedoeling dat C++ mijn standaardprogrammeertaal wordt, want op de universiteit zal ik toch nooit meer VB gebruiken.
Om mijn code goed te testen, heb ik een command-line programma geschreven. (Als het eenmaal goed werkt maak ik er een ISAPI DLL van - dat is niet zo moeilijk).
Wat is de bedoeling?
De Filter draait op de server, een bezoeker typt een URL in, bijv:
http://www.testserver.com/virtdir/dit/is/een/url.asp?dit=een&query=string
De filter ontvangt:
/virtdir/dit/is/een/url.asp?dit=een&query=string
Daarbij is het de bedoeling dat de gehele querystring (mits aanwezig) wordt verwijderd (heeft de filter nl. niet nodig). (Dit is in de code 'stap 1').
Als de querystring is verwijderd, dan blijft het volgende over:
/virtdir/dit/is/een/url.asp
Stap 2 in m'n code is het bepalen van de 'VDName'. Dat is de naam van de virtual directory.
In bovenstaande voorbeeld is "virtdir" de naam van de virtual directory.
Als als URL
/index.htm
wordt opgegeven, dan is dat geen probleem, want er wordt in een later stadium gecontroleerd of de gevonden waarde voor VDName wel een directory is.
Als als URL bijvoorbeeld
/?querystring
wordt opgegeven, dan is er geen waarde voor VDName... in dat geval krijgt de variabele VDName de waarde "VD_EMPTY".
De Code
De code is eigenlijk langer, maar ik heb niet relevante en minder belangrijke stukken eruit gelaten.
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| #include <algorithm>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
using namespace std;
#define deletepointer(p) if(p) { delete p; p = NULL; }
int main(int argc, char *argv[])
{
// Get URL from commandline (for testing only)
char URLBuffer[1024];
strcpy(URLBuffer,argv[1]);
cout<<"\n\n==================
===================\nURLBuffer: "<<URLBuffer<<"\n";
// Get the virtual directory name from the requested URL
char * VDName;
VDName = new char;
char * pch1;
pch1 = new char;
char * pch2;
pch2 = new char;
char * pch3;
pch3 = new char;
char * pch4;
pch4 = new char;
if(VDName != NULL && pch1 != NULL && pch2 != NULL
&& pch3 != NULL && pch4 != NULL && strlen(URLBuffer) > 1)
{
// Step 1: Locate and remove querystring
pch1 = (char*) memchr(URLBuffer,'?',strlen(URLBuffer));
if (pch1 != NULL)
{
strncpy(pch2,URLBuffer,pch1-URLBuffer);
}
else
{
strcpy(pch2,URLBuffer);
}
// Step 2: get virtual directory name
reverse(pch2,pch2+strlen(pch2));
strncpy(pch3,pch2,strlen(pch2)-1);
reverse(pch3,pch3+strlen(pch3));
strcat(pch3,"/");
strncpy(pch4,pch3,1);
if(strcmp(pch4,"/") == 0)
{
strcpy(VDName,"VD_EMPTY");
}
else
{
pch4 = (char*) memchr(pch3,'/',strlen(pch3));
if (pch4 != NULL)
{
strncpy(VDName,pch3,pch4-pch3);
}
}
}
else
{
strcpy(VDName,"VD_EMPTY");
}
cout<<"Virtual Directory Name: "<<VDName<<"\n";
cout<<"-------------------------------------\n";
// cleanup
deletepointer(VDName);
deletepointer(pch4);
deletepointer(pch3);
deletepointer(pch2);
deletepointer(pch1);
return 0;
} |
Input: (command line arguments): een url (bijv: "/ditiseentest/home/test/")
Output: Virtual Directory Name: {VDName} (bijv: Virtual Directory Name: ditiseentest)
Code testen
Er zijn heel veel verschillende (geldige & ongeldige) URLs mogelijk, de ISAPI Filter DLL moet ze allemaal aankunnen zonder te crashen.
Daarom heb ik een batchbestand gemaakt, waarmee ik het programma snel met een aantal verschillende URLs kan testen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| @echo off cls test.exe "/virtdir/home/test" test.exe "/virtdir/home/test/" test.exe "/virtdir/" test.exe "/virtdir" test.exe "/virtdir/?dit=eenquerystring" test.exe "/virtdir?dit=eenquerystring" test.exe "/?dit=eenquerystring" test.exe "/virtdir/?dit=eenquerystring" test.exe "/virtdir?dit=eenquerystring" test.exe "/?dit=eenquerystring" test.exe "/" test.exe "/virtdir/?dit=eenquerystring" test.exe "/virtdir?dit=eenquerystring" |
Het probleem
Als alles goed zou werken, zou dit de correcte output van m'n batchbestand moeten zijn:
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
| ===================================== URLBuffer: /virtdir/home/test VDName: virtdir ===================================== URLBuffer: /virtdir/home/test/ VDName: virtdir ===================================== URLBuffer: /virtdir/ VDName: virtdir ===================================== URLBuffer: /virtdir VDName: virtdir ===================================== URLBuffer: /virtdir/?dit=eenquerystring VDName: virtdir ===================================== URLBuffer: /virtdir?dit=eenquerystring VDName: virtdir ===================================== URLBuffer: /?dit=eenquerystring VDName: VD_EMPTY ===================================== URLBuffer: /virtdir/?dit=eenquerystring VDName: virtdir ===================================== URLBuffer: /virtdir?dit=eenquerystring VDName: virtdir ===================================== URLBuffer: /?dit=eenquerystring VDName: VD_EMPTY ===================================== URLBuffer: / VDName: VD_EMPTY ===================================== URLBuffer: /virtdir/?dit=eenquerystring VDName: virtdir ===================================== URLBuffer: /virtdir?dit=eenquerystring VDName: virtdir |
Maar ik krijg dit:
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
| ===================================== URLBuffer: /virtdir/home/test VDName: =☺tirtdir ===================================== URLBuffer: /virtdir/home/test/ VDName: =t= ===================================== URLBuffer: /virtdir/ VDName: ☻virtdir¢Ÿ ===================================== URLBuffer: /virtdir VDName: virtdir ===================================== URLBuffer: /virtdir/?dit=eenquerystring VDName: ☻virtdir¢Ÿ ===================================== URLBuffer: /virtdir?dit=eenquerystring VDName: ☻virtdir☻ ===================================== URLBuffer: /?dit=eenquerystring VDName: =☺= ===================================== URLBuffer: /virtdir/?dit=eenquerystring VDName: ☻virtdir¢Ÿ ===================================== URLBuffer: /virtdir?dit=eenquerystring VDName: ☻virtdir☻ ===================================== URLBuffer: /?dit=eenquerystring VDName: =☺= ===================================== URLBuffer: / VDName: VD_EMPTY ===================================== URLBuffer: /virtdir/?dit=eenquerystring VDName: ☻virtdir¢Ÿ ===================================== URLBuffer: /virtdir?dit=eenquerystring VDName: ☻virtdir☻ |
Het valt op dat bij sommige URLs, VDName vreemde tekens erbij heeft gekregen. (=☻, ☺, ¢Ÿ, etc)
Hier wordt het niet goed weergegeven ivm HTML etc. maar de tekens die ik bedoel zijn dingen in het begin van de ASCII set, zoals een hartje, een smiley, etc)
Ik vermoed dat dat te maken heeft met een verkeerd gebruik van pointers (ik ben nog steeds newbie).
Ik heb gelezen dat dat soms 'garbage' kan opleveren of dat het gevaarlijk is, etc.
Ik zit al weken vast, dus misschien dat hier iemand me kan helpen.
Alvast bedankt
Extra Info
Compiler: g++ voor Windows
(Microsoft VC++ werkt hier helemaal niet)