66// Copyright 2011 Iridia Productions. All rights reserved.
77//
88
9+ #import < objc/runtime.h>
910#import " IRWebAPIEngine+FormMultipart.h"
10-
1111#import " IRWebAPIEngine+LocalCaching.h"
12+ #import " IRWebAPIHelpers.h"
1213
1314NSString * const kIRWebAPIEngineRequestContextFormMultipartFieldsKey = @" kIRWebAPIEngineRequestContextFormMultipartFieldsKey" ;
1415
16+ static NSString * const kFormMultipartFields = @" -[IRWebAPIRequestContext(FormMultipart) formMultipartFields]" ;
17+
18+ @implementation IRWebAPIRequestContext (FormMultipart)
19+
20+ - (NSDictionary *) formMultipartFields {
21+
22+ NSMutableDictionary *formMultipartFields = objc_getAssociatedObject (self, &kFormMultipartFields );
23+
24+ if (!formMultipartFields) {
25+ formMultipartFields = [NSMutableDictionary dictionary ];
26+ objc_setAssociatedObject (self, &kFormMultipartFields , formMultipartFields, OBJC_ASSOCIATION_RETAIN_NONATOMIC );
27+ }
28+
29+ return [formMultipartFields copy ];
30+
31+ }
32+
33+ - (void ) removeAllFormMultipartFieldValues {
34+
35+ [self willChangeValueForKey: @" formMultipartFields" ];
36+ objc_setAssociatedObject (self, &kFormMultipartFields , nil , OBJC_ASSOCIATION_ASSIGN );
37+ [self didChangeValueForKey: @" formMultipartFields" ];
38+
39+ }
40+
41+ - (void ) setValue : (id )obj forFormMultipartField : (NSString *)key {
42+
43+ NSMutableDictionary *formMultipartFields = objc_getAssociatedObject (self, &kFormMultipartFields );
44+
45+ if (!formMultipartFields) {
46+ formMultipartFields = [NSMutableDictionary dictionary ];
47+ objc_setAssociatedObject (self, &kFormMultipartFields , formMultipartFields, OBJC_ASSOCIATION_RETAIN_NONATOMIC );
48+ }
49+
50+ [self willChangeValueForKey: @" formMultipartFields" ];
51+
52+ if (obj) {
53+ [formMultipartFields setObject: obj forKey: key];
54+ } else {
55+ [formMultipartFields removeObjectForKey: key];
56+ }
57+
58+ [self didChangeValueForKey: @" formMultipartFields" ];
59+
60+ }
61+
62+ @end
63+
1564@implementation IRWebAPIEngine (FormMultipart)
1665
1766+ (IRWebAPIRequestContextTransformer) defaultFormMultipartTransformer {
1867
19- return [(^ (NSDictionary *inOriginalContext ) {
68+ return [(^ (IRWebAPIRequestContext *context ) {
2069
21- NSDictionary *formNamesToContents = [inOriginalContext objectForKey: kIRWebAPIEngineRequestContextFormMultipartFieldsKey ];
22-
23- if (!formNamesToContents || ([formNamesToContents count ] == 0 ))
24- return inOriginalContext;
70+ NSDictionary *formNamesToContents = context.formMultipartFields ;
2571
26- NSMutableDictionary *returnedContext = [inOriginalContext mutableCopy ];
72+ if (![formNamesToContents count ])
73+ return context;
2774
2875 NSError *error;
2976 NSURL *fileHandleURL = [[self class ] newTemporaryFileURL ];
3077
3178 if (![[NSFileManager defaultManager ] createFileAtPath: [fileHandleURL path ] contents: [NSData data ] attributes: nil ]) {
32-
3379 NSLog (@" Error creating file for URL %@ ." , fileHandleURL);
34- return (NSDictionary *)returnedContext;
35-
80+ return context;
3681 }
3782
3883 NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingToURL: fileHandleURL error: &error];
3984 if (!fileHandle) {
40-
4185 NSLog (@" Error grabbing file handle for URL %@ : %@ " , fileHandleURL, error);
42- return (NSDictionary *)returnedContext;
43-
86+ return context;
4487 }
4588
4689 [fileHandle truncateFileAtOffset: 0 ];
4790 [fileHandle seekToEndOfFile ];
4891
49-
50- NSMutableDictionary *headerFields = [returnedContext objectForKey: kIRWebAPIEngineRequestHTTPHeaderFields ];
51- if (!headerFields) {
52-
53- headerFields = [NSMutableDictionary dictionary ];
54- [returnedContext setObject: headerFields forKey: kIRWebAPIEngineRequestHTTPHeaderFields ];
55-
56- }
57-
58- [headerFields setObject: @" 8bit" forKey: @" Content-Transfer-Encoding" ];
59-
92+ [context setValue: @" 8bit" forHeaderField: @" Content-Transfer-Encoding" ];
6093
6194 NSString *mineBoundary = [NSString stringWithFormat: @" ----_=_%@ _%@ _%@ _=_----" ,
6295
@@ -70,7 +103,8 @@ + (IRWebAPIRequestContextTransformer) defaultFormMultipartTransformer {
70103 NSData *newLineData = [@" \r\n " dataUsingEncoding: NSUTF8StringEncoding];
71104 NSData *separatorData = [@" --" dataUsingEncoding: NSUTF8StringEncoding];
72105
73- [headerFields setObject: [NSString stringWithFormat: @" multipart/form-data; boundary=%@ " , mineBoundary] forKey: @" Content-Type" ];
106+ NSString *contentType = [NSString stringWithFormat: @" multipart/form-data; boundary=%@ " , mineBoundary];
107+ [context setValue: contentType forHeaderField: @" Content-Type" ];
74108
75109 // Start writing
76110
@@ -148,24 +182,12 @@ + (IRWebAPIRequestContextTransformer) defaultFormMultipartTransformer {
148182
149183 [fileHandle closeFile ];
150184
151- [returnedContext setObject: [NSData dataWithContentsOfMappedFile: [fileHandleURL path ]] forKey: kIRWebAPIEngineRequestHTTPBody ];
152-
153-
154- NSMutableArray *temporaryFileURLs = [returnedContext objectForKey: kIRWebAPIEngineRequestContextLocalCachingTemporaryFileURLsKey ];
155- if (!temporaryFileURLs) {
156-
157- temporaryFileURLs = [NSMutableArray array ];
158- [returnedContext setObject: temporaryFileURLs forKey: kIRWebAPIEngineRequestContextLocalCachingTemporaryFileURLsKey ];
159-
160- }
161-
162- [temporaryFileURLs addObject: fileHandleURL];
163-
164- [returnedContext setObject: temporaryFileURLs forKey: kIRWebAPIEngineRequestContextLocalCachingTemporaryFileURLsKey ];
165- [returnedContext removeObjectForKey: kIRWebAPIEngineRequestContextFormMultipartFieldsKey ];
166- [returnedContext setObject: @" POST" forKey: kIRWebAPIEngineRequestHTTPMethod ];
185+ [context setBody: [NSData dataWithContentsOfMappedFile: [fileHandleURL path ]]];
186+ [context addCacheFileURL: fileHandleURL];
187+ [context removeAllFormMultipartFieldValues ];
188+ [context setMethod: @" POST" ];
167189
168- return ( NSDictionary *)returnedContext ;
190+ return context ;
169191
170192 }) copy ];
171193
0 commit comments