blob: f06aedf5909afe639a0011def007b47376825178 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef REMOTING_BASE_PROTOBUF_HTTP_REQUEST_BASE_H_
#define REMOTING_BASE_PROTOBUF_HTTP_REQUEST_BASE_H_
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/dcheck_is_on.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "remoting/base/protobuf_http_status.h"
#include "remoting/base/scoped_protobuf_http_request.h"
namespace network {
namespace mojom {
class URLLoaderFactory;
} // namespace mojom
class SimpleURLLoader;
} // namespace network
namespace remoting {
class ProtobufHttpClient;
struct ProtobufHttpRequestConfig;
// Base request class for unary and server streaming requests.
class ProtobufHttpRequestBase {
public:
explicit ProtobufHttpRequestBase(
std::unique_ptr<ProtobufHttpRequestConfig> config);
virtual ~ProtobufHttpRequestBase();
// Creates an ScopedProtobufHttpRequest instance that will cancel the
// request once the instance is deleted. It will be no-op if the request is
// not in the client's pending request list.
std::unique_ptr<ScopedProtobufHttpRequest> CreateScopedRequest();
const ProtobufHttpRequestConfig& config() const { return *config_; }
protected:
virtual void OnAuthFailed(const ProtobufHttpStatus& status) = 0;
virtual void StartRequestInternal(
network::mojom::URLLoaderFactory* loader_factory) = 0;
// Returns a deadline for when the request has to be finished. Returns zero
// if the request doesn't timeout. This is generally only useful for unary
// requests.
virtual base::TimeDelta GetRequestTimeoutDuration() const = 0;
// Returns the http status from |url_loader_|. Only useful when |url_loader_|
// informs that the request has been completed.
ProtobufHttpStatus GetUrlLoaderStatus() const;
std::unique_ptr<network::SimpleURLLoader> url_loader_;
// Subclass should run this closure whenever its lifetime ends, e.g. response
// is received or stream is closed. This will delete |this| from the parent
// ProtobufHttpClient.
base::OnceClosure invalidator_;
private:
friend class ProtobufHttpClient;
// Called by ProtobufHttpClient.
void StartRequest(network::mojom::URLLoaderFactory* loader_factory,
std::unique_ptr<network::SimpleURLLoader> url_loader,
base::OnceClosure invalidator);
void Invalidate();
std::unique_ptr<ProtobufHttpRequestConfig> config_;
#if DCHECK_IS_ON()
base::TimeTicks request_deadline_;
#endif // DCHECK_IS_ON()
base::WeakPtrFactory<ProtobufHttpRequestBase> weak_factory_{this};
};
} // namespace remoting
#endif // REMOTING_BASE_PROTOBUF_HTTP_REQUEST_BASE_H_