Expanded open file functionality to use available apps.
[pithos-ios] / Classes / APILogEntry.m
1 //
2 //  APILogEntry.m
3 //  OpenStack
4 //
5 //  Created by Mike Mayo on 10/11/10.
6 //  The OpenStack project is provided under the Apache 2.0 license.
7 //
8
9 #import "APILogEntry.h"
10 #import "OpenStackRequest.h"
11
12
13 @implementation APILogEntry
14
15 @synthesize requestMethod, requestBody, requestHeaders, responseStatusCode, responseHeaders, 
16             responseBody, requestDate, responseStatusMessage, url;
17
18 - (id)initWithRequest:(OpenStackRequest *)request {
19     self = [super init];
20     if (self) {
21         
22         if ([request requestMethod] != nil) {
23             requestMethod = [[NSString alloc] initWithString:[request requestMethod]];
24         }
25         
26         requestBody = [[NSString alloc] initWithData:request.postBody encoding:NSASCIIStringEncoding];
27         requestHeaders = [[NSDictionary alloc] initWithDictionary:request.requestHeaders];
28         responseStatusCode = [request responseStatusCode];
29         responseHeaders = [[NSDictionary alloc] initWithDictionary:request.responseHeaders];
30         
31         if ([request responseString] != nil) {
32             responseBody = [[NSString alloc] initWithString:[request responseString]];
33         }
34         
35         requestDate = [[NSDate alloc] init];
36         
37         if ([request responseStatusMessage] != nil) {
38             responseStatusMessage = [[NSString alloc] initWithString:[request responseStatusMessage]];
39         }
40         
41         url = [request.url retain];
42     }
43     return self;
44 }
45
46 #pragma mark -
47 #pragma mark Serialization
48
49 - (void)encodeWithCoder: (NSCoder *)coder {
50     [coder encodeObject:requestMethod forKey:@"requestMethod"];
51     [coder encodeObject:requestBody forKey:@"requestBody"];
52     [coder encodeObject:requestHeaders forKey:@"requestHeaders"];
53     [coder encodeInt:responseStatusCode forKey:@"responseStatusCode"];
54     [coder encodeObject:responseHeaders forKey:@"responseHeaders"];
55     [coder encodeObject:responseBody forKey:@"responseBody"];
56     [coder encodeObject:requestDate forKey:@"requestDate"];
57     [coder encodeObject:responseStatusMessage forKey:@"responseStatusMessage"];
58     [coder encodeObject:url forKey:@"url"];
59 }
60
61 - (id)initWithCoder:(NSCoder *)coder {
62     self = [super init];
63     if (self) {
64         requestMethod = [[coder decodeObjectForKey:@"requestMethod"] retain];
65         requestBody = [[coder decodeObjectForKey:@"requestBody"] retain];
66         requestHeaders = [[coder decodeObjectForKey:@"requestHeaders"] retain];
67         responseStatusCode = [coder decodeIntForKey:@"responseStatusCode"];
68         responseHeaders = [[coder decodeObjectForKey:@"responseHeaders"] retain];
69         responseBody = [[coder decodeObjectForKey:@"responseBody"] retain];
70         requestDate = [[coder decodeObjectForKey:@"requestDate"] retain];
71         responseStatusMessage = [[coder decodeObjectForKey:@"responseStatusMessage"] retain];
72         url = [[coder decodeObjectForKey:@"url"] retain];
73     }
74     return self;
75 }
76
77 - (NSString *)requestDescription {
78     NSString *description = @"curl -verbose -X ";
79     
80     description = [description stringByAppendingString:requestMethod];
81     
82     NSArray *keys = [requestHeaders allKeys];
83     for (int i = 0; i < [keys count]; i++) {
84         NSString *key = [keys objectAtIndex:i];
85         NSString *value = [requestHeaders objectForKey:key];
86
87         // protect authentication info from being exposed
88         /**/
89         if ([key isEqualToString:@"X-Auth-Key"] || [key isEqualToString:@"X-Auth-Token"]) {
90             value = @"<secret>";
91         }
92         /**/
93         description = [description stringByAppendingString:[NSString stringWithFormat:@" -H \"%@: %@\"", key, value]];
94     }
95
96     if (requestBody && ![@"" isEqualToString:requestBody]) {
97         description = [description stringByAppendingString:[NSString stringWithFormat:@" -d \"%@\"", requestBody]];
98     }
99     
100     description = [description stringByAppendingString:[NSString stringWithFormat:@" %@", url]];
101     
102     return description;
103 }
104
105 - (NSString *)responseDescription {
106     NSString *description = [NSString stringWithFormat:@"%@\n", responseStatusMessage];
107     
108     if (responseStatusCode == 0) {
109         description = @"No response";
110     } else {
111         NSArray *keys = [responseHeaders allKeys];
112         for (int i = 0; i < [keys count]; i++) {
113             NSString *key = [keys objectAtIndex:i];
114             NSString *value = [responseHeaders objectForKey:key];
115             
116             // protect authentication info from being exposed
117             if ([key isEqualToString:@"X-Auth-Key"] || [key isEqualToString:@"X-Auth-Token"] || [key isEqualToString:@"X-Storage-Token"]) {
118                 value = @"<secret>";
119             }
120             description = [description stringByAppendingString:[NSString stringWithFormat:@"%@: %@\n", key, value]];
121         }
122         
123         if (responseBody && ![@"" isEqualToString:responseBody]) {
124             description = [description stringByAppendingString:[NSString stringWithFormat:@"\n%@", responseBody]];
125         }
126     }
127     
128     return description;
129 }
130
131 #pragma mark -
132 #pragma mark Memory Management
133
134 - (void)dealloc {
135     [requestMethod release];
136     [requestBody release];
137     [requestHeaders release];
138     [responseHeaders release];
139     [responseBody release];
140     [requestDate release];
141     [responseStatusMessage release];
142     [url release];
143     [super dealloc];
144 }
145
146 @end