ResourceHandle.cpp [plain text]
#include "config.h"
#include "ResourceHandle.h"
#include "ResourceHandleInternal.h"
#include "Logging.h"
#include "ResourceHandleClient.h"
#include "Timer.h"
#include <algorithm>
namespace WebCore {
ResourceHandle::ResourceHandle(const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading,
bool shouldContentSniff, bool mightDownloadFromHandle)
: d(new ResourceHandleInternal(this, request, client, defersLoading, shouldContentSniff, mightDownloadFromHandle))
{
}
PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request, ResourceHandleClient* client,
Frame* frame, bool defersLoading, bool shouldContentSniff, bool mightDownloadFromHandle)
{
RefPtr<ResourceHandle> newHandle(new ResourceHandle(request, client, defersLoading, shouldContentSniff, mightDownloadFromHandle));
if (!portAllowed(request)) {
newHandle->scheduleBlockedFailure();
return newHandle.release();
}
if (newHandle->start(frame))
return newHandle.release();
return 0;
}
void ResourceHandle::scheduleBlockedFailure()
{
Timer<ResourceHandle>* blockedTimer = new Timer<ResourceHandle>(this, &ResourceHandle::fireBlockedFailure);
blockedTimer->startOneShot(0);
}
void ResourceHandle::fireBlockedFailure(Timer<ResourceHandle>* timer)
{
if (client())
client()->wasBlocked(this);
delete timer;
}
ResourceHandleClient* ResourceHandle::client() const
{
return d->m_client;
}
void ResourceHandle::setClient(ResourceHandleClient* client)
{
d->m_client = client;
}
const ResourceRequest& ResourceHandle::request() const
{
return d->m_request;
}
void ResourceHandle::clearAuthentication()
{
#if PLATFORM(MAC)
d->m_currentMacChallenge = nil;
#elif PLATFORM(CF)
d->m_currentCFChallenge = 0;
#endif
d->m_currentWebChallenge.nullify();
}
bool ResourceHandle::portAllowed(const ResourceRequest& request)
{
unsigned short port = request.url().port();
if (!port)
return true;
static const unsigned short blockedPortList[] = {
1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 77, 79, 87, 95, 101, 102, 103, 104, 109, 110, 111, 113, 115, 117, 119, 123, 135, 139, 143, 179, 389, 465, 512, 513, 514, 515, 526, 530, 531, 532, 540, 556, 563, 587, 601, 636, 993, 995, 2049, 4045, 6000, };
const unsigned short* const blockedPortListEnd = blockedPortList
+ sizeof(blockedPortList) / sizeof(blockedPortList[0]);
if (!std::binary_search(blockedPortList, blockedPortListEnd, port))
return true;
if ((port == 21 || port == 22) && request.url().url().startsWith("ftp:", false))
return true;
if (request.url().url().startsWith("file:", false))
return true;
return false;
}
}