def poll(connection, request_options, stop_at)
      uri = URI.parse(connection[:host])
      request_options[:path] = uri.path + request_options[:path]
      poll_again(Fiber.current, connection[:connection], request_options, stop_at)
      code, body, headers = Fiber.yield
      headers = beautify_headers(headers) if headers
      result = BalancedHttpClient.response(code, body, headers, request_options[:head][:accept])
      connection[:expires_at] = Time.now + BalancedHttpClient::CONNECTION_REUSE_TIMEOUT
      [result, code, body, headers]
    end
def poll(connection, request_options, stop_at)
      uri = URI.parse(connection[:host])
      request_options[:path] = uri.path + request_options[:path]
      poll_again(Fiber.current, connection[:connection], request_options, stop_at)
      code, body, headers = Fiber.yield
      headers = beautify_headers(headers) if headers
      result = BalancedHttpClient.response(code, body, headers, request_options[:head][:accept])
      connection[:expires_at] = Time.now + BalancedHttpClient::CONNECTION_REUSE_TIMEOUT
      [result, code, body, headers]
    end
Make long-polling request
 Note that the underlying thread is not blocked by the HTTP i/o, but this call itself is blocking

 @param [Hash] connection to server from previous request with keys :host, :connection,
   and :expires_at, with the :expires_at being adjusted on return
 @param [Hash] request_options for HTTP request
 @param [Time] stop_at time for polling

 @return [Array] result to be returned followed by response code, body, and headers

 @raise [HttpException] HTTP failure with associated status code