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, int32_t 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, int32_t authLen)
{
PRINT_FIELD(auth);
uint32_t usernamePos, passwordPos;
int32_t usernameLen, passwordLen;
uint32_t hostnamePos;
int32_t 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, int32_t filepathLen)
{
PRINT_FIELD(filepath);
uint32_t dirPos, basePos, extPos;
int32_t 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, int32_t pathLen)
{
PRINT_FIELD(path);
uint32_t filePos, queryPos, refPos;
int32_t 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];
uint32_t schemePos, authPos, pathPos;
int32_t 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;
}
|