#pragma once
#include "ResourceHandle.h"
#include "ResourceHandleClient.h"
#include "Timer.h"
namespace WebCore {
class PingHandle final : private ResourceHandleClient {
WTF_MAKE_NONCOPYABLE(PingHandle); WTF_MAKE_FAST_ALLOCATED;
public:
enum class UsesAsyncCallbacks {
Yes,
No,
};
PingHandle(NetworkingContext* networkingContext, const ResourceRequest& request, bool shouldUseCredentialStorage, UsesAsyncCallbacks useAsyncCallbacks, bool shouldFollowRedirects)
: m_timeoutTimer(*this, &PingHandle::timeoutTimerFired)
, m_shouldUseCredentialStorage(shouldUseCredentialStorage)
, m_shouldFollowRedirects(shouldFollowRedirects)
, m_usesAsyncCallbacks(useAsyncCallbacks)
{
m_handle = ResourceHandle::create(networkingContext, request, this, false, false);
m_timeoutTimer.startOneShot(60000_s);
}
private:
ResourceRequest willSendRequest(ResourceHandle*, ResourceRequest&& request, ResourceResponse&&) final
{
return m_shouldFollowRedirects ? request : ResourceRequest();
}
void willSendRequestAsync(ResourceHandle* handle, ResourceRequest&& request, ResourceResponse&&) final
{
if (m_shouldFollowRedirects) {
handle->continueWillSendRequest(WTFMove(request));
return;
}
delete this;
}
void didReceiveResponse(ResourceHandle*, ResourceResponse&&) final { delete this; }
void didReceiveBuffer(ResourceHandle*, Ref<SharedBuffer>&&, int) final { delete this; };
void didFinishLoading(ResourceHandle*) final { delete this; }
void didFail(ResourceHandle*, const ResourceError&) final { delete this; }
bool shouldUseCredentialStorage(ResourceHandle*) final { return m_shouldUseCredentialStorage; }
bool usesAsyncCallbacks() final { return m_usesAsyncCallbacks == UsesAsyncCallbacks::Yes; }
void timeoutTimerFired() { delete this; }
virtual ~PingHandle()
{
if (m_handle) {
ASSERT(m_handle->client() == this);
m_handle->clearClient();
m_handle->cancel();
}
}
RefPtr<ResourceHandle> m_handle;
Timer m_timeoutTimer;
bool m_shouldUseCredentialStorage;
bool m_shouldFollowRedirects;
UsesAsyncCallbacks m_usesAsyncCallbacks;
};
}