| OLD | NEW |
| 1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 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, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. | 13 // limitations under the License. |
| 14 | 14 |
| 15 #include "util/net/http_transport.h" | 15 #include "util/net/http_transport.h" |
| 16 | 16 |
| 17 #include <windows.h> | 17 #include <windows.h> |
| 18 #include <winhttp.h> | 18 #include <winhttp.h> |
| 19 | 19 |
| 20 #include "base/logging.h" | 20 #include "base/logging.h" |
| 21 #include "base/numerics/safe_conversions.h" |
| 21 #include "base/scoped_generic.h" | 22 #include "base/scoped_generic.h" |
| 22 #include "base/strings/stringprintf.h" | 23 #include "base/strings/stringprintf.h" |
| 23 #include "base/strings/utf_string_conversions.h" | 24 #include "base/strings/utf_string_conversions.h" |
| 24 #include "util/net/http_body.h" | 25 #include "util/net/http_body.h" |
| 25 #include "package.h" | 26 #include "package.h" |
| 26 | 27 |
| 27 namespace crashpad { | 28 namespace crashpad { |
| 28 | 29 |
| 29 namespace { | 30 namespace { |
| 30 | 31 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 142 0)); | 143 0)); |
| 143 if (!request.get()) { | 144 if (!request.get()) { |
| 144 LogErrorWinHttpMessage("WinHttpOpenRequest"); | 145 LogErrorWinHttpMessage("WinHttpOpenRequest"); |
| 145 return false; | 146 return false; |
| 146 } | 147 } |
| 147 | 148 |
| 148 // Add headers to the request. | 149 // Add headers to the request. |
| 149 for (const auto& pair : headers()) { | 150 for (const auto& pair : headers()) { |
| 150 std::wstring header_string = | 151 std::wstring header_string = |
| 151 base::UTF8ToUTF16(pair.first) + L": " + base::UTF8ToUTF16(pair.second); | 152 base::UTF8ToUTF16(pair.first) + L": " + base::UTF8ToUTF16(pair.second); |
| 152 if (!WinHttpAddRequestHeaders(request.get(), | 153 if (!WinHttpAddRequestHeaders( |
| 153 header_string.c_str(), | 154 request.get(), |
| 154 header_string.size(), | 155 header_string.c_str(), |
| 155 WINHTTP_ADDREQ_FLAG_ADD)) { | 156 base::checked_cast<DWORD>(header_string.size()), |
| 157 WINHTTP_ADDREQ_FLAG_ADD)) { |
| 156 LogErrorWinHttpMessage("WinHttpAddRequestHeaders"); | 158 LogErrorWinHttpMessage("WinHttpAddRequestHeaders"); |
| 157 return false; | 159 return false; |
| 158 } | 160 } |
| 159 } | 161 } |
| 160 | 162 |
| 161 // We need the Content-Length up front, so buffer in memory. We should modify | 163 // We need the Content-Length up front, so buffer in memory. We should modify |
| 162 // the interface to not require this, and then use WinHttpWriteData after | 164 // the interface to not require this, and then use WinHttpWriteData after |
| 163 // WinHttpSendRequest. | 165 // WinHttpSendRequest. |
| 164 std::vector<uint8_t> post_data; | 166 std::vector<uint8_t> post_data; |
| 165 | 167 |
| 166 // Write the body of a POST if any. | 168 // Write the body of a POST if any. |
| 167 const size_t kBufferSize = 4096; | 169 const size_t kBufferSize = 4096; |
| 168 for (;;) { | 170 for (;;) { |
| 169 uint8_t buffer[kBufferSize]; | 171 uint8_t buffer[kBufferSize]; |
| 170 ssize_t bytes_to_write = | 172 ssize_t bytes_to_write = |
| 171 body_stream()->GetBytesBuffer(buffer, sizeof(buffer)); | 173 body_stream()->GetBytesBuffer(buffer, sizeof(buffer)); |
| 172 if (bytes_to_write == 0) | 174 if (bytes_to_write == 0) |
| 173 break; | 175 break; |
| 174 post_data.insert(post_data.end(), buffer, buffer + bytes_to_write); | 176 post_data.insert(post_data.end(), buffer, buffer + bytes_to_write); |
| 175 } | 177 } |
| 176 | 178 |
| 177 if (!WinHttpSendRequest(request.get(), | 179 if (!WinHttpSendRequest(request.get(), |
| 178 WINHTTP_NO_ADDITIONAL_HEADERS, | 180 WINHTTP_NO_ADDITIONAL_HEADERS, |
| 179 0, | 181 0, |
| 180 &post_data[0], | 182 &post_data[0], |
| 181 post_data.size(), | 183 base::checked_cast<DWORD>(post_data.size()), |
| 182 post_data.size(), | 184 base::checked_cast<DWORD>(post_data.size()), |
| 183 0)) { | 185 0)) { |
| 184 LogErrorWinHttpMessage("WinHttpSendRequest"); | 186 LogErrorWinHttpMessage("WinHttpSendRequest"); |
| 185 return false; | 187 return false; |
| 186 } | 188 } |
| 187 | 189 |
| 188 if (!WinHttpReceiveResponse(request.get(), nullptr)) { | 190 if (!WinHttpReceiveResponse(request.get(), nullptr)) { |
| 189 LogErrorWinHttpMessage("WinHttpReceiveResponse"); | 191 LogErrorWinHttpMessage("WinHttpReceiveResponse"); |
| 190 return false; | 192 return false; |
| 191 } | 193 } |
| 192 | 194 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 } | 235 } |
| 234 | 236 |
| 235 } // namespace | 237 } // namespace |
| 236 | 238 |
| 237 // static | 239 // static |
| 238 scoped_ptr<HTTPTransport> HTTPTransport::Create() { | 240 scoped_ptr<HTTPTransport> HTTPTransport::Create() { |
| 239 return scoped_ptr<HTTPTransportWin>(new HTTPTransportWin); | 241 return scoped_ptr<HTTPTransportWin>(new HTTPTransportWin); |
| 240 } | 242 } |
| 241 | 243 |
| 242 } // namespace crashpad | 244 } // namespace crashpad |
| OLD | NEW |