blob: 096770d7bfa29bdc3015a6fa79f6d87b11b31af5 [file] [log] [blame]
Mark Slee2ac60ed2007-09-19 21:10:18 +00001#import "THTTPClient.h"
2#import "TTransportException.h"
3
4@implementation THTTPClient
5
6- (id) initWithURL: (NSURL *) aURL
7{
8 self = [super init];
9 mURL = [aURL retain];
10
11 // set up our request object that we'll use for each request
12 mRequest = [[NSMutableURLRequest alloc] initWithURL: mURL];
13 [mRequest setHTTPMethod: @"POST"];
14 [mRequest setValue: @"application/x-thrift" forHTTPHeaderField: @"Content-Type"];
15 [mRequest setValue: @"application/x-thrift" forHTTPHeaderField: @"Accept"];
16 [mRequest setValue: @"Cocoa/THTTPClient" forHTTPHeaderField: @"User-Agent"];
17 [mRequest setCachePolicy: NSURLRequestReloadIgnoringCacheData];
18
19 // create our request data buffer
20 mRequestData = [[NSMutableData alloc] initWithCapacity: 1024];
21
22 return self;
23}
24
25
26- (id) initWithURL: (NSURL *) aURL
27 timeout: (int) timeout
28{
29 self = [self initWithURL: aURL];
30
31 [mRequest setTimeoutInterval: timeout];
32
33 return self;
34}
35
36
37- (void) dealloc
38{
39 [mURL release];
40 [mRequest release];
41 [mRequestData release];
42 [super dealloc];
43}
44
45
46- (int) readAll: (uint8_t *) buf offset: (int) off length: (int) len
47{
48 NSRange r;
49 r.location = mResponseDataOffset;
50 r.length = len;
51
52 [mResponseData getBytes: buf+off range: r];
53 mResponseDataOffset += len;
54
55 return len;
56}
57
58
59- (void) write: (const uint8_t *) data offset: (unsigned int) offset length: (unsigned int) length
60{
61 [mRequestData appendBytes: data+offset length: length];
62}
63
64
65- (void) flush
66{
67 [mRequest setHTTPBody: mRequestData]; // not sure if it copies the data
68
69 // make the HTTP request
70 NSURLResponse * response;
71 NSError * error;
72 NSData * responseData =
73 [NSURLConnection sendSynchronousRequest: mRequest returningResponse: &response error: &error];
74
75 [mRequestData setLength: 0];
76
77 if (responseData == nil) {
78 @throw [TTransportException exceptionWithName: @"Could not make HTTP request"
79 reason: @"unknown"
80 error: error];
81 }
82 if (![response isKindOfClass: [NSHTTPURLResponse class]]) {
83 @throw [TTransportException exceptionWithName: @"Unexpected NSURLResponse type"];
84 }
85
86 NSHTTPURLResponse * httpResponse = (NSHTTPURLResponse *) response;
87 if ([httpResponse statusCode] != 200) {
88 @throw [TTransportException exceptionWithName:
89 [NSString stringWithFormat: @"Bad response from HTTP server: %d",
90 [httpResponse statusCode]]];
91 }
92
93 // phew!
94 [mResponseData release];
95 mResponseData = [responseData retain];
96 mResponseDataOffset = 0;
97}
98
99
100@end