forked from mozilla/gecko-dev
-
Notifications
You must be signed in to change notification settings - Fork 2
/
TestURLParser.cpp
135 lines (115 loc) · 3.64 KB
/
TestURLParser.cpp
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "TestCommon.h"
#include <stdio.h>
#include "nsIURLParser.h"
#include "nsCOMPtr.h"
#include "nsIServiceManager.h"
#include "nsNetCID.h"
#include "nsServiceManagerUtils.h"
static void
print_field(const char *label, char *str, PRInt32 len)
{
char c = str[len];
str[len] = '\0';
printf("[%s=%s]\n", label, str);
str[len] = c;
}
#define PRINT_FIELD(x) \
print_field(# x, x, x ## Len)
#define PRINT_SUBFIELD(base, x) \
PR_BEGIN_MACRO \
if (x ## Len != -1) \
print_field(# x, base + x ## Pos, x ## Len); \
PR_END_MACRO
static void
parse_authority(nsIURLParser *urlParser, char *auth, PRInt32 authLen)
{
PRINT_FIELD(auth);
PRUint32 usernamePos, passwordPos;
PRInt32 usernameLen, passwordLen;
PRUint32 hostnamePos;
PRInt32 hostnameLen, port;
urlParser->ParseAuthority(auth, authLen,
&usernamePos, &usernameLen,
&passwordPos, &passwordLen,
&hostnamePos, &hostnameLen,
&port);
PRINT_SUBFIELD(auth, username);
PRINT_SUBFIELD(auth, password);
PRINT_SUBFIELD(auth, hostname);
if (port != -1)
printf("[port=%d]\n", port);
}
static void
parse_file_path(nsIURLParser *urlParser, char *filepath, PRInt32 filepathLen)
{
PRINT_FIELD(filepath);
PRUint32 dirPos, basePos, extPos;
PRInt32 dirLen, baseLen, extLen;
urlParser->ParseFilePath(filepath, filepathLen,
&dirPos, &dirLen,
&basePos, &baseLen,
&extPos, &extLen);
PRINT_SUBFIELD(filepath, dir);
PRINT_SUBFIELD(filepath, base);
PRINT_SUBFIELD(filepath, ext);
}
static void
parse_path(nsIURLParser *urlParser, char *path, PRInt32 pathLen)
{
PRINT_FIELD(path);
PRUint32 filePos, queryPos, refPos;
PRInt32 fileLen, queryLen, refLen;
urlParser->ParsePath(path, pathLen,
&filePos, &fileLen,
&queryPos, &queryLen,
&refPos, &refLen);
if (fileLen != -1)
parse_file_path(urlParser, path + filePos, fileLen);
PRINT_SUBFIELD(path, query);
PRINT_SUBFIELD(path, ref);
}
int
main(int argc, char **argv)
{
if (test_common_init(&argc, &argv) != 0)
return -1;
if (argc < 2) {
printf("usage: TestURLParser [-std|-noauth|-auth] <url>\n");
return -1;
}
nsCOMPtr<nsIURLParser> urlParser;
if (strcmp(argv[1], "-noauth") == 0) {
urlParser = do_GetService(NS_NOAUTHURLPARSER_CONTRACTID);
argv[1] = argv[2];
}
else if (strcmp(argv[1], "-auth") == 0) {
urlParser = do_GetService(NS_AUTHURLPARSER_CONTRACTID);
argv[1] = argv[2];
}
else {
urlParser = do_GetService(NS_STDURLPARSER_CONTRACTID);
if (strcmp(argv[1], "-std") == 0)
argv[1] = argv[2];
else
printf("assuming -std\n");
}
if (urlParser) {
printf("have urlParser @%p\n", static_cast<void*>(urlParser.get()));
char *spec = argv[1];
PRUint32 schemePos, authPos, pathPos;
PRInt32 schemeLen, authLen, pathLen;
urlParser->ParseURL(spec, -1,
&schemePos, &schemeLen,
&authPos, &authLen,
&pathPos, &pathLen);
if (schemeLen != -1)
PRINT_SUBFIELD(spec, scheme);
if (authLen != -1)
parse_authority(urlParser, spec + authPos, authLen);
if (pathLen != -1)
parse_path(urlParser, spec + pathPos, pathLen);
}
else
printf("no urlParser\n");
return 0;
}