コード例 #1
0
 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());
 }
コード例 #2
0
	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));
	}
コード例 #3
0
	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;
		}
	}