forked from NSGod/ichm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCHMITSSURLProtocol.m
139 lines (93 loc) · 3.59 KB
/
CHMITSSURLProtocol.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//
// CHMITSSURLProtocol.m
// ichm
//
// Created by Robin Lu on 7/16/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import "CHMITSSURLProtocol.h"
#import "CHMDocumentFile.h"
#import "CHMKitPrivateInterfaces.h"
#define MD_DEBUG 0
#if MD_DEBUG
#define MDLog(...) NSLog(__VA_ARGS__)
#else
#define MDLog(...)
#endif
@implementation CHMITSSURLProtocol
- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id <NSURLProtocolClient>)client {
return [super initWithRequest:request cachedResponse:cachedResponse client:client];
}
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
return [[[request URL] scheme] isEqualToString:@"itss"];
}
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
return request;
}
-(void)stopLoading {
}
- (void)startLoading {
NSURL *URL = [[self request] URL];
MDLog(@"[%@ %@] URL == %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), URL);
CHMDocumentFile *documentFile = [[self request] documentFile];
NSString *encodingName = [[self request] encodingName];
if (documentFile == nil) {
[[self client] URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:nil]];
return;
}
NSString *path;
if ([URL parameterString]) {
path = [NSString stringWithFormat:@"%@;%@", [URL path], [URL parameterString]];
} else {
path = [URL path];
}
if (![documentFile hasObjectAtPath:path]) {
path = [path stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
NSData *data = [documentFile dataForObjectAtPath:path];
if (data == nil) {
[[self client] URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:nil]];
return;
}
NSString *type = nil;
NSString *extension = [[path pathExtension] lowercaseString];
if ([extension isEqualToString:@"html"] ||
[extension isEqualToString:@"htm"]) {
type = @"text/html";
}
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:URL
MIMEType:type
expectedContentLength:data.length
textEncodingName:encodingName];
[[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[[self client] URLProtocol:self didLoadData:data];
[[self client] URLProtocolDidFinishLoading:self];
[response release];
}
@end
@implementation NSURLRequest (CHMITSSURLProtocol)
- (CHMDocumentFile *)documentFile {
return [NSURLProtocol propertyForKey:@"chm__documentFile" inRequest:self];
}
- (NSString *)encodingName {
return [NSURLProtocol propertyForKey:@"chm__encodingName" inRequest:self];
}
@end
@implementation NSMutableURLRequest (CHMITSSURLProtocol)
- (void)setDocumentFile:(CHMDocumentFile *)aDocumentFile {
[NSURLProtocol setProperty:aDocumentFile forKey:@"chm__documentFile" inRequest:self];
}
- (void)setEncodingName:(NSString *)name {
[NSURLProtocol setProperty:name forKey:@"chm__encodingName" inRequest:self];
}
@end
@implementation NSURL (CHMITSSURLProtocol)
// create a composed URL (itss://chm/*) for an item at the specified path:
+ (NSURL *)chm__ITSSURLWithPath:(NSString *)aPath {
if ([NSThread isMainThread]) MDLog(@"[%@ %@] path == %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), aPath);
aPath = [aPath chm__stringByDeletingLeadingSlashes];
NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"itss://chm/%@", aPath]];
if (URL == nil) URL = [NSURL URLWithString:[NSString stringWithFormat:@"itss://chm/%@", [aPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
return URL;
}
@end