]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/anyp/UriScheme.cc
2 * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 23 URL Scheme parsing */
12 #include "anyp/UriScheme.h"
14 AnyP::UriScheme::LowercaseSchemeNames
AnyP::UriScheme::LowercaseSchemeNames_
;
16 AnyP::UriScheme::UriScheme(AnyP::ProtocolType
const aScheme
, const char *img
) :
19 // RFC 3986 section 3.1: schemes are case-insensitive.
21 // To improve diagnostic, remember exactly how an unsupported scheme looks like.
22 // XXX: Object users may rely on toLower() canonicalization that we refuse to provide.
23 if (img
&& theScheme_
== AnyP::PROTO_UNKNOWN
)
26 // XXX: A broken caller supplies an image of an absent scheme?
27 // XXX: We assume that the caller is using a lower-case image.
28 else if (img
&& theScheme_
== AnyP::PROTO_NONE
)
31 else if (theScheme_
> AnyP::PROTO_NONE
&& theScheme_
< AnyP::PROTO_MAX
)
32 image_
= LowercaseSchemeNames_
.at(theScheme_
);
33 // else, the image remains empty (e.g., "://example.com/")
34 // hopefully, theScheme_ is PROTO_NONE here
38 AnyP::UriScheme::Init()
40 if (LowercaseSchemeNames_
.empty()) {
41 LowercaseSchemeNames_
.reserve(sizeof(SBuf
) * AnyP::PROTO_MAX
);
42 // TODO: use base/EnumIterator.h if possible
43 for (int i
= AnyP::PROTO_NONE
; i
< AnyP::PROTO_MAX
; ++i
) {
44 SBuf
image(ProtocolType_str
[i
]);
46 LowercaseSchemeNames_
.emplace_back(image
);
51 const AnyP::ProtocolType
52 AnyP::UriScheme::FindProtocolType(const SBuf
&scheme
)
55 return AnyP::PROTO_NONE
;
61 // TODO: use base/EnumIterator.h if possible
62 for (int i
= AnyP::PROTO_NONE
+ 1; i
< AnyP::PROTO_UNKNOWN
; ++i
) {
63 if (LowercaseSchemeNames_
.at(i
) == img
)
64 return AnyP::ProtocolType(i
);
67 return AnyP::PROTO_UNKNOWN
;
71 AnyP::UriScheme::defaultPort() const
75 case AnyP::PROTO_HTTP
:
78 case AnyP::PROTO_HTTPS
:
84 case AnyP::PROTO_COAP
:
85 case AnyP::PROTO_COAPS
:
86 // coaps:// default is TBA as of draft-ietf-core-coap-08.
87 // Assuming IANA policy of allocating same port for base and TLS protocol versions will occur.
90 case AnyP::PROTO_GOPHER
:
93 case AnyP::PROTO_WAIS
:
96 case AnyP::PROTO_CACHE_OBJECT
:
97 return CACHE_HTTP_PORT
;
99 case AnyP::PROTO_WHOIS
: