1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef nsURLParsers_h__
7 #define nsURLParsers_h__
8 
9 #include "nsIURLParser.h"
10 #include "mozilla/Attributes.h"
11 
12 //----------------------------------------------------------------------------
13 // base class for url parsers
14 //----------------------------------------------------------------------------
15 
16 class nsBaseURLParser : public nsIURLParser {
17  public:
18   NS_DECL_NSIURLPARSER
19 
20   nsBaseURLParser() = default;
21 
22  protected:
23   // implemented by subclasses
24   virtual void ParseAfterScheme(const char* spec, int32_t specLen,
25                                 uint32_t* authPos, int32_t* authLen,
26                                 uint32_t* pathPos, int32_t* pathLen) = 0;
27 };
28 
29 //----------------------------------------------------------------------------
30 // an url parser for urls that do not have an authority section
31 //
32 // eg. file:foo/bar.txt
33 //     file:/foo/bar.txt      (treated equivalently)
34 //     file:///foo/bar.txt
35 //
36 // eg. file:////foo/bar.txt   (UNC-filepath = \\foo\bar.txt)
37 //
38 // XXX except in this case:
39 //     file://foo/bar.txt     (the authority "foo"  is ignored)
40 //----------------------------------------------------------------------------
41 
42 class nsNoAuthURLParser final : public nsBaseURLParser {
43   ~nsNoAuthURLParser() = default;
44 
45  public:
46   NS_DECL_THREADSAFE_ISUPPORTS
47 
48 #if defined(XP_WIN)
49   NS_IMETHOD ParseFilePath(const char*, int32_t, uint32_t*, int32_t*, uint32_t*,
50                            int32_t*, uint32_t*, int32_t*) override;
51 #endif
52 
53   NS_IMETHOD ParseAuthority(const char* auth, int32_t authLen,
54                             uint32_t* usernamePos, int32_t* usernameLen,
55                             uint32_t* passwordPos, int32_t* passwordLen,
56                             uint32_t* hostnamePos, int32_t* hostnameLen,
57                             int32_t* port) override;
58 
59   void ParseAfterScheme(const char* spec, int32_t specLen, uint32_t* authPos,
60                         int32_t* authLen, uint32_t* pathPos,
61                         int32_t* pathLen) override;
62 };
63 
64 //----------------------------------------------------------------------------
65 // an url parser for urls that must have an authority section
66 //
67 // eg. http:www.foo.com/bar.html
68 //     http:/www.foo.com/bar.html
69 //     http://www.foo.com/bar.html    (treated equivalently)
70 //     http:///www.foo.com/bar.html
71 //----------------------------------------------------------------------------
72 
73 class nsAuthURLParser : public nsBaseURLParser {
74  protected:
75   virtual ~nsAuthURLParser() = default;
76 
77  public:
78   NS_DECL_THREADSAFE_ISUPPORTS
79 
80   NS_IMETHOD ParseAuthority(const char* auth, int32_t authLen,
81                             uint32_t* usernamePos, int32_t* usernameLen,
82                             uint32_t* passwordPos, int32_t* passwordLen,
83                             uint32_t* hostnamePos, int32_t* hostnameLen,
84                             int32_t* port) override;
85 
86   NS_IMETHOD ParseUserInfo(const char* userinfo, int32_t userinfoLen,
87                            uint32_t* usernamePos, int32_t* usernameLen,
88                            uint32_t* passwordPos,
89                            int32_t* passwordLen) override;
90 
91   NS_IMETHOD ParseServerInfo(const char* serverinfo, int32_t serverinfoLen,
92                              uint32_t* hostnamePos, int32_t* hostnameLen,
93                              int32_t* port) override;
94 
95   void ParseAfterScheme(const char* spec, int32_t specLen, uint32_t* authPos,
96                         int32_t* authLen, uint32_t* pathPos,
97                         int32_t* pathLen) override;
98 };
99 
100 //----------------------------------------------------------------------------
101 // an url parser for urls that may or may not have an authority section
102 //
103 // eg. http:www.foo.com              (www.foo.com is authority)
104 //     http:www.foo.com/bar.html     (www.foo.com is authority)
105 //     http:/www.foo.com/bar.html    (www.foo.com is part of file path)
106 //     http://www.foo.com/bar.html   (www.foo.com is authority)
107 //     http:///www.foo.com/bar.html  (www.foo.com is part of file path)
108 //----------------------------------------------------------------------------
109 
110 class nsStdURLParser : public nsAuthURLParser {
111   virtual ~nsStdURLParser() = default;
112 
113  public:
114   void ParseAfterScheme(const char* spec, int32_t specLen, uint32_t* authPos,
115                         int32_t* authLen, uint32_t* pathPos,
116                         int32_t* pathLen) override;
117 };
118 
119 #endif  // nsURLParsers_h__
120