65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
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
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
OFCharacterSet *_characterSet;
bool (*_characterIsMember)(id, SEL, of_unichar_t);
}
- (instancetype)of_initWithCharacterSet: (OFCharacterSet *)characterSet
OF_METHOD_FAMILY(init);
@end
bool
of_url_is_ipv6_host(OFString *host)
{
const char *UTF8String = host.UTF8String;
bool hasColon = false;
while (*UTF8String != '\0') {
if (!of_ascii_isdigit(*UTF8String) && *UTF8String != ':' &&
(*UTF8String < 'a' || *UTF8String > 'f') &&
(*UTF8String < 'A' || *UTF8String > 'F'))
return false;
if (*UTF8String == ':')
hasColon = true;
UTF8String++;
}
return hasColon;
}
@implementation OFURLAllowedCharacterSetBase
- (instancetype)init
{
OF_INVALID_INIT_METHOD
}
|
827
828
829
830
831
832
833
834
835
836
837
838
839
840
|
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
|
+
+
+
+
+
+
+
+
+
+
+
|
- (OFString *)URLEncodedScheme
{
return _URLEncodedScheme;
}
- (OFString *)host
{
if ([_URLEncodedHost hasPrefix: @"["] &&
[_URLEncodedHost hasSuffix: @"]"]) {
OFString *host = [_URLEncodedHost substringWithRange:
of_range(1, _URLEncodedHost.length - 2)];
if (!of_url_is_ipv6_host(host))
@throw [OFInvalidArgumentException exception];
return host;
}
return _URLEncodedHost.stringByURLDecoding;
}
- (OFString *)URLEncodedHost
{
return _URLEncodedHost;
}
|