+@end
+/* }}} */
+/* Cydget-PHP:// Protocol {{{ */
+@interface CydgetPHPURLProtocol : NSURLProtocol {
+}
+
+@end
+
+@implementation CydgetPHPURLProtocol
+
++ (BOOL) canInitWithRequest:(NSURLRequest *)request {
+ NSURL *url([request URL]);
+ if (url == nil)
+ return NO;
+ NSString *scheme([[url scheme] lowercaseString]);
+ if (scheme == nil || ![scheme isEqualToString:@"cydget-php"])
+ return NO;
+ return YES;
+}
+
++ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request {
+ return request;
+}
+
+- (void) startLoading {
+ id<NSURLProtocolClient> client([self client]);
+ NSURLRequest *request([self request]);
+ NSURL *url([request URL]);
+ NSString *href([url absoluteString]);
+
+ NSString *path([href substringFromIndex:13]);
+ if (path == nil || ![path hasSuffix:@".php"])
+ [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorResourceUnavailable userInfo:nil]];
+
+ NSFileManager *manager([NSFileManager defaultManager]);
+ if (![manager fileExistsAtPath:path])
+ [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]];
+
+ int fds[2];
+ _assert(pipe(fds) != -1);
+
+ pid_t pid(fork());
+ if (pid == 0) {
+ _assert(dup2(fds[1], 1) != -1);
+ _assert(close(fds[0]) != -1);
+ _assert(close(fds[1]) != -1);
+ execl("/usr/bin/php", "php", [path UTF8String], NULL);
+ exit(1);
+ _assert(false);
+ }
+
+ _assert(close(fds[1]) != -1);
+
+ NSMutableData *data([NSMutableData dataWithCapacity:16*1024]);
+
+ if (FILE *file = fdopen(fds[0], "r")) {
+ char buffer[16*1024];
+ read:
+ size_t count(fread(buffer, 1, sizeof(buffer), file));
+ if (count != 0)
+ [data appendBytes:buffer length:count];
+ if (count == sizeof(buffer))
+ goto read;
+ if (ferror(file))
+ [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorNetworkConnectionLost userInfo:nil]];
+ fclose(file);
+ } else _assert(close(fds[0]));
+
+ NSURLResponse *response([[[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"text/html" expectedContentLength:-1 textEncodingName:nil] autorelease]);
+
+ [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
+ [client URLProtocol:self didLoadData:data];
+ [client URLProtocolDidFinishLoading:self];
+}
+
+- (void) stopLoading {
+}
+