1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*
- * Copyright 2012 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- #import "ZXResultParser.h"
- #import "ZXURIParsedResult.h"
-
- static NSRegularExpression *ZX_USER_IN_HOST = nil;
-
- @implementation ZXURIParsedResult
-
- + (void)initialize {
- if ([self class] != [ZXURIParsedResult class]) return;
-
- ZX_USER_IN_HOST = [[NSRegularExpression alloc] initWithPattern:@":/*([^/@]+)@[^/]+" options:0 error:nil];
- }
-
- - (id)initWithUri:(NSString *)uri title:(NSString *)title {
- if (self = [super initWithType:kParsedResultTypeURI]) {
- _uri = [self massageURI:uri];
- _title = title;
- }
-
- return self;
- }
-
- + (id)uriParsedResultWithUri:(NSString *)uri title:(NSString *)title {
- return [[self alloc] initWithUri:uri title:title];
- }
-
- - (BOOL)possiblyMaliciousURI {
- return [ZX_USER_IN_HOST numberOfMatchesInString:self.uri options:0 range:NSMakeRange(0, self.uri.length)] > 0;
- }
-
- - (NSString *)displayResult {
- NSMutableString *result = [NSMutableString stringWithCapacity:30];
- [ZXParsedResult maybeAppend:self.title result:result];
- [ZXParsedResult maybeAppend:self.uri result:result];
- return result;
- }
-
- /**
- * Transforms a string that represents a URI into something more proper, by adding or canonicalizing
- * the protocol.
- */
- - (NSString *)massageURI:(NSString *)uri {
- NSString *massagedUri = [uri stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
- NSUInteger protocolEnd = [massagedUri rangeOfString:@":"].location;
- if (protocolEnd == NSNotFound) {
- // No protocol, assume http
- massagedUri = [NSString stringWithFormat:@"http://%@", massagedUri];
- } else if ([self isColonFollowedByPortNumber:massagedUri protocolEnd:(int)protocolEnd]) {
- // Found a colon, but it looks like it is after the host, so the protocol is still missing
- massagedUri = [NSString stringWithFormat:@"http://%@", massagedUri];
- }
- return massagedUri;
- }
-
- - (BOOL)isColonFollowedByPortNumber:(NSString *)uri protocolEnd:(int)protocolEnd {
- int start = protocolEnd + 1;
- NSUInteger nextSlash = [uri rangeOfString:@"/" options:0 range:NSMakeRange(start, [uri length] - start)].location;
- if (nextSlash == NSNotFound) {
- nextSlash = [uri length];
- }
- return [ZXResultParser isSubstringOfDigits:uri offset:start length:(int)nextSlash - start];
- }
-
- @end
|