#ifndef REMOTING_BASE_PROTOBUF_HTTP_REQUEST_BASE_H_
#define REMOTING_BASE_PROTOBUF_HTTP_REQUEST_BASE_H_
#include <memory>
#include <string>
#include "base/dcheck_is_on.h"
#include "base/functional/callback.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;
}
class SimpleURLLoader;
}
namespace remoting {
class ProtobufHttpClient;
struct ProtobufHttpRequestConfig;
class ProtobufHttpRequestBase {
public:
explicit ProtobufHttpRequestBase(
std::unique_ptr<ProtobufHttpRequestConfig> config);
virtual ~ProtobufHttpRequestBase();
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;
virtual base::TimeDelta GetRequestTimeoutDuration() const = 0;
ProtobufHttpStatus GetUrlLoaderStatus() const;
std::unique_ptr<network::SimpleURLLoader> url_loader_;
base::OnceClosure invalidator_;
private:
friend class 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
base::WeakPtrFactory<ProtobufHttpRequestBase> weak_factory_{this};
};
}
#endif