OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 | 109 |
110 namespace crashpad { | 110 namespace crashpad { |
111 | 111 |
112 namespace { | 112 namespace { |
113 | 113 |
114 class HTTPTransportMac final : public HTTPTransport { | 114 class HTTPTransportMac final : public HTTPTransport { |
115 public: | 115 public: |
116 HTTPTransportMac(); | 116 HTTPTransportMac(); |
117 ~HTTPTransportMac() override; | 117 ~HTTPTransportMac() override; |
118 | 118 |
119 bool ExecuteSynchronously() override; | 119 bool ExecuteSynchronously(std::string* response_body) override; |
120 | 120 |
121 private: | 121 private: |
122 DISALLOW_COPY_AND_ASSIGN(HTTPTransportMac); | 122 DISALLOW_COPY_AND_ASSIGN(HTTPTransportMac); |
123 }; | 123 }; |
124 | 124 |
125 HTTPTransportMac::HTTPTransportMac() : HTTPTransport() { | 125 HTTPTransportMac::HTTPTransportMac() : HTTPTransport() { |
126 } | 126 } |
127 | 127 |
128 HTTPTransportMac::~HTTPTransportMac() { | 128 HTTPTransportMac::~HTTPTransportMac() { |
129 } | 129 } |
130 | 130 |
131 bool HTTPTransportMac::ExecuteSynchronously() { | 131 bool HTTPTransportMac::ExecuteSynchronously(std::string* response_body) { |
132 DCHECK(body_stream()); | 132 DCHECK(body_stream()); |
133 | 133 |
134 @autoreleasepool { | 134 @autoreleasepool { |
135 NSString* url_ns_string = base::SysUTF8ToNSString(url()); | 135 NSString* url_ns_string = base::SysUTF8ToNSString(url()); |
136 NSURL* url = [NSURL URLWithString:url_ns_string]; | 136 NSURL* url = [NSURL URLWithString:url_ns_string]; |
137 NSMutableURLRequest* request = | 137 NSMutableURLRequest* request = |
138 [NSMutableURLRequest requestWithURL:url | 138 [NSMutableURLRequest requestWithURL:url |
139 cachePolicy:NSURLRequestUseProtocolCachePolicy | 139 cachePolicy:NSURLRequestUseProtocolCachePolicy |
140 timeoutInterval:timeout()]; | 140 timeoutInterval:timeout()]; |
141 [request setHTTPMethod:base::SysUTF8ToNSString(method())]; | 141 [request setHTTPMethod:base::SysUTF8ToNSString(method())]; |
142 | 142 |
143 for (const auto& pair : headers()) { | 143 for (const auto& pair : headers()) { |
144 [request setValue:base::SysUTF8ToNSString(pair.second) | 144 [request setValue:base::SysUTF8ToNSString(pair.second) |
145 forHTTPHeaderField:base::SysUTF8ToNSString(pair.first)]; | 145 forHTTPHeaderField:base::SysUTF8ToNSString(pair.first)]; |
146 } | 146 } |
147 | 147 |
148 base::scoped_nsobject<CrashpadHTTPBodyStreamTransport> transport( | 148 base::scoped_nsobject<CrashpadHTTPBodyStreamTransport> transport( |
149 [[CrashpadHTTPBodyStreamTransport alloc] initWithBodyStream: | 149 [[CrashpadHTTPBodyStreamTransport alloc] initWithBodyStream: |
150 body_stream()]); | 150 body_stream()]); |
151 [request setHTTPBodyStream:transport.get()]; | 151 [request setHTTPBodyStream:transport.get()]; |
152 | 152 |
153 NSURLResponse* response = nil; | 153 NSURLResponse* response = nil; |
154 NSError* error = nil; | 154 NSError* error = nil; |
155 [NSURLConnection sendSynchronousRequest:request | 155 NSData* body = [NSURLConnection sendSynchronousRequest:request |
156 returningResponse:&response | 156 returningResponse:&response |
157 error:&error]; | 157 error:&error]; |
158 | 158 |
159 if (error) { | 159 if (error) { |
160 LOG(ERROR) << [[error localizedDescription] UTF8String] << " (" | 160 LOG(ERROR) << [[error localizedDescription] UTF8String] << " (" |
161 << [[error domain] UTF8String] << " " << [error code] << ")"; | 161 << [[error domain] UTF8String] << " " << [error code] << ")"; |
162 return false; | 162 return false; |
163 } | 163 } |
164 if (!response) { | 164 if (!response) { |
165 LOG(ERROR) << "no response"; | 165 LOG(ERROR) << "no response"; |
166 return false; | 166 return false; |
167 } | 167 } |
168 NSHTTPURLResponse* http_response = | 168 NSHTTPURLResponse* http_response = |
169 base::mac::ObjCCast<NSHTTPURLResponse>(response); | 169 base::mac::ObjCCast<NSHTTPURLResponse>(response); |
170 if (!http_response) { | 170 if (!http_response) { |
171 LOG(ERROR) << "no http_response"; | 171 LOG(ERROR) << "no http_response"; |
172 return false; | 172 return false; |
173 } | 173 } |
174 NSInteger http_status = [http_response statusCode]; | 174 NSInteger http_status = [http_response statusCode]; |
175 if (http_status != 200) { | 175 if (http_status != 200) { |
176 LOG(ERROR) << base::StringPrintf("HTTP status %ld", | 176 LOG(ERROR) << base::StringPrintf("HTTP status %ld", |
177 implicit_cast<long>(http_status)); | 177 implicit_cast<long>(http_status)); |
178 return false; | 178 return false; |
179 } | 179 } |
180 | 180 |
| 181 if (response_body) { |
| 182 response_body->assign(static_cast<const char*>([body bytes]), |
| 183 [body length]); |
| 184 } |
| 185 |
181 return true; | 186 return true; |
182 } | 187 } |
183 } | 188 } |
184 | 189 |
185 } // namespace | 190 } // namespace |
186 | 191 |
187 // static | 192 // static |
188 scoped_ptr<HTTPTransport> HTTPTransport::Create() { | 193 scoped_ptr<HTTPTransport> HTTPTransport::Create() { |
189 return scoped_ptr<HTTPTransport>(new HTTPTransportMac()); | 194 return scoped_ptr<HTTPTransport>(new HTTPTransportMac()); |
190 } | 195 } |
191 | 196 |
192 } // namespace crashpad | 197 } // namespace crashpad |
OLD | NEW |