Merge pull request #62 from gnustep/NSURLComponents_branch

NSURLComponents branch
This commit is contained in:
Gregory Casamento 2019-08-06 10:11:37 -04:00 committed by GitHub
commit 4a4da681dc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 604 additions and 4 deletions

View file

@ -27,6 +27,7 @@
#import <GNUstepBase/GSVersionMacros.h>
#import <Foundation/NSURLHandle.h>
#import <Foundation/NSRange.h>
#if defined(__cplusplus)
extern "C" {
@ -36,6 +37,9 @@ extern "C" {
@class NSError;
@class NSNumber;
@class NSString;
@class NSDictionary;
@class NSArray;
/**
* URL scheme constant for use with [NSURL-initWithScheme:host:path:].
@ -583,13 +587,143 @@ GS_EXPORT NSString* const NSURLUbiquitousItemDownloadingStatusCurrent;
#endif /* GS_API_MACOSX */
#if defined(__cplusplus)
}
#endif
#if !NO_GNUSTEP && !defined(GNUSTEP_BASE_INTERNAL)
#import <GNUstepBase/NSURL+GNUstepBase.h>
#endif
#if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST)
@interface NSURLQueryItem : NSObject <NSCopying, NSCoding>
{
#if GS_EXPOSE(NSURLQueryItem)
#endif
#if GS_NONFRAGILE
# if defined(GS_NSURLQueryItem_IVARS)
@public
GS_NSURLQueryItem_IVARS;
# endif
#else
/* Pointer to private additional data used to avoid breaking ABI
* when we don't have the non-fragile ABI available.
* Use this mechanism rather than changing the instance variable
* layout (see Source/GSInternal.h for details).
*/
@private id _internal GS_UNUSED_IVAR;
#endif
}
// Creating query items.
+ (instancetype)queryItemWithName:(NSString *)name
value:(NSString *)value;
- (instancetype)initWithName:(NSString *)name
value:(NSString *)value;
// Reading a name and value from a query
- (NSString *) name;
- (NSString *) value;
@end
#endif // OS_API_VERSION
#if OS_API_VERSION(MAC_OS_X_VERSION_10_9, GS_API_LATEST)
@interface NSURLComponents : NSObject <NSCopying>
{
#if GS_EXPOSE(NSURLComponents)
#endif
#if GS_NONFRAGILE
# if defined(GS_NSURLComponents_IVARS)
@public
GS_NSURLComponents_IVARS;
# endif
#else
/* Pointer to private additional data used to avoid breaking ABI
* when we don't have the non-fragile ABI available.
* Use this mechanism rather than changing the instance variable
* layout (see Source/GSInternal.h for details).
*/
@private id _internal GS_UNUSED_IVAR;
#endif
}
// Creating URL components...
+ (instancetype) componentsWithString:(NSString *)URLString;
+ (instancetype) componentsWithURL:(NSURL *)url
resolvingAgainstBaseURL:(BOOL)resolve;
- (instancetype) init;
- (instancetype)initWithString:(NSString *)URLString;
- (instancetype)initWithURL:(NSURL *)url
resolvingAgainstBaseURL:(BOOL)resolve;
// Getting the URL
- (NSString *) string;
- (void) setString: (NSString *)urlString;
- (NSURL *) URL;
- (void) setURL: (NSURL *)url;
- (NSURL *)URLRelativeToURL: (NSURL *)baseURL;
// Accessing Components in Native Format
- (NSString *) fragment;
- (void) setFragment: (NSString *)fragment;
- (NSString *) host;
- (void) setHost: (NSString *)host;
- (NSString *) password;
- (void) setPassword: (NSString *)password;
- (NSString *) path;
- (void) setPath: (NSString *)path;
- (NSNumber *) port;
- (void) setPort: (NSNumber *)port;
- (NSString *) query;
- (void) setQuery: (NSString *)query;
#if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST)
- (NSArray *) queryItems;
- (void) setQueryItems: (NSArray *)queryItems;
#endif
- (NSString *) scheme;
- (void) setScheme: (NSString *)scheme;
- (NSString *) user;
- (void) setUser: (NSString *)user;
// Accessing Components in PercentEncoded Format
- (NSString *) percentEncodedFragment;
- (void) setPercentEncodedFragment: (NSString *)fragment;
- (NSString *) percentEncodedHost;
- (void) setPercentEncodedHost: (NSString *)host;
- (NSString *) percentEncodedPassword;
- (void) setPercentEncodedPassword: (NSString *)password;
- (NSString *) percentEncodedPath;
- (void) setPercentEncodedPath: (NSString *)path;
- (NSString *) percentEncodedQuery;
- (void) setPercentEncodedQuery: (NSString *)query;
#if OS_API_VERSION(MAC_OS_X_VERSION_10_10, GS_API_LATEST)
- (NSArray *) percentEncodedQueryItems;
- (void) setPercentEncodedQueryItems: (NSArray *)queryItems;
#endif
- (NSString *) percentEncodedScheme;
- (void) setPercentEncodedScheme: (NSString *)scheme;
- (NSString *) percentEncodedUser;
- (void) setPercentEncodedUser: (NSString *)user;
// Locating components of the URL string representation
- (NSRange) rangeOfFragment;
- (NSRange) rangeOfHost;
- (NSRange) rangeOfPassword;
- (NSRange) rangeOfPath;
- (NSRange) rangeOfPort;
- (NSRange) rangeOfQuery;
- (NSRange) rangeOfScheme;
- (NSRange) rangeOfUser;
@end
#if defined(__cplusplus)
}
#endif
#endif /* GS_API_MACOSX */
#endif /* __NSURL_h_GNUSTEP_BASE_INCLUDE */

View file

@ -36,6 +36,41 @@ function may be incorrect
* I've put 2 functions to make tests. You can add your own tests
* Some functions are not implemented
*/
#define GS_NSURLQueryItem_IVARS \
NSString *_name; \
NSString *_value;
#define GS_NSURLComponents_IVARS \
NSURL *_url; \
NSString *_fragment; \
NSString *_host; \
NSString *_password; \
NSString *_path; \
NSNumber *_port; \
NSString *_query; \
NSArray *_queryItems; \
NSString *_scheme; \
NSString *_user; \
NSString *_percentEncodedFragment; \
NSString *_percentEncodedHost; \
NSString *_percentEncodedPassword; \
NSString *_percentEncodedPath; \
NSNumber *_percentEncodedPort; \
NSString *_percentEncodedQuery; \
NSArray *_percentEncodedQueryItems; \
NSString *_percentEncodedScheme; \
NSString *_percentEncodedUser; \
NSRange _rangeOfFragment; \
NSRange _rangeOfHost; \
NSRange _rangeOfPassword; \
NSRange _rangeOfPath; \
NSRange _rangeOfPort; \
NSRange _rangeOfQuery; \
NSRange _rangeOfQueryItems; \
NSRange _rangeOfScheme; \
NSRange _rangeOfUser;
#import "common.h"
#define EXPOSE_NSURL_IVARS 1
#import "Foundation/NSArray.h"
@ -52,9 +87,14 @@ function may be incorrect
#import "Foundation/NSURL.h"
#import "Foundation/NSURLHandle.h"
#import "Foundation/NSValue.h"
#import "Foundation/NSCharacterSet.h"
#import "Foundation/NSString.h"
#import "GNUstepBase/NSURL+GNUstepBase.h"
#define GSInternal NSURLComponentsInternal
#include "GSInternal.h"
GS_PRIVATE_INTERNAL(NSURLComponents)
NSString * const NSURLErrorDomain = @"NSURLErrorDomain";
NSString * const NSErrorFailingURLStringKey = @"NSErrorFailingURLStringKey";
@ -2133,3 +2173,429 @@ static NSUInteger urlAlign;
}
@end
@implementation NSURLQueryItem
// Creating query items.
+ (instancetype)queryItemWithName:(NSString *)name
value:(NSString *)value
{
return nil;
}
- (instancetype)initWithName:(NSString *)name
value:(NSString *)value
{
return nil;
}
// Reading a name and value from a query
- (NSString *) name
{
return nil;
}
- (NSString *) value
{
return nil;
}
- (id) initWithCoder: (NSCoder *)acoder
{
return nil;
}
- (void) encodeWithCoder: (NSCoder *)acoder
{
}
- (id) copyWithZone: (NSZone *)zone
{
return nil;
}
@end
@implementation NSURLComponents
// Creating URL components...
+ (instancetype) componentsWithString:(NSString *)urlString
{
return [[NSURLComponents alloc] initWithString: urlString];
}
+ (instancetype) componentsWithURL:(NSURL *)url
resolvingAgainstBaseURL:(BOOL)resolve
{
return [[NSURLComponents alloc] initWithURL: url
resolvingAgainstBaseURL: resolve];
}
- (instancetype) init
{
self = [super init];
if (self != nil)
{
GS_CREATE_INTERNAL(NSURLComponents);
}
return self;
}
- (instancetype)initWithString:(NSString *)URLString
{
self = [self init];
if (self != nil)
{
[self setString: URLString];
}
return self;
}
- (instancetype)initWithURL:(NSURL *)url
resolvingAgainstBaseURL:(BOOL)resolve
{
NSURL *tempURL = url;
self = [self init];
if (self != nil)
{
if (resolve)
{
tempURL = [url absoluteURL];
}
[self setURL: tempURL];
}
return self;
}
- (void) dealloc
{
RELEASE(internal->_url);
RELEASE(internal->_fragment);
RELEASE(internal->_host);
RELEASE(internal->_password);
RELEASE(internal->_path);
RELEASE(internal->_port);
RELEASE(internal->_query);
RELEASE(internal->_queryItems);
RELEASE(internal->_scheme);
RELEASE(internal->_user);
RELEASE(internal->_percentEncodedFragment);
RELEASE(internal->_percentEncodedHost);
RELEASE(internal->_percentEncodedPassword);
RELEASE(internal->_percentEncodedPath);
RELEASE(internal->_percentEncodedPort);
RELEASE(internal->_percentEncodedQuery);
RELEASE(internal->_percentEncodedQueryItems);
RELEASE(internal->_percentEncodedScheme);
RELEASE(internal->_percentEncodedUser);
[super dealloc];
}
- (id) copyWithZone: (NSZone *)zone
{
return [[NSURLComponents allocWithZone: zone] initWithURL: [self URL]
resolvingAgainstBaseURL: NO];
}
// Getting the URL
- (NSString *) string
{
return [internal->_url absoluteString];
}
- (void) setString: (NSString *)urlString
{
NSURL *url = [NSURL URLWithString: urlString];
[self setURL: url];
}
- (NSURL *) URL
{
return internal->_url;
}
- (void) setURL: (NSURL *)url
{
ASSIGN(internal->_url, url);
// components...
[self setFragment: [url fragment]];
[self setHost: [url host]];
[self setPassword: [url password]];
[self setPath: [url path]];
[self setPort: [url port]];
[self setQuery: [url query]];
[self setScheme: [url scheme]];
[self setUser: [url user]];
// Percent encoded portions...
[self setPercentEncodedFragment:
[[url fragment] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLFragmentAllowedCharacterSet]]];
[self setPercentEncodedHost:
[[url host] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLHostAllowedCharacterSet]]];
[self setPercentEncodedPassword:
[[url password] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLPasswordAllowedCharacterSet]]];;
[self setPercentEncodedPath:
[[url path] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLPathAllowedCharacterSet]]];
[self setPercentEncodedQuery:
[[url query] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLQueryAllowedCharacterSet]]];
[self setPercentEncodedScheme:
[[url scheme] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLPathAllowedCharacterSet]]];
[self setPercentEncodedUser:
[[url user] stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLUserAllowedCharacterSet]]];
// Find ranges
internal->_rangeOfFragment = [[url absoluteString] rangeOfString: internal->_fragment];
internal->_rangeOfHost = [[url absoluteString] rangeOfString: internal->_host];
internal->_rangeOfPassword = [[url absoluteString] rangeOfString: internal->_password];
internal->_rangeOfPath = [[url absoluteString] rangeOfString: internal->_path];
internal->_rangeOfPort = [[url absoluteString] rangeOfString: [internal->_port stringValue]];
internal->_rangeOfQuery = [[url absoluteString] rangeOfString: internal->_query];
internal->_rangeOfScheme = [[url absoluteString] rangeOfString: internal->_scheme];
internal->_rangeOfUser = [[url absoluteString] rangeOfString: internal->_user];
}
- (NSURL *)URLRelativeToURL: (NSURL *)baseURL
{
return nil;
}
// Accessing Components in Native Format
- (NSString *) fragment
{
return internal->_fragment;
}
- (void) setFragment: (NSString *)fragment
{
ASSIGN(internal->_fragment, fragment);
}
- (NSString *) host
{
return internal->_host;
}
- (void) setHost: (NSString *)host
{
ASSIGN(internal->_host, host);
}
- (NSString *) password
{
return internal->_password;
}
- (void) setPassword: (NSString *)password
{
ASSIGN(internal->_password, password);
}
- (NSString *) path
{
return internal->_path;
}
- (void) setPath: (NSString *)path
{
ASSIGN(internal->_path, path);
}
- (NSNumber *) port
{
return internal->_port;
}
- (void) setPort: (NSNumber *)port
{
ASSIGN(internal->_port, port);
}
- (NSString *) query
{
return internal->_query;
}
- (void) setQuery: (NSString *)query
{
ASSIGN(internal->_query, query);
if (query != nil)
{
NSMutableArray *result = [NSMutableArray arrayWithCapacity: 5];
NSArray *items = [query componentsSeparatedByString: @"&"];
NSEnumerator *en = [items objectEnumerator];
id item = nil;
while ((item = [en nextObject]) != nil)
{
NSArray *query = [item componentsSeparatedByString: @"="];
NSString *name = [query objectAtIndex: 0];
NSString *value = [query objectAtIndex: 1];
NSURLQueryItem *qitem = [NSURLQueryItem queryItemWithName: name
value: value];
[result addObject: qitem];
}
[self setQueryItems: result];
}
}
- (NSArray *) queryItems
{
return internal->_queryItems;
}
- (void) setQueryItems: (NSArray *)queryItems
{
ASSIGN(internal->_queryItems, queryItems);
}
- (NSString *) scheme
{
return internal->_scheme;
}
- (void) setScheme: (NSString *)scheme
{
ASSIGN(internal->_scheme, scheme);
}
- (NSString *) user
{
return internal->_user;
}
- (void) setUser: (NSString *)user
{
ASSIGN(internal->_user, user);
}
// Accessing Components in PercentEncoded Format
- (NSString *) percentEncodedFragment
{
return internal->_percentEncodedFragment;
}
- (void) setPercentEncodedFragment: (NSString *)fragment
{
ASSIGN(internal->_percentEncodedFragment, fragment);
}
- (NSString *) percentEncodedHost
{
return internal->_percentEncodedHost;
}
- (void) setPercentEncodedHost: (NSString *)host
{
ASSIGN(internal->_percentEncodedHost, host);
}
- (NSString *) percentEncodedPassword
{
return internal->_percentEncodedPassword;
}
- (void) setPercentEncodedPassword: (NSString *)password
{
ASSIGN(internal->_percentEncodedPassword, password);
}
- (NSString *) percentEncodedPath
{
return internal->_percentEncodedPath;
}
- (void) setPercentEncodedPath: (NSString *)path
{
ASSIGN(internal->_percentEncodedPath, path);
}
- (NSString *) percentEncodedQuery
{
return internal->_percentEncodedQuery;
}
- (void) setPercentEncodedQuery: (NSString *)query
{
ASSIGN(internal->_percentEncodedQuery, query);
}
- (NSArray *) percentEncodedQueryItems
{
return internal->_percentEncodedQueryItems;
}
- (void) setPercentEncodedQueryItems: (NSArray *)queryItems
{
ASSIGN(internal->_percentEncodedQueryItems, queryItems);
}
- (NSString *) percentEncodedScheme
{
return internal->_percentEncodedScheme;
}
- (void) setPercentEncodedScheme: (NSString *)scheme
{
ASSIGN(internal->_percentEncodedScheme, scheme);
}
- (NSString *) percentEncodedUser
{
return internal->_percentEncodedUser;;
}
- (void) setPercentEncodedUser: (NSString *)user
{
ASSIGN(internal->_percentEncodedUser, user);
}
// Locating components of the URL string representation
- (NSRange) rangeOfFragment
{
return internal->_rangeOfFragment;
}
- (NSRange) rangeOfHost
{
return internal->_rangeOfHost;
}
- (NSRange) rangeOfPassword
{
return internal->_rangeOfPassword;
}
- (NSRange) rangeOfPath
{
return internal->_rangeOfPath;
}
- (NSRange) rangeOfPort
{
return internal->_rangeOfPort;
}
- (NSRange) rangeOfQuery
{
return internal->_rangeOfQuery;
}
- (NSRange) rangeOfScheme
{
return internal->_rangeOfScheme;
}
- (NSRange) rangeOfUser
{
return internal->_rangeOfUser;
}
@end