| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Web request notifier implementation. | 5 // Web request notifier implementation. |
| 6 #include "ceee/ie/plugin/bho/webrequest_notifier.h" | 6 #include "ceee/ie/plugin/bho/webrequest_notifier.h" |
| 7 | 7 |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/scoped_ptr.h" | 9 #include "base/scoped_ptr.h" |
| 10 #include "chrome_frame/function_stub.h" | 10 #include "chrome_frame/function_stub.h" |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 DWORD error = patch_function->Patch(kUrlMonModuleName, kWinINetModuleName, | 155 DWORD error = patch_function->Patch(kUrlMonModuleName, kWinINetModuleName, |
| 156 name, handler); | 156 name, handler); |
| 157 // The patching operation is either successful, or failed cleanly. | 157 // The patching operation is either successful, or failed cleanly. |
| 158 DCHECK(error == NO_ERROR || !patch_function->is_patched()); | 158 DCHECK(error == NO_ERROR || !patch_function->is_patched()); |
| 159 } | 159 } |
| 160 | 160 |
| 161 INTERNET_STATUS_CALLBACK STDAPICALLTYPE | 161 INTERNET_STATUS_CALLBACK STDAPICALLTYPE |
| 162 WebRequestNotifier::InternetSetStatusCallbackAPatch( | 162 WebRequestNotifier::InternetSetStatusCallbackAPatch( |
| 163 HINTERNET internet, | 163 HINTERNET internet, |
| 164 INTERNET_STATUS_CALLBACK callback) { | 164 INTERNET_STATUS_CALLBACK callback) { |
| 165 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 165 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 166 INTERNET_STATUS_CALLBACK new_callback = | 166 INTERNET_STATUS_CALLBACK new_callback = |
| 167 instance->HandleBeforeInternetSetStatusCallback(internet, callback); | 167 instance->HandleBeforeInternetSetStatusCallback(internet, callback); |
| 168 return ::InternetSetStatusCallbackA(internet, new_callback); | 168 return ::InternetSetStatusCallbackA(internet, new_callback); |
| 169 } | 169 } |
| 170 | 170 |
| 171 INTERNET_STATUS_CALLBACK STDAPICALLTYPE | 171 INTERNET_STATUS_CALLBACK STDAPICALLTYPE |
| 172 WebRequestNotifier::InternetSetStatusCallbackWPatch( | 172 WebRequestNotifier::InternetSetStatusCallbackWPatch( |
| 173 HINTERNET internet, | 173 HINTERNET internet, |
| 174 INTERNET_STATUS_CALLBACK callback) { | 174 INTERNET_STATUS_CALLBACK callback) { |
| 175 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 175 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 176 INTERNET_STATUS_CALLBACK new_callback = | 176 INTERNET_STATUS_CALLBACK new_callback = |
| 177 instance->HandleBeforeInternetSetStatusCallback(internet, callback); | 177 instance->HandleBeforeInternetSetStatusCallback(internet, callback); |
| 178 return ::InternetSetStatusCallbackW(internet, new_callback); | 178 return ::InternetSetStatusCallbackW(internet, new_callback); |
| 179 } | 179 } |
| 180 | 180 |
| 181 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectAPatch( | 181 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectAPatch( |
| 182 HINTERNET internet, | 182 HINTERNET internet, |
| 183 LPCSTR server_name, | 183 LPCSTR server_name, |
| 184 INTERNET_PORT server_port, | 184 INTERNET_PORT server_port, |
| 185 LPCSTR user_name, | 185 LPCSTR user_name, |
| 186 LPCSTR password, | 186 LPCSTR password, |
| 187 DWORD service, | 187 DWORD service, |
| 188 DWORD flags, | 188 DWORD flags, |
| 189 DWORD_PTR context) { | 189 DWORD_PTR context) { |
| 190 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 190 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 191 instance->HandleBeforeInternetConnect(internet); | 191 instance->HandleBeforeInternetConnect(internet); |
| 192 | 192 |
| 193 HINTERNET server = ::InternetConnectA(internet, server_name, server_port, | 193 HINTERNET server = ::InternetConnectA(internet, server_name, server_port, |
| 194 user_name, password, service, flags, | 194 user_name, password, service, flags, |
| 195 context); | 195 context); |
| 196 | 196 |
| 197 instance->HandleAfterInternetConnect(server, CA2W(server_name), server_port, | 197 instance->HandleAfterInternetConnect(server, CA2W(server_name), server_port, |
| 198 service); | 198 service); |
| 199 return server; | 199 return server; |
| 200 } | 200 } |
| 201 | 201 |
| 202 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectWPatch( | 202 HINTERNET STDAPICALLTYPE WebRequestNotifier::InternetConnectWPatch( |
| 203 HINTERNET internet, | 203 HINTERNET internet, |
| 204 LPCWSTR server_name, | 204 LPCWSTR server_name, |
| 205 INTERNET_PORT server_port, | 205 INTERNET_PORT server_port, |
| 206 LPCWSTR user_name, | 206 LPCWSTR user_name, |
| 207 LPCWSTR password, | 207 LPCWSTR password, |
| 208 DWORD service, | 208 DWORD service, |
| 209 DWORD flags, | 209 DWORD flags, |
| 210 DWORD_PTR context) { | 210 DWORD_PTR context) { |
| 211 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 211 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 212 instance->HandleBeforeInternetConnect(internet); | 212 instance->HandleBeforeInternetConnect(internet); |
| 213 | 213 |
| 214 HINTERNET server = ::InternetConnectW(internet, server_name, server_port, | 214 HINTERNET server = ::InternetConnectW(internet, server_name, server_port, |
| 215 user_name, password, service, flags, | 215 user_name, password, service, flags, |
| 216 context); | 216 context); |
| 217 | 217 |
| 218 instance->HandleAfterInternetConnect(server, server_name, server_port, | 218 instance->HandleAfterInternetConnect(server, server_name, server_port, |
| 219 service); | 219 service); |
| 220 return server; | 220 return server; |
| 221 } | 221 } |
| 222 | 222 |
| 223 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestAPatch( | 223 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestAPatch( |
| 224 HINTERNET connect, | 224 HINTERNET connect, |
| 225 LPCSTR verb, | 225 LPCSTR verb, |
| 226 LPCSTR object_name, | 226 LPCSTR object_name, |
| 227 LPCSTR version, | 227 LPCSTR version, |
| 228 LPCSTR referrer, | 228 LPCSTR referrer, |
| 229 LPCSTR* accept_types, | 229 LPCSTR* accept_types, |
| 230 DWORD flags, | 230 DWORD flags, |
| 231 DWORD_PTR context) { | 231 DWORD_PTR context) { |
| 232 HINTERNET request = ::HttpOpenRequestA(connect, verb, object_name, version, | 232 HINTERNET request = ::HttpOpenRequestA(connect, verb, object_name, version, |
| 233 referrer, accept_types, flags, | 233 referrer, accept_types, flags, |
| 234 context); | 234 context); |
| 235 | 235 |
| 236 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 236 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 237 instance->HandleAfterHttpOpenRequest(connect, request, verb, | 237 instance->HandleAfterHttpOpenRequest(connect, request, verb, |
| 238 CA2W(object_name), flags); | 238 CA2W(object_name), flags); |
| 239 return request; | 239 return request; |
| 240 } | 240 } |
| 241 | 241 |
| 242 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestWPatch( | 242 HINTERNET STDAPICALLTYPE WebRequestNotifier::HttpOpenRequestWPatch( |
| 243 HINTERNET connect, | 243 HINTERNET connect, |
| 244 LPCWSTR verb, | 244 LPCWSTR verb, |
| 245 LPCWSTR object_name, | 245 LPCWSTR object_name, |
| 246 LPCWSTR version, | 246 LPCWSTR version, |
| 247 LPCWSTR referrer, | 247 LPCWSTR referrer, |
| 248 LPCWSTR* accept_types, | 248 LPCWSTR* accept_types, |
| 249 DWORD flags, | 249 DWORD flags, |
| 250 DWORD_PTR context) { | 250 DWORD_PTR context) { |
| 251 HINTERNET request = ::HttpOpenRequestW(connect, verb, object_name, version, | 251 HINTERNET request = ::HttpOpenRequestW(connect, verb, object_name, version, |
| 252 referrer, accept_types, flags, | 252 referrer, accept_types, flags, |
| 253 context); | 253 context); |
| 254 | 254 |
| 255 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 255 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 256 instance->HandleAfterHttpOpenRequest(connect, request, CW2A(verb), | 256 instance->HandleAfterHttpOpenRequest(connect, request, CW2A(verb), |
| 257 object_name, flags); | 257 object_name, flags); |
| 258 return request; | 258 return request; |
| 259 } | 259 } |
| 260 | 260 |
| 261 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestAPatch( | 261 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestAPatch( |
| 262 HINTERNET request, | 262 HINTERNET request, |
| 263 LPCSTR headers, | 263 LPCSTR headers, |
| 264 DWORD headers_length, | 264 DWORD headers_length, |
| 265 LPVOID optional, | 265 LPVOID optional, |
| 266 DWORD optional_length) { | 266 DWORD optional_length) { |
| 267 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 267 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 268 instance->HandleBeforeHttpSendRequest(request); | 268 instance->HandleBeforeHttpSendRequest(request); |
| 269 return ::HttpSendRequestA(request, headers, headers_length, optional, | 269 return ::HttpSendRequestA(request, headers, headers_length, optional, |
| 270 optional_length); | 270 optional_length); |
| 271 } | 271 } |
| 272 | 272 |
| 273 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestWPatch( | 273 BOOL STDAPICALLTYPE WebRequestNotifier::HttpSendRequestWPatch( |
| 274 HINTERNET request, | 274 HINTERNET request, |
| 275 LPCWSTR headers, | 275 LPCWSTR headers, |
| 276 DWORD headers_length, | 276 DWORD headers_length, |
| 277 LPVOID optional, | 277 LPVOID optional, |
| 278 DWORD optional_length) { | 278 DWORD optional_length) { |
| 279 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 279 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 280 instance->HandleBeforeHttpSendRequest(request); | 280 instance->HandleBeforeHttpSendRequest(request); |
| 281 return ::HttpSendRequestW(request, headers, headers_length, optional, | 281 return ::HttpSendRequestW(request, headers, headers_length, optional, |
| 282 optional_length); | 282 optional_length); |
| 283 } | 283 } |
| 284 | 284 |
| 285 void CALLBACK WebRequestNotifier::InternetStatusCallbackPatch( | 285 void CALLBACK WebRequestNotifier::InternetStatusCallbackPatch( |
| 286 INTERNET_STATUS_CALLBACK original, | 286 INTERNET_STATUS_CALLBACK original, |
| 287 HINTERNET internet, | 287 HINTERNET internet, |
| 288 DWORD_PTR context, | 288 DWORD_PTR context, |
| 289 DWORD internet_status, | 289 DWORD internet_status, |
| 290 LPVOID status_information, | 290 LPVOID status_information, |
| 291 DWORD status_information_length) { | 291 DWORD status_information_length) { |
| 292 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 292 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 293 instance->HandleBeforeInternetStatusCallback(original, internet, context, | 293 instance->HandleBeforeInternetStatusCallback(original, internet, context, |
| 294 internet_status, | 294 internet_status, |
| 295 status_information, | 295 status_information, |
| 296 status_information_length); | 296 status_information_length); |
| 297 original(internet, context, internet_status, status_information, | 297 original(internet, context, internet_status, status_information, |
| 298 status_information_length); | 298 status_information_length); |
| 299 } | 299 } |
| 300 | 300 |
| 301 BOOL STDAPICALLTYPE WebRequestNotifier::InternetReadFilePatch( | 301 BOOL STDAPICALLTYPE WebRequestNotifier::InternetReadFilePatch( |
| 302 HINTERNET file, | 302 HINTERNET file, |
| 303 LPVOID buffer, | 303 LPVOID buffer, |
| 304 DWORD number_of_bytes_to_read, | 304 DWORD number_of_bytes_to_read, |
| 305 LPDWORD number_of_bytes_read) { | 305 LPDWORD number_of_bytes_read) { |
| 306 BOOL result = ::InternetReadFile(file, buffer, number_of_bytes_to_read, | 306 BOOL result = ::InternetReadFile(file, buffer, number_of_bytes_to_read, |
| 307 number_of_bytes_read); | 307 number_of_bytes_read); |
| 308 WebRequestNotifier* instance = ProductionWebRequestNotifier::get(); | 308 WebRequestNotifier* instance = ProductionWebRequestNotifier::GetInstance(); |
| 309 instance->HandleAfterInternetReadFile(file, result, number_of_bytes_read); | 309 instance->HandleAfterInternetReadFile(file, result, number_of_bytes_read); |
| 310 | 310 |
| 311 return result; | 311 return result; |
| 312 } | 312 } |
| 313 | 313 |
| 314 INTERNET_STATUS_CALLBACK | 314 INTERNET_STATUS_CALLBACK |
| 315 WebRequestNotifier::HandleBeforeInternetSetStatusCallback( | 315 WebRequestNotifier::HandleBeforeInternetSetStatusCallback( |
| 316 HINTERNET internet, | 316 HINTERNET internet, |
| 317 INTERNET_STATUS_CALLBACK internet_callback) { | 317 INTERNET_STATUS_CALLBACK internet_callback) { |
| 318 CComCritSecLock<CComAutoCriticalSection> lock(critical_section_); | 318 CComCritSecLock<CComAutoCriticalSection> lock(critical_section_); |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 NOTREACHED(); | 806 NOTREACHED(); |
| 807 break; | 807 break; |
| 808 } | 808 } |
| 809 | 809 |
| 810 if (fire_on_error_occurred) { | 810 if (fire_on_error_occurred) { |
| 811 webrequest_events_funnel().OnErrorOccurred( | 811 webrequest_events_funnel().OnErrorOccurred( |
| 812 info->id, info->url.c_str(), L"", base::Time::Now()); | 812 info->id, info->url.c_str(), L"", base::Time::Now()); |
| 813 } | 813 } |
| 814 info->state = next_state; | 814 info->state = next_state; |
| 815 } | 815 } |
| 816 |
| 817 // static |
| 818 ProductionWebRequestNotifier* ProductionWebRequestNotifier::GetInstance() { |
| 819 return Singleton<ProductionWebRequestNotifier>::get(); |
| 820 } |
| OLD | NEW |