mirror of
https://github.com/swisspol/GCDWebServer.git
synced 2026-02-11 00:00:07 +08:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
894eacd517 | ||
|
|
7a54bcbae5 | ||
|
|
a28ac82ba2 | ||
|
|
c062d9d6d3 | ||
|
|
bb32a721b6 | ||
|
|
1b6e4f6491 | ||
|
|
7b51023373 | ||
|
|
f21c6ab667 | ||
|
|
0dd6d8c5fc | ||
|
|
d58b2122ed |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
xcuserdata
|
xcuserdata
|
||||||
project.xcworkspace
|
project.xcworkspace
|
||||||
|
|
||||||
|
Tests/Payload
|
||||||
|
|||||||
@@ -51,6 +51,10 @@ NSString* GCDWebServerEscapeURLString(NSString* string);
|
|||||||
NSString* GCDWebServerUnescapeURLString(NSString* string);
|
NSString* GCDWebServerUnescapeURLString(NSString* string);
|
||||||
NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form);
|
NSDictionary* GCDWebServerParseURLEncodedForm(NSString* form);
|
||||||
NSString* GCDWebServerGetPrimaryIPv4Address(); // Returns IPv4 address of primary connected service on OS X or of WiFi interface on iOS if connected
|
NSString* GCDWebServerGetPrimaryIPv4Address(); // Returns IPv4 address of primary connected service on OS X or of WiFi interface on iOS if connected
|
||||||
|
NSString* GCDWebServerFormatRFC822(NSDate* date);
|
||||||
|
NSDate* GCDWebServerParseRFC822(NSString* string);
|
||||||
|
NSString* GCDWebServerFormatISO8601(NSDate* date);
|
||||||
|
NSDate* GCDWebServerParseISO8601(NSString* string);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
@@ -79,8 +83,12 @@ NSString* GCDWebServerGetPrimaryIPv4Address(); // Returns IPv4 address of prima
|
|||||||
@property(nonatomic, readonly) NSURL* serverURL; // Only non-nil if server is running
|
@property(nonatomic, readonly) NSURL* serverURL; // Only non-nil if server is running
|
||||||
@property(nonatomic, readonly) NSURL* bonjourServerURL; // Only non-nil if server is running and Bonjour registration is active
|
@property(nonatomic, readonly) NSURL* bonjourServerURL; // Only non-nil if server is running and Bonjour registration is active
|
||||||
#if !TARGET_OS_IPHONE
|
#if !TARGET_OS_IPHONE
|
||||||
|
@property(nonatomic, getter=isRecordingEnabled) BOOL recordingEnabled; // Creates files in the current directory containing the raw data for all requests and responses (directory most NOT contain prior recordings)
|
||||||
- (BOOL)runWithPort:(NSUInteger)port; // Starts then automatically stops on SIGINT i.e. Ctrl-C (use on main thread only)
|
- (BOOL)runWithPort:(NSUInteger)port; // Starts then automatically stops on SIGINT i.e. Ctrl-C (use on main thread only)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
|
||||||
|
- (NSInteger)runTestsInDirectory:(NSString*)path withPort:(NSUInteger)port; // Returns number of failed tests or -1 if server failed to start
|
||||||
|
#endif
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface GCDWebServer (Handlers)
|
@interface GCDWebServer (Handlers)
|
||||||
|
|||||||
@@ -53,6 +53,9 @@
|
|||||||
NSUInteger _port;
|
NSUInteger _port;
|
||||||
dispatch_source_t _source;
|
dispatch_source_t _source;
|
||||||
CFNetServiceRef _service;
|
CFNetServiceRef _service;
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
BOOL _recording;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -72,6 +75,7 @@ GCDWebServerLogLevel GCDLogLevel = kGCDWebServerLogLevel_Debug;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static NSDateFormatter* _dateFormatterRFC822 = nil;
|
static NSDateFormatter* _dateFormatterRFC822 = nil;
|
||||||
|
static NSDateFormatter* _dateFormatterISO8601 = nil;
|
||||||
static dispatch_queue_t _dateFormatterQueue = NULL;
|
static dispatch_queue_t _dateFormatterQueue = NULL;
|
||||||
#if !TARGET_OS_IPHONE
|
#if !TARGET_OS_IPHONE
|
||||||
static BOOL _run;
|
static BOOL _run;
|
||||||
@@ -136,25 +140,45 @@ NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset) {
|
|||||||
return (encoding != kCFStringEncodingInvalidId ? encoding : NSUTF8StringEncoding);
|
return (encoding != kCFStringEncodingInvalidId ? encoding : NSUTF8StringEncoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString* GCDWebServerFormatHTTPDate(NSDate* date) {
|
NSString* GCDWebServerFormatRFC822(NSDate* date) {
|
||||||
__block NSString* string;
|
__block NSString* string;
|
||||||
dispatch_sync(_dateFormatterQueue, ^{
|
dispatch_sync(_dateFormatterQueue, ^{
|
||||||
string = [_dateFormatterRFC822 stringFromDate:date]; // HTTP/1.1 server must use RFC822
|
string = [_dateFormatterRFC822 stringFromDate:date];
|
||||||
});
|
});
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSDate* GCDWebServerParseHTTPDate(NSString* string) {
|
NSDate* GCDWebServerParseRFC822(NSString* string) {
|
||||||
__block NSDate* date;
|
__block NSDate* date;
|
||||||
dispatch_sync(_dateFormatterQueue, ^{
|
dispatch_sync(_dateFormatterQueue, ^{
|
||||||
date = [_dateFormatterRFC822 dateFromString:string]; // TODO: Handle RFC 850 and ANSI C's asctime() format (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3)
|
date = [_dateFormatterRFC822 dateFromString:string];
|
||||||
});
|
});
|
||||||
return date;
|
return date;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType) {
|
NSString* GCDWebServerFormatISO8601(NSDate* date) {
|
||||||
if ([contentType hasPrefix:@"text/"] || [contentType isEqualToString:@"application/json"] || [contentType isEqualToString:@"application/xml"]) {
|
__block NSString* string;
|
||||||
NSString* charset = GCDWebServerExtractHeaderValueParameter(contentType, @"charset");
|
dispatch_sync(_dateFormatterQueue, ^{
|
||||||
|
string = [_dateFormatterISO8601 stringFromDate:date];
|
||||||
|
});
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSDate* GCDWebServerParseISO8601(NSString* string) {
|
||||||
|
__block NSDate* date;
|
||||||
|
dispatch_sync(_dateFormatterQueue, ^{
|
||||||
|
date = [_dateFormatterISO8601 dateFromString:string];
|
||||||
|
});
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline BOOL _IsTextContentType(NSString* type) {
|
||||||
|
return ([type hasPrefix:@"text/"] || [type hasPrefix:@"application/json"] || [type hasPrefix:@"application/xml"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
NSString* GCDWebServerDescribeData(NSData* data, NSString* type) {
|
||||||
|
if (_IsTextContentType(type)) {
|
||||||
|
NSString* charset = GCDWebServerExtractHeaderValueParameter(type, @"charset");
|
||||||
NSString* string = [[NSString alloc] initWithData:data encoding:GCDWebServerStringEncodingFromCharset(charset)];
|
NSString* string = [[NSString alloc] initWithData:data encoding:GCDWebServerStringEncodingFromCharset(charset)];
|
||||||
if (string) {
|
if (string) {
|
||||||
return ARC_AUTORELEASE(string);
|
return ARC_AUTORELEASE(string);
|
||||||
@@ -239,7 +263,7 @@ NSString* GCDWebServerGetPrimaryIPv4Address() {
|
|||||||
if (store) {
|
if (store) {
|
||||||
CFPropertyListRef info = SCDynamicStoreCopyValue(store, CFSTR("State:/Network/Global/IPv4"));
|
CFPropertyListRef info = SCDynamicStoreCopyValue(store, CFSTR("State:/Network/Global/IPv4"));
|
||||||
if (info) {
|
if (info) {
|
||||||
primaryInterface = [[(ARC_BRIDGE NSDictionary*)info objectForKey:@"PrimaryInterface"] UTF8String];
|
primaryInterface = [[NSString stringWithString:[(ARC_BRIDGE NSDictionary*)info objectForKey:@"PrimaryInterface"]] UTF8String];
|
||||||
CFRelease(info);
|
CFRelease(info);
|
||||||
}
|
}
|
||||||
CFRelease(store);
|
CFRelease(store);
|
||||||
@@ -317,6 +341,8 @@ static void _SignalHandler(int signal) {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// HTTP/1.1 server must use RFC822
|
||||||
|
// TODO: Handle RFC 850 and ANSI C's asctime() format (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3)
|
||||||
+ (void)initialize {
|
+ (void)initialize {
|
||||||
if (_dateFormatterRFC822 == nil) {
|
if (_dateFormatterRFC822 == nil) {
|
||||||
DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread
|
DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread
|
||||||
@@ -326,6 +352,14 @@ static void _SignalHandler(int signal) {
|
|||||||
_dateFormatterRFC822.locale = ARC_AUTORELEASE([[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]);
|
_dateFormatterRFC822.locale = ARC_AUTORELEASE([[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]);
|
||||||
DCHECK(_dateFormatterRFC822);
|
DCHECK(_dateFormatterRFC822);
|
||||||
}
|
}
|
||||||
|
if (_dateFormatterISO8601 == nil) {
|
||||||
|
DCHECK([NSThread isMainThread]); // NSDateFormatter should be initialized on main thread
|
||||||
|
_dateFormatterISO8601 = [[NSDateFormatter alloc] init];
|
||||||
|
_dateFormatterISO8601.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
|
||||||
|
_dateFormatterISO8601.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'+00:00'";
|
||||||
|
_dateFormatterISO8601.locale = ARC_AUTORELEASE([[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]);
|
||||||
|
DCHECK(_dateFormatterISO8601);
|
||||||
|
}
|
||||||
if (_dateFormatterQueue == NULL) {
|
if (_dateFormatterQueue == NULL) {
|
||||||
_dateFormatterQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
|
_dateFormatterQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
|
||||||
DCHECK(_dateFormatterQueue);
|
DCHECK(_dateFormatterQueue);
|
||||||
@@ -529,6 +563,18 @@ static void _NetServiceClientCallBack(CFNetServiceRef service, CFStreamError* er
|
|||||||
|
|
||||||
@implementation GCDWebServer (Extensions)
|
@implementation GCDWebServer (Extensions)
|
||||||
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
|
||||||
|
- (void)setRecordingEnabled:(BOOL)flag {
|
||||||
|
_recording = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)isRecordingEnabled {
|
||||||
|
return _recording;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
- (NSURL*)serverURL {
|
- (NSURL*)serverURL {
|
||||||
if (_source) {
|
if (_source) {
|
||||||
NSString* ipAddress = GCDWebServerGetPrimaryIPv4Address();
|
NSString* ipAddress = GCDWebServerGetPrimaryIPv4Address();
|
||||||
@@ -578,6 +624,175 @@ static void _NetServiceClientCallBack(CFNetServiceRef service, CFStreamError* er
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
|
||||||
|
|
||||||
|
static CFHTTPMessageRef _CreateHTTPMessageFromData(NSData* data, BOOL isRequest) {
|
||||||
|
CFHTTPMessageRef message = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, isRequest);
|
||||||
|
if (CFHTTPMessageAppendBytes(message, data.bytes, data.length)) {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
CFRelease(message);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CFHTTPMessageRef _CreateHTTPMessageFromPerformingRequest(NSData* inData, NSUInteger port) {
|
||||||
|
CFHTTPMessageRef response = NULL;
|
||||||
|
int httpSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||||
|
if (httpSocket > 0) {
|
||||||
|
struct sockaddr_in addr4;
|
||||||
|
bzero(&addr4, sizeof(addr4));
|
||||||
|
addr4.sin_len = sizeof(port);
|
||||||
|
addr4.sin_family = AF_INET;
|
||||||
|
addr4.sin_port = htons(8080);
|
||||||
|
addr4.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
if (connect(httpSocket, (void*)&addr4, sizeof(addr4)) == 0) {
|
||||||
|
if (write(httpSocket, inData.bytes, inData.length) == (ssize_t)inData.length) {
|
||||||
|
NSMutableData* outData = [[NSMutableData alloc] initWithLength:(256 * 1024)];
|
||||||
|
NSUInteger length = 0;
|
||||||
|
while (1) {
|
||||||
|
ssize_t result = read(httpSocket, (char*)outData.mutableBytes + length, outData.length - length);
|
||||||
|
if (result < 0) {
|
||||||
|
length = NSNotFound;
|
||||||
|
break;
|
||||||
|
} else if (result == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
length += result;
|
||||||
|
if (length >= outData.length) {
|
||||||
|
outData.length = 2 * outData.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (length != NSNotFound) {
|
||||||
|
outData.length = length;
|
||||||
|
response = _CreateHTTPMessageFromData(outData, NO);
|
||||||
|
} else {
|
||||||
|
DNOT_REACHED();
|
||||||
|
}
|
||||||
|
ARC_RELEASE(outData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(httpSocket);
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _LogResult(NSString* format, ...) {
|
||||||
|
va_list arguments;
|
||||||
|
va_start(arguments, format);
|
||||||
|
NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments];
|
||||||
|
va_end(arguments);
|
||||||
|
fprintf(stdout, "%s\n", [message UTF8String]);
|
||||||
|
ARC_RELEASE(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSInteger)runTestsInDirectory:(NSString*)path withPort:(NSUInteger)port {
|
||||||
|
NSArray* ignoredHeaders = @[@"Date", @"Etag"]; // Dates are always different by definition and ETags depend on file system node IDs
|
||||||
|
NSInteger result = -1;
|
||||||
|
if ([self startWithPort:port bonjourName:nil]) {
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
NSArray* files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:NULL];
|
||||||
|
for (NSString* requestFile in files) {
|
||||||
|
if (![requestFile hasSuffix:@".request"]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
@autoreleasepool {
|
||||||
|
NSString* index = [[requestFile componentsSeparatedByString:@"-"] firstObject];
|
||||||
|
BOOL success = NO;
|
||||||
|
NSData* requestData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:requestFile]];
|
||||||
|
if (requestData) {
|
||||||
|
CFHTTPMessageRef request = _CreateHTTPMessageFromData(requestData, YES);
|
||||||
|
if (request) {
|
||||||
|
NSString* requestMethod = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyRequestMethod(request));
|
||||||
|
NSURL* requestURL = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyRequestURL(request));
|
||||||
|
_LogResult(@"[%i] %@ %@", (int)[index integerValue], requestMethod, requestURL.path);
|
||||||
|
NSString* prefix = [index stringByAppendingString:@"-"];
|
||||||
|
for (NSString* responseFile in files) {
|
||||||
|
if ([responseFile hasPrefix:prefix] && [responseFile hasSuffix:@".response"]) {
|
||||||
|
NSData* responseData = [NSData dataWithContentsOfFile:[path stringByAppendingPathComponent:responseFile]];
|
||||||
|
if (responseData) {
|
||||||
|
CFHTTPMessageRef expectedResponse = _CreateHTTPMessageFromData(responseData, NO);
|
||||||
|
if (expectedResponse) {
|
||||||
|
CFHTTPMessageRef actualResponse = _CreateHTTPMessageFromPerformingRequest(requestData, port);
|
||||||
|
if (actualResponse) {
|
||||||
|
success = YES;
|
||||||
|
|
||||||
|
CFIndex expectedStatusCode = CFHTTPMessageGetResponseStatusCode(expectedResponse);
|
||||||
|
CFIndex actualStatusCode = CFHTTPMessageGetResponseStatusCode(actualResponse);
|
||||||
|
if (actualStatusCode != expectedStatusCode) {
|
||||||
|
_LogResult(@" Status code not matching:\n Expected: %i\n Actual: %i", (int)expectedStatusCode, (int)actualStatusCode);
|
||||||
|
success = NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSDictionary* expectedHeaders = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyAllHeaderFields(expectedResponse));
|
||||||
|
NSDictionary* actualHeaders = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyAllHeaderFields(actualResponse));
|
||||||
|
for (NSString* expectedHeader in expectedHeaders) {
|
||||||
|
if ([ignoredHeaders containsObject:expectedHeader]) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
NSString* expectedValue = [expectedHeaders objectForKey:expectedHeader];
|
||||||
|
NSString* actualValue = [actualHeaders objectForKey:expectedHeader];
|
||||||
|
if (![actualValue isEqualToString:expectedValue]) {
|
||||||
|
_LogResult(@" Header '%@' not matching:\n Expected: \"%@\"\n Actual: \"%@\"", expectedHeader, expectedValue, actualValue);
|
||||||
|
success = NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (NSString* actualHeader in actualHeaders) {
|
||||||
|
if (![expectedHeaders objectForKey:actualHeader]) {
|
||||||
|
_LogResult(@" Header '%@' not matching:\n Expected: \"%@\"\n Actual: \"%@\"", actualHeader, nil, [actualHeaders objectForKey:actualHeader]);
|
||||||
|
success = NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NSData* expectedBody = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyBody(expectedResponse));
|
||||||
|
NSData* actualBody = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyBody(actualResponse));
|
||||||
|
if (![actualBody isEqualToData:expectedBody]) {
|
||||||
|
_LogResult(@" Bodies not matching:\n Expected: %lu bytes\n Actual: %lu bytes", (unsigned long)expectedBody.length, (unsigned long)actualBody.length);
|
||||||
|
success = NO;
|
||||||
|
#ifndef NDEBUG
|
||||||
|
if (_IsTextContentType([expectedHeaders objectForKey:@"Content-Type"])) {
|
||||||
|
NSString* expectedPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]];
|
||||||
|
NSString* actualPath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[[NSProcessInfo processInfo] globallyUniqueString] stringByAppendingPathExtension:@"txt"]];
|
||||||
|
if ([expectedBody writeToFile:expectedPath atomically:YES] && [actualBody writeToFile:actualPath atomically:YES]) {
|
||||||
|
NSTask* task = [[NSTask alloc] init];
|
||||||
|
[task setLaunchPath:@"/usr/bin/opendiff"];
|
||||||
|
[task setArguments:@[expectedPath, actualPath]];
|
||||||
|
[task launch];
|
||||||
|
ARC_RELEASE(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
CFRelease(actualResponse);
|
||||||
|
}
|
||||||
|
CFRelease(expectedResponse);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DNOT_REACHED();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CFRelease(request);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DNOT_REACHED();
|
||||||
|
}
|
||||||
|
_LogResult(@"");
|
||||||
|
if (!success) {
|
||||||
|
++result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[self stop];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation GCDWebServer (Handlers)
|
@implementation GCDWebServer (Handlers)
|
||||||
|
|||||||
@@ -25,7 +25,11 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#import <TargetConditionals.h>
|
||||||
#import <netdb.h>
|
#import <netdb.h>
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
#import <libkern/OSAtomic.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#import "GCDWebServerPrivate.h"
|
#import "GCDWebServerPrivate.h"
|
||||||
|
|
||||||
@@ -45,6 +49,9 @@ static NSData* _CRLFData = nil;
|
|||||||
static NSData* _CRLFCRLFData = nil;
|
static NSData* _CRLFCRLFData = nil;
|
||||||
static NSData* _continueData = nil;
|
static NSData* _continueData = nil;
|
||||||
static NSData* _lastChunkData = nil;
|
static NSData* _lastChunkData = nil;
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
static int32_t _connectionCounter = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
@interface GCDWebServerConnection () {
|
@interface GCDWebServerConnection () {
|
||||||
@private
|
@private
|
||||||
@@ -62,6 +69,14 @@ static NSData* _lastChunkData = nil;
|
|||||||
CFHTTPMessageRef _responseMessage;
|
CFHTTPMessageRef _responseMessage;
|
||||||
GCDWebServerResponse* _response;
|
GCDWebServerResponse* _response;
|
||||||
NSInteger _statusCode;
|
NSInteger _statusCode;
|
||||||
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
NSUInteger _connectionIndex;
|
||||||
|
NSString* _requestPath;
|
||||||
|
int _requestFD;
|
||||||
|
NSString* _responsePath;
|
||||||
|
int _responseFD;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -77,6 +92,18 @@ static NSData* _lastChunkData = nil;
|
|||||||
LOG_DEBUG(@"Connection received %zu bytes on socket %i", size, _socket);
|
LOG_DEBUG(@"Connection received %zu bytes on socket %i", size, _socket);
|
||||||
_bytesRead += size;
|
_bytesRead += size;
|
||||||
[self didUpdateBytesRead];
|
[self didUpdateBytesRead];
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
if (_requestFD > 0) {
|
||||||
|
bool success = dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {
|
||||||
|
return (write(_requestFD, chunkBytes, chunkSize) == (ssize_t)chunkSize);
|
||||||
|
});
|
||||||
|
if (!success) {
|
||||||
|
LOG_ERROR(@"Failed recording request data: %s (%i)", strerror(errno), errno);
|
||||||
|
close(_requestFD);
|
||||||
|
_requestFD = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
block(buffer);
|
block(buffer);
|
||||||
} else {
|
} else {
|
||||||
if (_bytesRead > 0) {
|
if (_bytesRead > 0) {
|
||||||
@@ -100,8 +127,8 @@ static NSData* _lastChunkData = nil;
|
|||||||
|
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
NSMutableData* data = [[NSMutableData alloc] initWithCapacity:dispatch_data_get_size(buffer)];
|
NSMutableData* data = [[NSMutableData alloc] initWithCapacity:dispatch_data_get_size(buffer)];
|
||||||
dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t offset, const void* bufferChunk, size_t size) {
|
dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {
|
||||||
[data appendBytes:bufferChunk length:size];
|
[data appendBytes:chunkBytes length:chunkSize];
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
block(data);
|
block(data);
|
||||||
@@ -119,8 +146,8 @@ static NSData* _lastChunkData = nil;
|
|||||||
|
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
NSMutableData* data = [NSMutableData dataWithCapacity:kHeadersReadBuffer];
|
NSMutableData* data = [NSMutableData dataWithCapacity:kHeadersReadBuffer];
|
||||||
dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t offset, const void* bufferChunk, size_t size) {
|
dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {
|
||||||
[data appendBytes:bufferChunk length:size];
|
[data appendBytes:chunkBytes length:chunkSize];
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
NSRange range = [data rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, data.length)];
|
NSRange range = [data rangeOfData:_CRLFCRLFData options:0 range:NSMakeRange(0, data.length)];
|
||||||
@@ -158,7 +185,7 @@ static NSData* _lastChunkData = nil;
|
|||||||
|
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
if (dispatch_data_get_size(buffer) <= length) {
|
if (dispatch_data_get_size(buffer) <= length) {
|
||||||
bool success = dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t offset, const void* chunkBytes, size_t chunkSize) {
|
bool success = dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {
|
||||||
NSData* data = [NSData dataWithBytesNoCopy:(void*)chunkBytes length:chunkSize freeWhenDone:NO];
|
NSData* data = [NSData dataWithBytesNoCopy:(void*)chunkBytes length:chunkSize freeWhenDone:NO];
|
||||||
NSError* error = nil;
|
NSError* error = nil;
|
||||||
if (![_request performWriteData:data error:&error]) {
|
if (![_request performWriteData:data error:&error]) {
|
||||||
@@ -245,7 +272,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
[self _readBufferWithLength:SIZE_T_MAX completionBlock:^(dispatch_data_t buffer) {
|
[self _readBufferWithLength:SIZE_T_MAX completionBlock:^(dispatch_data_t buffer) {
|
||||||
|
|
||||||
if (buffer) {
|
if (buffer) {
|
||||||
dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t offset, const void* chunkBytes, size_t chunkSize) {
|
dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {
|
||||||
[chunkData appendBytes:chunkBytes length:chunkSize];
|
[chunkData appendBytes:chunkBytes length:chunkSize];
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
@@ -263,6 +290,9 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
|
|
||||||
- (void)_writeBuffer:(dispatch_data_t)buffer withCompletionBlock:(WriteBufferCompletionBlock)block {
|
- (void)_writeBuffer:(dispatch_data_t)buffer withCompletionBlock:(WriteBufferCompletionBlock)block {
|
||||||
size_t size = dispatch_data_get_size(buffer);
|
size_t size = dispatch_data_get_size(buffer);
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
ARC_DISPATCH_RETAIN(buffer);
|
||||||
|
#endif
|
||||||
dispatch_write(_socket, buffer, kGCDWebServerGCDQueue, ^(dispatch_data_t data, int error) {
|
dispatch_write(_socket, buffer, kGCDWebServerGCDQueue, ^(dispatch_data_t data, int error) {
|
||||||
|
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
@@ -271,12 +301,27 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
LOG_DEBUG(@"Connection sent %zu bytes on socket %i", size, _socket);
|
LOG_DEBUG(@"Connection sent %zu bytes on socket %i", size, _socket);
|
||||||
_bytesWritten += size;
|
_bytesWritten += size;
|
||||||
[self didUpdateBytesWritten];
|
[self didUpdateBytesWritten];
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
if (_responseFD > 0) {
|
||||||
|
bool success = dispatch_data_apply(buffer, ^bool(dispatch_data_t region, size_t chunkOffset, const void* chunkBytes, size_t chunkSize) {
|
||||||
|
return (write(_responseFD, chunkBytes, chunkSize) == (ssize_t)chunkSize);
|
||||||
|
});
|
||||||
|
if (!success) {
|
||||||
|
LOG_ERROR(@"Failed recording response data: %s (%i)", strerror(errno), errno);
|
||||||
|
close(_responseFD);
|
||||||
|
_responseFD = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
block(YES);
|
block(YES);
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error);
|
LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error);
|
||||||
block(NO);
|
block(NO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
ARC_DISPATCH_RELEASE(buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -285,7 +330,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
#if !__has_feature(objc_arc)
|
#if !__has_feature(objc_arc)
|
||||||
[data retain];
|
[data retain];
|
||||||
#endif
|
#endif
|
||||||
dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, dispatch_get_main_queue(), ^{
|
dispatch_data_t buffer = dispatch_data_create(data.bytes, data.length, kGCDWebServerGCDQueue, ^{
|
||||||
#if __has_feature(objc_arc)
|
#if __has_feature(objc_arc)
|
||||||
[data self]; // Keeps ARC from releasing data too early
|
[data self]; // Keeps ARC from releasing data too early
|
||||||
#else
|
#else
|
||||||
@@ -390,7 +435,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
_responseMessage = CFHTTPMessageCreateResponse(kCFAllocatorDefault, statusCode, NULL, kCFHTTPVersion1_1);
|
_responseMessage = CFHTTPMessageCreateResponse(kCFAllocatorDefault, statusCode, NULL, kCFHTTPVersion1_1);
|
||||||
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Connection"), CFSTR("Close"));
|
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Connection"), CFSTR("Close"));
|
||||||
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Server"), (ARC_BRIDGE CFStringRef)[[_server class] serverName]);
|
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Server"), (ARC_BRIDGE CFStringRef)[[_server class] serverName]);
|
||||||
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Date"), (ARC_BRIDGE CFStringRef)GCDWebServerFormatHTTPDate([NSDate date]));
|
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Date"), (ARC_BRIDGE CFStringRef)GCDWebServerFormatRFC822([NSDate date]));
|
||||||
}
|
}
|
||||||
|
|
||||||
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
||||||
@@ -418,7 +463,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
if (_response) {
|
if (_response) {
|
||||||
[self _initializeResponseHeadersWithStatusCode:_response.statusCode];
|
[self _initializeResponseHeadersWithStatusCode:_response.statusCode];
|
||||||
if (_response.lastModifiedDate) {
|
if (_response.lastModifiedDate) {
|
||||||
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Last-Modified"), (ARC_BRIDGE CFStringRef)GCDWebServerFormatHTTPDate(_response.lastModifiedDate));
|
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Last-Modified"), (ARC_BRIDGE CFStringRef)GCDWebServerFormatRFC822(_response.lastModifiedDate));
|
||||||
}
|
}
|
||||||
if (_response.eTag) {
|
if (_response.eTag) {
|
||||||
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("ETag"), (ARC_BRIDGE CFStringRef)_response.eTag);
|
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("ETag"), (ARC_BRIDGE CFStringRef)_response.eTag);
|
||||||
@@ -655,6 +700,11 @@ static NSString* _StringFromAddressData(NSData* data) {
|
|||||||
}
|
}
|
||||||
ARC_RELEASE(_response);
|
ARC_RELEASE(_response);
|
||||||
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
ARC_RELEASE(_requestPath);
|
||||||
|
ARC_RELEASE(_responsePath);
|
||||||
|
#endif
|
||||||
|
|
||||||
ARC_DEALLOC(super);
|
ARC_DEALLOC(super);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -664,6 +714,21 @@ static NSString* _StringFromAddressData(NSData* data) {
|
|||||||
|
|
||||||
- (void)open {
|
- (void)open {
|
||||||
LOG_DEBUG(@"Did open connection on socket %i", _socket);
|
LOG_DEBUG(@"Did open connection on socket %i", _socket);
|
||||||
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
if (_server.recordingEnabled) {
|
||||||
|
_connectionIndex = OSAtomicIncrement32(&_connectionCounter);
|
||||||
|
|
||||||
|
_requestPath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]);
|
||||||
|
_requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY);
|
||||||
|
DCHECK(_requestFD > 0);
|
||||||
|
|
||||||
|
_responsePath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]);
|
||||||
|
_responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY);
|
||||||
|
DCHECK(_responseFD > 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
[self _readRequestHeaders];
|
[self _readRequestHeaders];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -732,7 +797,43 @@ static inline BOOL _CompareResources(NSString* responseETag, NSString* requestET
|
|||||||
} else {
|
} else {
|
||||||
LOG_DEBUG(@"Did close connection on socket %i", _socket);
|
LOG_DEBUG(@"Did close connection on socket %i", _socket);
|
||||||
}
|
}
|
||||||
LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
|
|
||||||
|
#if !TARGET_OS_IPHONE
|
||||||
|
if (_requestPath) {
|
||||||
|
BOOL success = NO;
|
||||||
|
NSError* error = nil;
|
||||||
|
if (_requestFD > 0) {
|
||||||
|
close(_requestFD);
|
||||||
|
NSString* name = [NSString stringWithFormat:@"%03lu-%@.request", (unsigned long)_connectionIndex, _virtualHEAD ? @"HEAD" : _request.method];
|
||||||
|
success = [[NSFileManager defaultManager] moveItemAtPath:_requestPath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];
|
||||||
|
}
|
||||||
|
if (!success) {
|
||||||
|
LOG_ERROR(@"Failed saving recorded request: %@", error);
|
||||||
|
DNOT_REACHED();
|
||||||
|
}
|
||||||
|
unlink([_requestPath fileSystemRepresentation]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_responsePath) {
|
||||||
|
BOOL success = NO;
|
||||||
|
NSError* error = nil;
|
||||||
|
if (_responseFD > 0) {
|
||||||
|
close(_responseFD);
|
||||||
|
NSString* name = [NSString stringWithFormat:@"%03lu-%i.response", (unsigned long)_connectionIndex, (int)_statusCode];
|
||||||
|
success = [[NSFileManager defaultManager] moveItemAtPath:_responsePath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];
|
||||||
|
}
|
||||||
|
if (!success) {
|
||||||
|
LOG_ERROR(@"Failed saving recorded response: %@", error);
|
||||||
|
DNOT_REACHED();
|
||||||
|
}
|
||||||
|
unlink([_responsePath fileSystemRepresentation]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (_request) {
|
||||||
|
LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
|
||||||
|
} else {
|
||||||
|
LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -78,6 +78,22 @@ static inline NSError* _MakePosixError(int code) {
|
|||||||
*error = _MakePosixError(errno);
|
*error = _MakePosixError(errno);
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
|
||||||
|
NSString* creationDateHeader = [self.headers objectForKey:@"X-GCDWebServer-CreationDate"];
|
||||||
|
if (creationDateHeader) {
|
||||||
|
NSDate* date = GCDWebServerParseISO8601(creationDateHeader);
|
||||||
|
if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate: date} ofItemAtPath:_temporaryPath error:error]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NSString* modifiedDateHeader = [self.headers objectForKey:@"X-GCDWebServer-ModifiedDate"];
|
||||||
|
if (modifiedDateHeader) {
|
||||||
|
NSDate* date = GCDWebServerParseRFC822(modifiedDateHeader);
|
||||||
|
if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileModificationDate: date} ofItemAtPath:_temporaryPath error:error]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,8 +36,10 @@
|
|||||||
#define ARC_AUTORELEASE(__OBJECT__) __OBJECT__
|
#define ARC_AUTORELEASE(__OBJECT__) __OBJECT__
|
||||||
#define ARC_DEALLOC(__OBJECT__)
|
#define ARC_DEALLOC(__OBJECT__)
|
||||||
#if (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0)) || (!TARGET_OS_IPHONE && (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_8))
|
#if (TARGET_OS_IPHONE && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0)) || (!TARGET_OS_IPHONE && (__MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_8))
|
||||||
|
#define ARC_DISPATCH_RETAIN(__OBJECT__)
|
||||||
#define ARC_DISPATCH_RELEASE(__OBJECT__)
|
#define ARC_DISPATCH_RELEASE(__OBJECT__)
|
||||||
#else
|
#else
|
||||||
|
#define ARC_DISPATCH_RETAIN(__OBJECT__) dispatch_retain(__OBJECT__)
|
||||||
#define ARC_DISPATCH_RELEASE(__OBJECT__) dispatch_release(__OBJECT__)
|
#define ARC_DISPATCH_RELEASE(__OBJECT__) dispatch_release(__OBJECT__)
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
@@ -47,6 +49,7 @@
|
|||||||
#define ARC_RELEASE(__OBJECT__) [__OBJECT__ release]
|
#define ARC_RELEASE(__OBJECT__) [__OBJECT__ release]
|
||||||
#define ARC_AUTORELEASE(__OBJECT__) [__OBJECT__ autorelease]
|
#define ARC_AUTORELEASE(__OBJECT__) [__OBJECT__ autorelease]
|
||||||
#define ARC_DEALLOC(__OBJECT__) [__OBJECT__ dealloc]
|
#define ARC_DEALLOC(__OBJECT__) [__OBJECT__ dealloc]
|
||||||
|
#define ARC_DISPATCH_RETAIN(__OBJECT__) dispatch_retain(__OBJECT__)
|
||||||
#define ARC_DISPATCH_RELEASE(__OBJECT__) dispatch_release(__OBJECT__)
|
#define ARC_DISPATCH_RELEASE(__OBJECT__) dispatch_release(__OBJECT__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -113,8 +116,6 @@ extern NSString* GCDWebServerNormalizeHeaderValue(NSString* value);
|
|||||||
extern NSString* GCDWebServerTruncateHeaderValue(NSString* value);
|
extern NSString* GCDWebServerTruncateHeaderValue(NSString* value);
|
||||||
extern NSString* GCDWebServerExtractHeaderValueParameter(NSString* header, NSString* attribute);
|
extern NSString* GCDWebServerExtractHeaderValueParameter(NSString* header, NSString* attribute);
|
||||||
extern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset);
|
extern NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset);
|
||||||
extern NSString* GCDWebServerFormatHTTPDate(NSDate* date);
|
|
||||||
extern NSDate* GCDWebServerParseHTTPDate(NSString* string);
|
|
||||||
extern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType);
|
extern NSString* GCDWebServerDescribeData(NSData* data, NSString* contentType);
|
||||||
|
|
||||||
@interface GCDWebServerConnection ()
|
@interface GCDWebServerConnection ()
|
||||||
|
|||||||
@@ -199,7 +199,7 @@
|
|||||||
|
|
||||||
NSString* modifiedHeader = [_headers objectForKey:@"If-Modified-Since"];
|
NSString* modifiedHeader = [_headers objectForKey:@"If-Modified-Since"];
|
||||||
if (modifiedHeader) {
|
if (modifiedHeader) {
|
||||||
_modifiedSince = [GCDWebServerParseHTTPDate(modifiedHeader) copy];
|
_modifiedSince = [GCDWebServerParseRFC822(modifiedHeader) copy];
|
||||||
}
|
}
|
||||||
_noneMatch = ARC_RETAIN([_headers objectForKey:@"If-None-Match"]);
|
_noneMatch = ARC_RETAIN([_headers objectForKey:@"If-None-Match"]);
|
||||||
|
|
||||||
|
|||||||
@@ -214,6 +214,15 @@ static inline BOOL _IsMacFinder(GCDWebServerRequest* request) {
|
|||||||
if (![[NSFileManager defaultManager] createDirectoryAtPath:absolutePath withIntermediateDirectories:NO attributes:nil error:&error]) {
|
if (![[NSFileManager defaultManager] createDirectoryAtPath:absolutePath withIntermediateDirectories:NO attributes:nil error:&error]) {
|
||||||
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed creating directory \"%@\"", relativePath];
|
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed creating directory \"%@\"", relativePath];
|
||||||
}
|
}
|
||||||
|
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
|
||||||
|
NSString* creationDateHeader = [request.headers objectForKey:@"X-GCDWebServer-CreationDate"];
|
||||||
|
if (creationDateHeader) {
|
||||||
|
NSDate* date = GCDWebServerParseISO8601(creationDateHeader);
|
||||||
|
if (!date || ![[NSFileManager defaultManager] setAttributes:@{NSFileCreationDate: date} ofItemAtPath:absolutePath error:&error]) {
|
||||||
|
return [GCDWebServerErrorResponse responseWithServerError:kGCDWebServerHTTPStatusCode_InternalServerError underlyingError:error message:@"Failed setting creation date for directory \"%@\"", relativePath];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if ([_delegate respondsToSelector:@selector(davServer:didCreateDirectoryAtPath:)]) {
|
if ([_delegate respondsToSelector:@selector(davServer:didCreateDirectoryAtPath:)]) {
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
@@ -335,19 +344,11 @@ static inline xmlNodePtr _XMLChildWithName(xmlNodePtr child, const xmlChar* name
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((properties & kDAVProperty_CreationDate) && [attributes objectForKey:NSFileCreationDate]) {
|
if ((properties & kDAVProperty_CreationDate) && [attributes objectForKey:NSFileCreationDate]) {
|
||||||
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
|
[xmlString appendFormat:@"<D:creationdate>%@</D:creationdate>", GCDWebServerFormatISO8601([attributes fileCreationDate])];
|
||||||
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
|
|
||||||
formatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
|
|
||||||
formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'+00:00'";
|
|
||||||
[xmlString appendFormat:@"<D:creationdate>%@</D:creationdate>", [formatter stringFromDate:[attributes fileCreationDate]]];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((properties & kDAVProperty_LastModified) && [attributes objectForKey:NSFileModificationDate]) {
|
if ((properties & kDAVProperty_LastModified) && isFile && [attributes objectForKey:NSFileModificationDate]) { // Last modification date is not useful for directories as it changes implicitely and 'Last-Modified' header is not provided for directories anyway
|
||||||
NSDateFormatter* formatter = [[NSDateFormatter alloc] init];
|
[xmlString appendFormat:@"<D:getlastmodified>%@</D:getlastmodified>", GCDWebServerFormatRFC822([attributes fileModificationDate])];
|
||||||
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
|
|
||||||
formatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
|
|
||||||
formatter.dateFormat = @"EEE', 'd' 'MMM' 'yyyy' 'HH:mm:ss' GMT'";
|
|
||||||
[xmlString appendFormat:@"<D:getlastmodified>%@</D:getlastmodified>", [formatter stringFromDate:[attributes fileModificationDate]]];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((properties & kDAVProperty_ContentLength) && !isDirectory && [attributes objectForKey:NSFileSize]) {
|
if ((properties & kDAVProperty_ContentLength) && !isDirectory && [attributes objectForKey:NSFileSize]) {
|
||||||
@@ -360,6 +361,8 @@ static inline xmlNodePtr _XMLChildWithName(xmlNodePtr child, const xmlChar* name
|
|||||||
[xmlString appendString:@"</D:response>\n"];
|
[xmlString appendString:@"</D:response>\n"];
|
||||||
}
|
}
|
||||||
CFRelease(escapedPath);
|
CFRelease(escapedPath);
|
||||||
|
} else {
|
||||||
|
[self logError:@"Failed escaping path: %@", itemPath];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,10 +412,10 @@ static inline xmlNodePtr _XMLChildWithName(xmlNodePtr child, const xmlChar* name
|
|||||||
}
|
}
|
||||||
if (!success) {
|
if (!success) {
|
||||||
NSString* string = [[NSString alloc] initWithData:request.data encoding:NSUTF8StringEncoding];
|
NSString* string = [[NSString alloc] initWithData:request.data encoding:NSUTF8StringEncoding];
|
||||||
return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Invalid DAV properties:\n%@", string];
|
|
||||||
#if !__has_feature(objc_arc)
|
#if !__has_feature(objc_arc)
|
||||||
[string release];
|
[string autorelease];
|
||||||
#endif
|
#endif
|
||||||
|
return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Invalid DAV properties:\n%@", string];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
properties = kDAVAllProperties;
|
properties = kDAVAllProperties;
|
||||||
@@ -510,10 +513,10 @@ static inline xmlNodePtr _XMLChildWithName(xmlNodePtr child, const xmlChar* name
|
|||||||
}
|
}
|
||||||
if (!success) {
|
if (!success) {
|
||||||
NSString* string = [[NSString alloc] initWithData:request.data encoding:NSUTF8StringEncoding];
|
NSString* string = [[NSString alloc] initWithData:request.data encoding:NSUTF8StringEncoding];
|
||||||
return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Invalid DAV properties:\n%@", string];
|
|
||||||
#if !__has_feature(objc_arc)
|
#if !__has_feature(objc_arc)
|
||||||
[string release];
|
[string autorelease];
|
||||||
#endif
|
#endif
|
||||||
|
return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_BadRequest message:@"Invalid DAV properties:\n%@", string];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (![scope isEqualToString:@"exclusive"] || ![type isEqualToString:@"write"] || ![depthHeader isEqualToString:@"0"]) {
|
if (![scope isEqualToString:@"exclusive"] || ![type isEqualToString:@"write"] || ![depthHeader isEqualToString:@"0"]) {
|
||||||
@@ -525,6 +528,12 @@ static inline xmlNodePtr _XMLChildWithName(xmlNodePtr child, const xmlChar* name
|
|||||||
return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Locking item name \"%@\" is not allowed", itemName];
|
return [GCDWebServerErrorResponse responseWithClientError:kGCDWebServerHTTPStatusCode_Forbidden message:@"Locking item name \"%@\" is not allowed", itemName];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
|
||||||
|
NSString* lockTokenHeader = [request.headers objectForKey:@"X-GCDWebServer-LockToken"];
|
||||||
|
if (lockTokenHeader) {
|
||||||
|
token = lockTokenHeader;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!token) {
|
if (!token) {
|
||||||
CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
|
CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
|
||||||
CFStringRef string = CFUUIDCreateString(kCFAllocatorDefault, uuid);
|
CFStringRef string = CFUUIDCreateString(kCFAllocatorDefault, uuid);
|
||||||
|
|||||||
47
GCDWebServer.podspec
Normal file
47
GCDWebServer.podspec
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# http://guides.cocoapods.org/syntax/podspec.html
|
||||||
|
# Verify Podspec with:
|
||||||
|
# sudo gem update cocoapods
|
||||||
|
# pod spec lint GCDWebServer.podspec --verbose
|
||||||
|
# Add to source line:
|
||||||
|
# :tag => s.version.to_s
|
||||||
|
|
||||||
|
Pod::Spec.new do |s|
|
||||||
|
s.name = 'GCDWebServer'
|
||||||
|
s.version = '2.0.1'
|
||||||
|
s.author = { 'Pierre-Olivier Latour' => 'info@pol-online.net' }
|
||||||
|
s.license = { :type => 'BSD', :file => 'LICENSE' }
|
||||||
|
s.homepage = 'https://github.com/swisspol/GCDWebServer'
|
||||||
|
s.summary = 'Lightweight GCD based HTTP server for OS X & iOS (includes web based uploader & WebDAV server)'
|
||||||
|
|
||||||
|
s.source = { :git => 'https://github.com/swisspol/GCDWebServer.git' }
|
||||||
|
s.ios.deployment_target = '5.0'
|
||||||
|
s.osx.deployment_target = '10.7'
|
||||||
|
s.requires_arc = true
|
||||||
|
|
||||||
|
s.default_subspec = 'Core'
|
||||||
|
|
||||||
|
s.subspec 'Core' do |cs|
|
||||||
|
cs.source_files = 'CGDWebServer/*.{h,m}'
|
||||||
|
cs.requires_arc = true
|
||||||
|
cs.ios.library = 'z'
|
||||||
|
cs.osx.library = 'z'
|
||||||
|
cs.compiler_flags = '-DNDEBUG' # TODO: Only set this for Release configuration
|
||||||
|
end
|
||||||
|
|
||||||
|
s.subspec 'WebDAV' do |cs|
|
||||||
|
cs.dependency 'GCDWebServer/Core'
|
||||||
|
cs.source_files = 'GCDWebDAVServer/*.{h,m}'
|
||||||
|
cs.requires_arc = true
|
||||||
|
cs.ios.library = 'xml2'
|
||||||
|
cs.osx.library = 'xml2'
|
||||||
|
cs.compiler_flags = '-I$(SDKROOT)/usr/include/libxml2'
|
||||||
|
end
|
||||||
|
|
||||||
|
s.subspec 'WebUploader' do |cs|
|
||||||
|
cs.dependency 'GCDWebServer/Core'
|
||||||
|
cs.source_files = 'GCDWebUploader/*.{h,m}'
|
||||||
|
cs.requires_arc = true
|
||||||
|
cs.resource = "GCDWebUploader/GCDWebUploader.bundle"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -461,6 +461,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__;
|
||||||
HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
|
HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
WARNING_CFLAGS = (
|
WARNING_CFLAGS = (
|
||||||
@@ -488,6 +489,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = NDEBUG;
|
GCC_PREPROCESSOR_DEFINITIONS = NDEBUG;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = __GCDWEBSERVER_ENABLE_TESTING__;
|
||||||
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
||||||
HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
|
HEADER_SEARCH_PATHS = "$(SDKROOT)/usr/include/libxml2";
|
||||||
WARNING_CFLAGS = "-Wall";
|
WARNING_CFLAGS = "-Wall";
|
||||||
|
|||||||
108
Mac/main.m
108
Mac/main.m
@@ -25,6 +25,8 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#import <libgen.h>
|
||||||
|
|
||||||
#import "GCDWebServer.h"
|
#import "GCDWebServer.h"
|
||||||
|
|
||||||
#import "GCDWebServerDataRequest.h"
|
#import "GCDWebServerDataRequest.h"
|
||||||
@@ -37,22 +39,71 @@
|
|||||||
|
|
||||||
#import "GCDWebUploader.h"
|
#import "GCDWebUploader.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
kMode_WebServer = 0,
|
||||||
|
kMode_HTMLPage,
|
||||||
|
kMode_HTMLForm,
|
||||||
|
kMode_WebDAV,
|
||||||
|
kMode_WebUploader,
|
||||||
|
kMode_StreamingResponse
|
||||||
|
} Mode;
|
||||||
|
|
||||||
int main(int argc, const char* argv[]) {
|
int main(int argc, const char* argv[]) {
|
||||||
BOOL success = NO;
|
int result = -1;
|
||||||
int mode = (argc == 2 ? MIN(MAX(atoi(argv[1]), 0), 5) : 0);
|
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
Mode mode = kMode_WebServer;
|
||||||
|
BOOL recording = NO;
|
||||||
|
NSString* rootDirectory = NSHomeDirectory();
|
||||||
|
NSString* testDirectory = nil;
|
||||||
|
|
||||||
|
if (argc == 1) {
|
||||||
|
fprintf(stdout, "Usage: %s [-mode webServer | htmlPage | htmlForm | webDAV | webUploader | streamingResponse] [-record] [-root directory] [-tests directory]\n\n", basename((char*)argv[0]));
|
||||||
|
} else {
|
||||||
|
for (int i = 1; i < argc; ++i) {
|
||||||
|
if (argv[i][0] != '-') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!strcmp(argv[i], "-mode") && (i + 1 < argc)) {
|
||||||
|
++i;
|
||||||
|
if (!strcmp(argv[i], "webServer")) {
|
||||||
|
mode = kMode_WebServer;
|
||||||
|
} else if (!strcmp(argv[i], "htmlPage")) {
|
||||||
|
mode = kMode_HTMLPage;
|
||||||
|
} else if (!strcmp(argv[i], "htmlForm")) {
|
||||||
|
mode = kMode_HTMLForm;
|
||||||
|
} else if (!strcmp(argv[i], "webDAV")) {
|
||||||
|
mode = kMode_WebDAV;
|
||||||
|
} else if (!strcmp(argv[i], "webUploader")) {
|
||||||
|
mode = kMode_WebUploader;
|
||||||
|
} else if (!strcmp(argv[i], "streamingResponse")) {
|
||||||
|
mode = kMode_StreamingResponse;
|
||||||
|
}
|
||||||
|
} else if (!strcmp(argv[i], "-record")) {
|
||||||
|
recording = YES;
|
||||||
|
} else if (!strcmp(argv[i], "-root") && (i + 1 < argc)) {
|
||||||
|
++i;
|
||||||
|
rootDirectory = [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:argv[i] length:strlen(argv[i])] stringByStandardizingPath];
|
||||||
|
} else if (!strcmp(argv[i], "-tests") && (i + 1 < argc)) {
|
||||||
|
++i;
|
||||||
|
testDirectory = [[[NSFileManager defaultManager] stringWithFileSystemRepresentation:argv[i] length:strlen(argv[i])] stringByStandardizingPath];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GCDWebServer* webServer = nil;
|
GCDWebServer* webServer = nil;
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
|
||||||
// Simply serve contents of home directory
|
// Simply serve contents of home directory
|
||||||
case 0: {
|
case kMode_WebServer: {
|
||||||
|
fprintf(stdout, "Running in Web Server mode from \"%s\"", [rootDirectory UTF8String]);
|
||||||
webServer = [[GCDWebServer alloc] init];
|
webServer = [[GCDWebServer alloc] init];
|
||||||
[webServer addGETHandlerForBasePath:@"/" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:0 allowRangeRequests:YES];
|
[webServer addGETHandlerForBasePath:@"/" directoryPath:rootDirectory indexFilename:nil cacheAge:0 allowRangeRequests:YES];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Renders a HTML page
|
// Renders a HTML page
|
||||||
case 1: {
|
case kMode_HTMLPage: {
|
||||||
|
fprintf(stdout, "Running in HTML Page mode");
|
||||||
webServer = [[GCDWebServer alloc] init];
|
webServer = [[GCDWebServer alloc] init];
|
||||||
[webServer addDefaultHandlerForMethod:@"GET"
|
[webServer addDefaultHandlerForMethod:@"GET"
|
||||||
requestClass:[GCDWebServerRequest class]
|
requestClass:[GCDWebServerRequest class]
|
||||||
@@ -65,7 +116,8 @@ int main(int argc, const char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Implements an HTML form
|
// Implements an HTML form
|
||||||
case 2: {
|
case kMode_HTMLForm: {
|
||||||
|
fprintf(stdout, "Running in HTML Form mode");
|
||||||
webServer = [[GCDWebServer alloc] init];
|
webServer = [[GCDWebServer alloc] init];
|
||||||
[webServer addHandlerForMethod:@"GET"
|
[webServer addHandlerForMethod:@"GET"
|
||||||
path:@"/"
|
path:@"/"
|
||||||
@@ -96,17 +148,23 @@ int main(int argc, const char* argv[]) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 3: {
|
// Serve home directory through WebDAV
|
||||||
webServer = [[GCDWebDAVServer alloc] initWithUploadDirectory:[[NSFileManager defaultManager] currentDirectoryPath]];
|
case kMode_WebDAV: {
|
||||||
|
fprintf(stdout, "Running in WebDAV mode from \"%s\"", [rootDirectory UTF8String]);
|
||||||
|
webServer = [[GCDWebDAVServer alloc] initWithUploadDirectory:rootDirectory];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 4: {
|
// Serve home directory through web uploader
|
||||||
webServer = [[GCDWebUploader alloc] initWithUploadDirectory:[[NSFileManager defaultManager] currentDirectoryPath]];
|
case kMode_WebUploader: {
|
||||||
|
fprintf(stdout, "Running in Web Uploader mode from \"%s\"", [rootDirectory UTF8String]);
|
||||||
|
webServer = [[GCDWebUploader alloc] initWithUploadDirectory:rootDirectory];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 5: {
|
// Test streaming responses
|
||||||
|
case kMode_StreamingResponse: {
|
||||||
|
fprintf(stdout, "Running in Streaming Response mode");
|
||||||
webServer = [[GCDWebServer alloc] init];
|
webServer = [[GCDWebServer alloc] init];
|
||||||
[webServer addHandlerForMethod:@"GET"
|
[webServer addHandlerForMethod:@"GET"
|
||||||
path:@"/"
|
path:@"/"
|
||||||
@@ -130,10 +188,30 @@ int main(int argc, const char* argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
success = [webServer runWithPort:8080];
|
#if __has_feature(objc_arc)
|
||||||
#if !__has_feature(objc_arc)
|
fprintf(stdout, " (ARC is ON)\n");
|
||||||
[webServer release];
|
#else
|
||||||
|
fprintf(stdout, " (ARC is OFF)\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (webServer) {
|
||||||
|
if (testDirectory) {
|
||||||
|
fprintf(stdout, "<RUNNING TESTS FROM \"%s\">\n\n", [testDirectory UTF8String]);
|
||||||
|
result = (int)[webServer runTestsInDirectory:testDirectory withPort:8080];
|
||||||
|
} else {
|
||||||
|
if (recording) {
|
||||||
|
fprintf(stdout, "<RECORDING ENABLED>\n");
|
||||||
|
webServer.recordingEnabled = YES;
|
||||||
|
}
|
||||||
|
fprintf(stdout, "\n");
|
||||||
|
if ([webServer runWithPort:8080]) {
|
||||||
|
result = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if !__has_feature(objc_arc)
|
||||||
|
[webServer release];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return success ? 0 : -1;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ Extra built-in features:
|
|||||||
* [JSON](http://www.json.org/) parsing and serialization for request and response HTTP bodies
|
* [JSON](http://www.json.org/) parsing and serialization for request and response HTTP bodies
|
||||||
* [Chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) for request and response HTTP bodies
|
* [Chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding) for request and response HTTP bodies
|
||||||
* [HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression) with gzip for request and response HTTP bodies
|
* [HTTP compression](https://en.wikipedia.org/wiki/HTTP_compression) with gzip for request and response HTTP bodies
|
||||||
|
* [HTTP range](https://en.wikipedia.org/wiki/Byte_serving) support for requests of local files
|
||||||
|
|
||||||
Included extensions:
|
Included extensions:
|
||||||
* [GCDWebUploader](GCDWebUploader/GCDWebUploader.h): subclass of GCDWebServer that implements an interface for uploading and downloading files from an iOS app's sandbox using a web browser
|
* [GCDWebUploader](GCDWebUploader/GCDWebUploader.h): subclass of GCDWebServer that implements an interface for uploading and downloading files from an iOS app's sandbox using a web browser
|
||||||
@@ -40,6 +41,14 @@ Alternatively, you can install GCDWebServer using [CocoaPods](http://cocoapods.o
|
|||||||
```
|
```
|
||||||
pod "GCDWebServer", "~> 2.0"
|
pod "GCDWebServer", "~> 2.0"
|
||||||
```
|
```
|
||||||
|
If you want to use GCDWebUploader, use this line instead:
|
||||||
|
```
|
||||||
|
pod "GCDWebServer/WebUploader", "~> 2.0"
|
||||||
|
```
|
||||||
|
Or this line for GCDWebDAVServer:
|
||||||
|
```
|
||||||
|
pod "GCDWebServer/WebDAV", "~> 2.0"
|
||||||
|
```
|
||||||
|
|
||||||
Hello World
|
Hello World
|
||||||
===========
|
===========
|
||||||
|
|||||||
42
Run-Tests.sh
Executable file
42
Run-Tests.sh
Executable file
@@ -0,0 +1,42 @@
|
|||||||
|
#!/bin/sh -ex
|
||||||
|
|
||||||
|
TARGET="GCDWebServer (Mac)"
|
||||||
|
CONFIGURATION="Release"
|
||||||
|
|
||||||
|
MRC_BUILD_DIR="/tmp/GCDWebServer-MRC"
|
||||||
|
MRC_PRODUCT="$MRC_BUILD_DIR/$CONFIGURATION/GCDWebServer"
|
||||||
|
ARC_BUILD_DIR="/tmp/GCDWebServer-ARC"
|
||||||
|
ARC_PRODUCT="$ARC_BUILD_DIR/$CONFIGURATION/GCDWebServer"
|
||||||
|
|
||||||
|
PAYLOAD_ZIP="Tests/Payload.zip"
|
||||||
|
PAYLOAD_DIR="/tmp/GCDWebServer"
|
||||||
|
|
||||||
|
function runTests {
|
||||||
|
rm -rf "$PAYLOAD_DIR"
|
||||||
|
ditto -x -k "$PAYLOAD_ZIP" "$PAYLOAD_DIR"
|
||||||
|
find "$PAYLOAD_DIR" -type d -exec SetFile -d "1/1/2014" -m "1/1/2014" '{}' \; # ZIP archives do not preserve directories dates
|
||||||
|
logLevel=2 $1 -mode "$2" -root "$PAYLOAD_DIR/Payload" -tests "$3"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Build in manual memory management mode
|
||||||
|
rm -rf "MRC_BUILD_DIR"
|
||||||
|
xcodebuild -target "$TARGET" -configuration "$CONFIGURATION" build "SYMROOT=$MRC_BUILD_DIR" "CLANG_ENABLE_OBJC_ARC=NO" > /dev/null
|
||||||
|
|
||||||
|
# Build in ARC mode
|
||||||
|
rm -rf "ARC_BUILD_DIR"
|
||||||
|
xcodebuild -target "$TARGET" -configuration "$CONFIGURATION" build "SYMROOT=$ARC_BUILD_DIR" "CLANG_ENABLE_OBJC_ARC=YES" > /dev/null
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
runTests $MRC_PRODUCT "webServer" "Tests/WebServer"
|
||||||
|
runTests $ARC_PRODUCT "webServer" "Tests/WebServer"
|
||||||
|
runTests $MRC_PRODUCT "webDAV" "Tests/WebDAV-Transmit"
|
||||||
|
runTests $ARC_PRODUCT "webDAV" "Tests/WebDAV-Transmit"
|
||||||
|
runTests $MRC_PRODUCT "webDAV" "Tests/WebDAV-Cyberduck"
|
||||||
|
runTests $ARC_PRODUCT "webDAV" "Tests/WebDAV-Cyberduck"
|
||||||
|
runTests $MRC_PRODUCT "webDAV" "Tests/WebDAV-Finder"
|
||||||
|
runTests $ARC_PRODUCT "webDAV" "Tests/WebDAV-Finder"
|
||||||
|
runTests $MRC_PRODUCT "webUploader" "Tests/WebUploader"
|
||||||
|
runTests $ARC_PRODUCT "webUploader" "Tests/WebUploader"
|
||||||
|
|
||||||
|
# Done
|
||||||
|
echo "\nAll tests completed successfully!"
|
||||||
BIN
Tests/Payload.zip
Normal file
BIN
Tests/Payload.zip
Normal file
Binary file not shown.
6
Tests/WebDAV-Cyberduck/001-200.response
Executable file
6
Tests/WebDAV-Cyberduck/001-200.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 200 OK
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:42 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/001-HEAD.request
Executable file
6
Tests/WebDAV-Cyberduck/001-HEAD.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HEAD / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
14
Tests/WebDAV-Cyberduck/002-207.response
Executable file
14
Tests/WebDAV-Cyberduck/002-207.response
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1106
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:42 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/images</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/002-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/002-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
12
Tests/WebDAV-Cyberduck/003-207.response
Executable file
12
Tests/WebDAV-Cyberduck/003-207.response
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 700
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:47 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/PDF%20Reports/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports/Apple%20Economic%20Impact%20on%20Cupertino.pdf</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2013-05-01T12:01:13+00:00</D:creationdate><D:getlastmodified>Wed, 01 May 2013 12:01:13 GMT</D:getlastmodified><D:getcontentlength>181952</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/003-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/003-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND /PDF%20Reports/ HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
13
Tests/WebDAV-Cyberduck/004-207.response
Executable file
13
Tests/WebDAV-Cyberduck/004-207.response
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 998
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:47 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/images/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/images/capable_green_ipad_l.png</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T21:46:56+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 21:46:56 GMT</D:getlastmodified><D:getcontentlength>116066</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/images/hero_mba_11.jpg</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T21:51:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 21:51:14 GMT</D:getlastmodified><D:getcontentlength>106799</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/004-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/004-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND /images/ HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/005-200.response
Executable file
6
Tests/WebDAV-Cyberduck/005-200.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 200 OK
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:51 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/005-HEAD.request
Executable file
6
Tests/WebDAV-Cyberduck/005-HEAD.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HEAD / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
7
Tests/WebDAV-Cyberduck/006-404.response
Executable file
7
Tests/WebDAV-Cyberduck/006-404.response
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
HTTP/1.1 404 Not Found
|
||||||
|
Content-Length: 204
|
||||||
|
Content-Type: text/html; charset=utf-8
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:51 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/006-HEAD.request
Executable file
6
Tests/WebDAV-Cyberduck/006-HEAD.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HEAD /Copy%20%284%3A11%3A14%2C%209%3A52%20PM%29.txt HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/007-201.response
Executable file
6
Tests/WebDAV-Cyberduck/007-201.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 201 Created
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:51 GMT
|
||||||
|
|
||||||
8
Tests/WebDAV-Cyberduck/007-COPY.request
Executable file
8
Tests/WebDAV-Cyberduck/007-COPY.request
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
COPY /Copy.txt HTTP/1.1
|
||||||
|
Destination: http://localhost:8080/Copy%20%284%3A11%3A14%2C%209%3A52%20PM%29.txt
|
||||||
|
Overwrite: T
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
15
Tests/WebDAV-Cyberduck/008-207.response
Executable file
15
Tests/WebDAV-Cyberduck/008-207.response
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1448
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:51 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy%20(4:11:14,%209:52%20PM).txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/images</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/008-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/008-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/009-200.response
Executable file
6
Tests/WebDAV-Cyberduck/009-200.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 200 OK
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:52:59 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/009-HEAD.request
Executable file
6
Tests/WebDAV-Cyberduck/009-HEAD.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HEAD / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
BIN
Tests/WebDAV-Cyberduck/010-200.response
Executable file
BIN
Tests/WebDAV-Cyberduck/010-200.response
Executable file
Binary file not shown.
6
Tests/WebDAV-Cyberduck/010-GET.request
Executable file
6
Tests/WebDAV-Cyberduck/010-GET.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
GET /images/capable_green_ipad_l.png HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
13
Tests/WebDAV-Cyberduck/011-207.response
Executable file
13
Tests/WebDAV-Cyberduck/011-207.response
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 998
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:07 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/images/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/images/capable_green_ipad_l.png</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T21:46:56+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 21:46:56 GMT</D:getlastmodified><D:getcontentlength>116066</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/images/hero_mba_11.jpg</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T21:51:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 21:51:14 GMT</D:getlastmodified><D:getcontentlength>106799</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/011-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/011-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND /images/ HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/012-204.response
Executable file
6
Tests/WebDAV-Cyberduck/012-204.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 204 No Content
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:07 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/012-DELETE.request
Executable file
6
Tests/WebDAV-Cyberduck/012-DELETE.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
DELETE /images/capable_green_ipad_l.png HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/013-204.response
Executable file
6
Tests/WebDAV-Cyberduck/013-204.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 204 No Content
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:07 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/013-DELETE.request
Executable file
6
Tests/WebDAV-Cyberduck/013-DELETE.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
DELETE /images/hero_mba_11.jpg HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/014-204.response
Executable file
6
Tests/WebDAV-Cyberduck/014-204.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 204 No Content
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:07 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/014-DELETE.request
Executable file
6
Tests/WebDAV-Cyberduck/014-DELETE.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
DELETE /images/ HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
14
Tests/WebDAV-Cyberduck/015-207.response
Executable file
14
Tests/WebDAV-Cyberduck/015-207.response
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1214
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:07 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy%20(4:11:14,%209:52%20PM).txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/015-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/015-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/016-201.response
Executable file
6
Tests/WebDAV-Cyberduck/016-201.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 201 Created
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:13 GMT
|
||||||
|
|
||||||
8
Tests/WebDAV-Cyberduck/016-MOVE.request
Executable file
8
Tests/WebDAV-Cyberduck/016-MOVE.request
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
MOVE /Copy%20%284%3A11%3A14%2C%209%3A52%20PM%29.txt HTTP/1.1
|
||||||
|
Destination: http://localhost:8080/Test.txt
|
||||||
|
Overwrite: T
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
14
Tests/WebDAV-Cyberduck/017-207.response
Executable file
14
Tests/WebDAV-Cyberduck/017-207.response
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1189
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:13 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Test.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/017-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/017-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/018-201.response
Executable file
6
Tests/WebDAV-Cyberduck/018-201.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 201 Created
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:14 GMT
|
||||||
|
|
||||||
8
Tests/WebDAV-Cyberduck/018-MOVE.request
Executable file
8
Tests/WebDAV-Cyberduck/018-MOVE.request
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
MOVE /Test.txt HTTP/1.1
|
||||||
|
Destination: http://localhost:8080/PDF%20Reports/Test.txt
|
||||||
|
Overwrite: T
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
13
Tests/WebDAV-Cyberduck/019-207.response
Executable file
13
Tests/WebDAV-Cyberduck/019-207.response
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 872
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:14 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/019-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/019-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
13
Tests/WebDAV-Cyberduck/020-207.response
Executable file
13
Tests/WebDAV-Cyberduck/020-207.response
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1031
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:14 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/PDF%20Reports/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports/Apple%20Economic%20Impact%20on%20Cupertino.pdf</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2013-05-01T12:01:13+00:00</D:creationdate><D:getlastmodified>Wed, 01 May 2013 12:01:13 GMT</D:getlastmodified><D:getcontentlength>181952</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports/Test.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/020-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/020-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND /PDF%20Reports/ HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/021-200.response
Executable file
6
Tests/WebDAV-Cyberduck/021-200.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 200 OK
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:22 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/021-HEAD.request
Executable file
6
Tests/WebDAV-Cyberduck/021-HEAD.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HEAD / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
7
Tests/WebDAV-Cyberduck/022-404.response
Executable file
7
Tests/WebDAV-Cyberduck/022-404.response
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
HTTP/1.1 404 Not Found
|
||||||
|
Content-Length: 190
|
||||||
|
Content-Type: text/html; charset=utf-8
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:22 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/022-HEAD.request
Executable file
6
Tests/WebDAV-Cyberduck/022-HEAD.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HEAD /Test%20File.txt HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/023-201.response
Executable file
6
Tests/WebDAV-Cyberduck/023-201.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 201 Created
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:22 GMT
|
||||||
|
|
||||||
11
Tests/WebDAV-Cyberduck/023-PUT.request
Executable file
11
Tests/WebDAV-Cyberduck/023-PUT.request
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
PUT /Test%20File.txt HTTP/1.1
|
||||||
|
Content-Length: 21
|
||||||
|
Content-Type: text/plain
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
X-GCDWebServer-CreationDate: 2014-04-12T04:53:22+00:00
|
||||||
|
X-GCDWebServer-ModifiedDate: Sat, 12 Apr 2014 04:53:22 GMT
|
||||||
|
|
||||||
|
Nothing to see here!
|
||||||
14
Tests/WebDAV-Cyberduck/024-207.response
Executable file
14
Tests/WebDAV-Cyberduck/024-207.response
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1195
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:22 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Test%20File.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-12T04:53:22+00:00</D:creationdate><D:getlastmodified>Sat, 12 Apr 2014 04:53:22 GMT</D:getlastmodified><D:getcontentlength>21</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/024-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/024-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/025-201.response
Executable file
6
Tests/WebDAV-Cyberduck/025-201.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 201 Created
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:35 GMT
|
||||||
|
|
||||||
8
Tests/WebDAV-Cyberduck/025-MKCOL.request
Executable file
8
Tests/WebDAV-Cyberduck/025-MKCOL.request
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
MKCOL /Text%20Files/ HTTP/1.1
|
||||||
|
Content-Length: 0
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
X-GCDWebServer-CreationDate: 2014-04-12T04:53:35+00:00
|
||||||
|
|
||||||
15
Tests/WebDAV-Cyberduck/026-207.response
Executable file
15
Tests/WebDAV-Cyberduck/026-207.response
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1435
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:35 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Test%20File.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-12T04:53:22+00:00</D:creationdate><D:getlastmodified>Sat, 12 Apr 2014 04:53:22 GMT</D:getlastmodified><D:getcontentlength>21</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Text%20Files</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-04-12T04:53:35+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/026-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/026-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
11
Tests/WebDAV-Cyberduck/027-207.response
Executable file
11
Tests/WebDAV-Cyberduck/027-207.response
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 327
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:36 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/Text%20Files/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-04-12T04:53:35+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/027-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/027-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND /Text%20Files/ HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/028-201.response
Executable file
6
Tests/WebDAV-Cyberduck/028-201.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 201 Created
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:39 GMT
|
||||||
|
|
||||||
8
Tests/WebDAV-Cyberduck/028-MOVE.request
Executable file
8
Tests/WebDAV-Cyberduck/028-MOVE.request
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
MOVE /Test%20File.txt HTTP/1.1
|
||||||
|
Destination: http://localhost:8080/Text%20Files/Test%20File.txt
|
||||||
|
Overwrite: T
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/029-201.response
Executable file
6
Tests/WebDAV-Cyberduck/029-201.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 201 Created
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:39 GMT
|
||||||
|
|
||||||
8
Tests/WebDAV-Cyberduck/029-MOVE.request
Executable file
8
Tests/WebDAV-Cyberduck/029-MOVE.request
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
MOVE /Copy.txt HTTP/1.1
|
||||||
|
Destination: http://localhost:8080/Text%20Files/Copy.txt
|
||||||
|
Overwrite: T
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
13
Tests/WebDAV-Cyberduck/030-207.response
Executable file
13
Tests/WebDAV-Cyberduck/030-207.response
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 795
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:39 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Text%20Files</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-04-12T04:53:35+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/030-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/030-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
13
Tests/WebDAV-Cyberduck/031-207.response
Executable file
13
Tests/WebDAV-Cyberduck/031-207.response
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 993
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:39 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/Text%20Files/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-04-12T04:53:35+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Text%20Files/Copy.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Text%20Files/Test%20File.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-12T04:53:22+00:00</D:creationdate><D:getlastmodified>Sat, 12 Apr 2014 04:53:22 GMT</D:getlastmodified><D:getcontentlength>21</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/031-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/031-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND /Text%20Files/ HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
13
Tests/WebDAV-Cyberduck/032-207.response
Executable file
13
Tests/WebDAV-Cyberduck/032-207.response
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 1031
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:44 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/PDF%20Reports/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports/Apple%20Economic%20Impact%20on%20Cupertino.pdf</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2013-05-01T12:01:13+00:00</D:creationdate><D:getlastmodified>Wed, 01 May 2013 12:01:13 GMT</D:getlastmodified><D:getcontentlength>181952</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/PDF%20Reports/Test.txt</D:href><D:propstat><D:prop><D:resourcetype/><D:creationdate>2014-04-10T11:10:14+00:00</D:creationdate><D:getlastmodified>Thu, 10 Apr 2014 11:10:14 GMT</D:getlastmodified><D:getcontentlength>271</D:getcontentlength></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/032-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/032-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND /PDF%20Reports/ HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
6
Tests/WebDAV-Cyberduck/033-204.response
Executable file
6
Tests/WebDAV-Cyberduck/033-204.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 204 No Content
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:44 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/033-DELETE.request
Executable file
6
Tests/WebDAV-Cyberduck/033-DELETE.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
DELETE /PDF%20Reports/Apple%20Economic%20Impact%20on%20Cupertino.pdf HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/034-204.response
Executable file
6
Tests/WebDAV-Cyberduck/034-204.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 204 No Content
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:44 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/034-DELETE.request
Executable file
6
Tests/WebDAV-Cyberduck/034-DELETE.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
DELETE /PDF%20Reports/Test.txt HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/035-204.response
Executable file
6
Tests/WebDAV-Cyberduck/035-204.response
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
HTTP/1.1 204 No Content
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:44 GMT
|
||||||
|
|
||||||
6
Tests/WebDAV-Cyberduck/035-DELETE.request
Executable file
6
Tests/WebDAV-Cyberduck/035-DELETE.request
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
DELETE /PDF%20Reports/ HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
12
Tests/WebDAV-Cyberduck/036-207.response
Executable file
12
Tests/WebDAV-Cyberduck/036-207.response
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 554
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 04:53:44 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
<D:response><D:href>/Text%20Files</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-04-12T04:53:35+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
10
Tests/WebDAV-Cyberduck/036-PROPFIND.request
Executable file
10
Tests/WebDAV-Cyberduck/036-PROPFIND.request
Executable file
@@ -0,0 +1,10 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Depth: 1
|
||||||
|
Content-Type: text/xml; charset=utf-8
|
||||||
|
Content-Length: 99
|
||||||
|
Host: localhost:8080
|
||||||
|
Connection: Keep-Alive
|
||||||
|
User-Agent: Cyberduck/4.4.3 (Mac OS X/10.9.2) (x86_64)
|
||||||
|
Accept-Encoding: gzip,deflate
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><propfind xmlns="DAV:"><allprop/></propfind>
|
||||||
7
Tests/WebDAV-Finder/001-200.response
Executable file
7
Tests/WebDAV-Finder/001-200.response
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
HTTP/1.1 200 OK
|
||||||
|
Cache-Control: no-cache
|
||||||
|
DAV: 1, 2
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 05:10:55 GMT
|
||||||
|
|
||||||
7
Tests/WebDAV-Finder/001-OPTIONS.request
Executable file
7
Tests/WebDAV-Finder/001-OPTIONS.request
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
OPTIONS / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Accept: */*
|
||||||
|
Content-Length: 0
|
||||||
|
Connection: close
|
||||||
|
User-Agent: WebDAVLib/1.3
|
||||||
|
|
||||||
7
Tests/WebDAV-Finder/002-200.response
Executable file
7
Tests/WebDAV-Finder/002-200.response
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
HTTP/1.1 200 OK
|
||||||
|
Cache-Control: no-cache
|
||||||
|
DAV: 1, 2
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 05:10:55 GMT
|
||||||
|
|
||||||
7
Tests/WebDAV-Finder/002-OPTIONS.request
Executable file
7
Tests/WebDAV-Finder/002-OPTIONS.request
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
OPTIONS / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Accept: */*
|
||||||
|
Content-Length: 0
|
||||||
|
Connection: close
|
||||||
|
User-Agent: WebDAVLib/1.3
|
||||||
|
|
||||||
7
Tests/WebDAV-Finder/003-200.response
Executable file
7
Tests/WebDAV-Finder/003-200.response
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
HTTP/1.1 200 OK
|
||||||
|
Cache-Control: no-cache
|
||||||
|
DAV: 1, 2
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 05:10:55 GMT
|
||||||
|
|
||||||
7
Tests/WebDAV-Finder/003-OPTIONS.request
Executable file
7
Tests/WebDAV-Finder/003-OPTIONS.request
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
OPTIONS / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Accept: */*
|
||||||
|
Content-Length: 0
|
||||||
|
Connection: keep-alive
|
||||||
|
User-Agent: WebDAVFS/3.0.1 (03018000) Darwin/13.1.0 (x86_64)
|
||||||
|
|
||||||
11
Tests/WebDAV-Finder/004-207.response
Executable file
11
Tests/WebDAV-Finder/004-207.response
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 314
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 05:10:55 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
18
Tests/WebDAV-Finder/004-PROPFIND.request
Executable file
18
Tests/WebDAV-Finder/004-PROPFIND.request
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Content-Type: text/xml
|
||||||
|
Depth: 0
|
||||||
|
Accept: */*
|
||||||
|
User-Agent: WebDAVFS/3.0.1 (03018000) Darwin/13.1.0 (x86_64)
|
||||||
|
Content-Length: 179
|
||||||
|
Connection: keep-alive
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<D:propfind xmlns:D="DAV:">
|
||||||
|
<D:prop>
|
||||||
|
<D:getlastmodified/>
|
||||||
|
<D:getcontentlength/>
|
||||||
|
<D:creationdate/>
|
||||||
|
<D:resourcetype/>
|
||||||
|
</D:prop>
|
||||||
|
</D:propfind>
|
||||||
11
Tests/WebDAV-Finder/005-207.response
Executable file
11
Tests/WebDAV-Finder/005-207.response
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 208
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 05:10:55 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
18
Tests/WebDAV-Finder/005-PROPFIND.request
Executable file
18
Tests/WebDAV-Finder/005-PROPFIND.request
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Content-Type: text/xml
|
||||||
|
Depth: 0
|
||||||
|
Accept: */*
|
||||||
|
User-Agent: WebDAVFS/3.0.1 (03018000) Darwin/13.1.0 (x86_64)
|
||||||
|
Content-Length: 175
|
||||||
|
Connection: keep-alive
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<D:propfind xmlns:D="DAV:">
|
||||||
|
<D:prop>
|
||||||
|
<D:quota-available-bytes/>
|
||||||
|
<D:quota-used-bytes/>
|
||||||
|
<D:quota/>
|
||||||
|
<D:quotaused/>
|
||||||
|
</D:prop>
|
||||||
|
</D:propfind>
|
||||||
11
Tests/WebDAV-Finder/006-207.response
Executable file
11
Tests/WebDAV-Finder/006-207.response
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 314
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 05:10:55 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
18
Tests/WebDAV-Finder/006-PROPFIND.request
Executable file
18
Tests/WebDAV-Finder/006-PROPFIND.request
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Content-Type: text/xml
|
||||||
|
Depth: 0
|
||||||
|
Accept: */*
|
||||||
|
User-Agent: WebDAVFS/3.0.1 (03018000) Darwin/13.1.0 (x86_64)
|
||||||
|
Content-Length: 179
|
||||||
|
Connection: keep-alive
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<D:propfind xmlns:D="DAV:">
|
||||||
|
<D:prop>
|
||||||
|
<D:getlastmodified/>
|
||||||
|
<D:getcontentlength/>
|
||||||
|
<D:creationdate/>
|
||||||
|
<D:resourcetype/>
|
||||||
|
</D:prop>
|
||||||
|
</D:propfind>
|
||||||
11
Tests/WebDAV-Finder/007-207.response
Executable file
11
Tests/WebDAV-Finder/007-207.response
Executable file
@@ -0,0 +1,11 @@
|
|||||||
|
HTTP/1.1 207 Multi-Status
|
||||||
|
Cache-Control: no-cache
|
||||||
|
Content-Length: 314
|
||||||
|
Content-Type: application/xml; charset="utf-8"
|
||||||
|
Connection: Close
|
||||||
|
Server: GCDWebDAVServer
|
||||||
|
Date: Sat, 12 Apr 2014 05:10:55 GMT
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8" ?><D:multistatus xmlns:D="DAV:">
|
||||||
|
<D:response><D:href>/</D:href><D:propstat><D:prop><D:resourcetype><D:collection/></D:resourcetype><D:creationdate>2014-01-01T09:01:00+00:00</D:creationdate></D:prop><D:status>HTTP/1.1 200 OK</D:status></D:propstat></D:response>
|
||||||
|
</D:multistatus>
|
||||||
18
Tests/WebDAV-Finder/007-PROPFIND.request
Executable file
18
Tests/WebDAV-Finder/007-PROPFIND.request
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
PROPFIND / HTTP/1.1
|
||||||
|
Host: localhost:8080
|
||||||
|
Content-Type: text/xml
|
||||||
|
Depth: 0
|
||||||
|
Accept: */*
|
||||||
|
User-Agent: WebDAVFS/3.0.1 (03018000) Darwin/13.1.0 (x86_64)
|
||||||
|
Content-Length: 179
|
||||||
|
Connection: keep-alive
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<D:propfind xmlns:D="DAV:">
|
||||||
|
<D:prop>
|
||||||
|
<D:getlastmodified/>
|
||||||
|
<D:getcontentlength/>
|
||||||
|
<D:creationdate/>
|
||||||
|
<D:resourcetype/>
|
||||||
|
</D:prop>
|
||||||
|
</D:propfind>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user