virtual void async_resolve(const std::string &, std::uint16_t, resolve_callback callback) { // arbitrary error code, I just want this to fail boost::system::error_code ec(boost::asio::error::host_not_found, boost::asio::error::get_netdb_category()); callback(ec, resolver_iterator()); }
void basic_http_connection_impl::__retry_async_resolve_connect_coro(op_stamp_t stamp) { if(is_canceled_op(stamp)) return; if (resolve_timer_) { resolve_timer_->cancel(); resolve_timer_.reset(); } if (!conn_retry_timer_) { conn_retry_timer_=timer_type::create(get_io_service()); conn_retry_timer_->set_obj_desc("basic_http_connection_impl::conn_retry_timer_"); } conn_retry_timer_->cancel(); conn_retry_timer_->time_signal().clear(); conn_retry_timer_->time_signal().bind(&this_type::__async_resolve_connect_coro, this,stamp,coroutine(),error_code(),resolver_iterator() ); conn_retry_timer_->async_wait(milliseconds(100)); }
void basic_http_connection_impl::__async_resolve_connect_coro(op_stamp_t stamp, coroutine coro,error_code err, resolver_iterator itr ) { //all canceled operation will not be invoked if(is_canceled_op(stamp)||state_==CLOSED||!connection_) return; CORO_REENTER(coro) { state_=CONNECTING; //if qy is not null, we yield async resolve if (resolver_query_) { if (resolve_timer_) resolve_timer_->cancel(); resolve_timer_=timer_type::create(get_io_service()); resolve_timer_->set_obj_desc("basic_http_connection_impl::resolve_timer_"); resolve_timer_->time_signal().bind( &this_type::__retry_async_resolve_connect_coro,this,stamp ); resolve_timer_->async_wait(seconds(3)); CORO_YIELD( resolver_.async_resolve(*resolver_query_,make_alloc_handler( boost::bind(&this_type::__async_resolve_connect_coro, SHARED_OBJ_FROM_THIS,stamp,coro,_1,_2)) ) ); if (resolve_timer_) { resolve_timer_->cancel(); resolve_timer_.reset(); } if (err||itr==resolver_iterator()) { __retry_async_resolve_connect_coro(stamp); return; } remote_edp_.address(resolver_type::endpoint_type(*itr++).address()); if (remote_edp_.port()==0) remote_edp_.port(80); } //yield async connect CORO_YIELD(socket_impl_->async_connect(remote_edp_, make_alloc_handler( boost::bind(&this_type::__async_resolve_connect_coro, SHARED_OBJ_FROM_THIS,stamp,coro,_1,itr)) )); while(err && itr != resolver_iterator()) { //close socket that failed to connect, and open a new one socket_impl_->close(err); __open(local_edp_,err); if (err) { __retry_async_resolve_connect_coro(stamp); return; } remote_edp_.address(resolver_type::endpoint_type(*itr++).address()); //yield async connect CORO_YIELD(socket_impl_->async_connect(remote_edp_,make_alloc_handler( boost::bind(&this_type::__async_resolve_connect_coro, SHARED_OBJ_FROM_THIS,stamp,coro,_1,itr) ))); } if (err) { __retry_async_resolve_connect_coro(stamp); return; } //now lowlayer connected BOOST_ASSERT(!err); if (conn_timeout_timer_) conn_timeout_timer_->cancel(); if (conn_retry_timer_) conn_retry_timer_->cancel(); if(resolve_timer_) resolve_timer_->cancel(); resolve_timer_.reset(); resolver_query_.reset(); state_=CONNECTED; keep_async_receiving(); if (connection_) connection_->dispatch_connected(err); return; } }