⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asynchttprequest.cc

📁 本人收集整理的一份c/c++跨平台网络库
💻 CC
字号:
#include "common.h"#include "firewallsocketserver.h"#include "logging.h"#include "physicalsocketserver.h"#include "socketadapters.h"#include "socketpool.h"#include "ssladapter.h"#include "asynchttprequest.h"using namespace utils_base;///////////////////////////////////////////////////////////////////////////////// HttpMonitor///////////////////////////////////////////////////////////////////////////////HttpMonitor::HttpMonitor(SocketServer *ss) {  ASSERT(talk_base::Thread::Current() != NULL);  ss_ = ss;  reset();}void HttpMonitor::Connect(utils_base::HttpClient *http) {  http->SignalHttpClientComplete.connect(this,    &HttpMonitor::OnHttpClientComplete);}void HttpMonitor::OnHttpClientComplete(utils_base::HttpClient * http, int err) {  complete_ = true;  err_ = err;  ss_->WakeUp();}///////////////////////////////////////////////////////////////////////////////// SslSocketFactory///////////////////////////////////////////////////////////////////////////////utils_base::Socket * SslSocketFactory::CreateSocket(int type) {  return factory_->CreateSocket(type);}utils_base::AsyncSocket * SslSocketFactory::CreateAsyncSocket(int type) {  utils_base::AsyncSocket * socket = factory_->CreateAsyncSocket(type);  if (!socket)    return 0;  // Binary logging happens at the lowest level   if (!logging_label_.empty() && binary_mode_) {    socket = new utils_base::LoggingSocketAdapter(socket, logging_level_,                                                  logging_label_.c_str(),                                                 binary_mode_);  }  if (proxy_.type) {    utils_base::AsyncSocket * proxy_socket = 0;    if (proxy_.type == utils_base::PROXY_SOCKS5) {      proxy_socket = new utils_base::AsyncSocksProxySocket(socket, proxy_.address,        proxy_.username, proxy_.password);    } else {      // Note: we are trying unknown proxies as HTTPS currently      proxy_socket = new utils_base::AsyncHttpsProxySocket(socket,        agent_, proxy_.address,        proxy_.username, proxy_.password);    }    if (!proxy_socket) {      delete socket;      return 0;    }    socket = proxy_socket;  // for our purposes the proxy is now the socket  }  if (!hostname_.empty()) {    utils_base::SSLAdapter * ssl_adapter = utils_base::SSLAdapter::Create(socket);    ssl_adapter->set_ignore_bad_cert(ignore_bad_cert_);    ssl_adapter->StartSSL(hostname_.c_str(), true);    socket = ssl_adapter;  }  // Regular logging occurs at the highest level  if (!logging_label_.empty() && !binary_mode_) {    socket = new utils_base::LoggingSocketAdapter(socket, logging_level_,                                                  logging_label_.c_str(),                                                 binary_mode_);  }  return socket;}///////////////////////////////////////////////////////////////////////////////// AsyncHttpRequest///////////////////////////////////////////////////////////////////////////////const int kDefaultHTTPTimeout = 30 * 1000; // 30 secAsyncHttpRequest::AsyncHttpRequest(const std::string &user_agent): firewall_(0), port_(80), secure_(false),  timeout_(kDefaultHTTPTimeout), fail_redirect_(false),  client_(user_agent.c_str(), NULL){}void AsyncHttpRequest::DoWork() {  // TODO: Rewrite this to use the thread's native socket server, and a more  // natural flow?  utils_base::PhysicalSocketServer physical;  utils_base::SocketServer * ss = &physical;  if (firewall_) {    ss = new utils_base::FirewallSocketServer(ss, firewall_);  }  SslSocketFactory factory(ss, client_.agent());  factory.SetProxy(proxy_);  if (secure_)    factory.UseSSL(host_.c_str());  //factory.SetLogging("AsyncHttpRequest");  utils_base::ReuseSocketPool pool(&factory);  client_.set_pool(&pool);    bool transparent_proxy = (port_ == 80)    && ((proxy_.type == utils_base::PROXY_HTTPS)        || (proxy_.type == utils_base::PROXY_UNKNOWN));  if (transparent_proxy) {    client_.set_proxy(proxy_);  }  client_.set_fail_redirect(fail_redirect_);  utils_base::SocketAddress server(host_, port_);  client_.set_server(server);  HttpMonitor monitor(ss);  monitor.Connect(&client_);  client_.start();  ss->Wait(timeout_, true);  if (!monitor.done()) {    LOG(LS_INFO) << "AsyncHttpRequest request timed out";    client_.reset();    return;  }    if (monitor.error()) {    LOG(LS_INFO) << "AsyncHttpRequest request error: " << monitor.error();    if (monitor.error() == utils_base::HE_AUTH) {      //proxy_auth_required_ = true;    }    return;  }  std::string value;  if (client_.response().hasHeader(HH_LOCATION, &value)) {    response_redirect_ = value.c_str();  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -