ResourceResponseCFNet.cpp [plain text]
#include "config.h"
#include "ResourceResponseCFNet.h"
#include "HTTPParsers.h"
#include "MIMETypeRegistry.h"
#include "ResourceResponse.h"
#include <CFNetwork/CFURLResponsePriv.h>
#include <wtf/RetainPtr.h>
using std::min;
#define MAX_TIME_T ((time_t)INT_MAX)
namespace WebCore {
CFURLResponseRef ResourceResponse::cfURLResponse() const
{
return m_cfResponse.get();
}
static inline bool filenameHasSaneExtension(const String& filename)
{
int dot = filename.find('.');
int length = filename.length();
return dot > 0 && dot < length - 1;
}
void ResourceResponse::doUpdateResourceResponse()
{
if (!m_cfResponse.get())
return;
m_url = CFURLResponseGetURL(m_cfResponse.get());
m_mimeType = CFURLResponseGetMIMEType(m_cfResponse.get());
m_expectedContentLength = CFURLResponseGetExpectedContentLength(m_cfResponse.get());
m_textEncodingName = CFURLResponseGetTextEncodingName(m_cfResponse.get());
CFAbsoluteTime expiration = CFURLResponseGetExpirationTime(m_cfResponse.get());
m_expirationDate = min((time_t)(expiration + kCFAbsoluteTimeIntervalSince1970), MAX_TIME_T);
CFAbsoluteTime lastModified = CFURLResponseGetLastModifiedDate(m_cfResponse.get());
m_lastModifiedDate = min((time_t)(lastModified + kCFAbsoluteTimeIntervalSince1970), MAX_TIME_T);
RetainPtr<CFStringRef> suggestedFilename(AdoptCF, CFURLResponseCopySuggestedFilename(m_cfResponse.get()));
m_suggestedFilename = suggestedFilename.get();
CFHTTPMessageRef httpResponse = CFURLResponseGetHTTPResponse(m_cfResponse.get());
if (httpResponse) {
m_httpStatusCode = CFHTTPMessageGetResponseStatusCode(httpResponse);
RetainPtr<CFStringRef> statusLine(AdoptCF, CFHTTPMessageCopyResponseStatusLine(httpResponse));
String statusText(statusLine.get());
int spacePos = statusText.find(" ");
if (spacePos != -1)
statusText = statusText.substring(spacePos + 1);
m_httpStatusText = statusText;
RetainPtr<CFDictionaryRef> headers(AdoptCF, CFHTTPMessageCopyAllHeaderFields(httpResponse));
CFIndex headerCount = CFDictionaryGetCount(headers.get());
Vector<const void*, 128> keys(headerCount);
Vector<const void*, 128> values(headerCount);
CFDictionaryGetKeysAndValues(headers.get(), keys.data(), values.data());
for (int i = 0; i < headerCount; ++i)
m_httpHeaderFields.set((CFStringRef)keys[i], (CFStringRef)values[i]);
} else
m_httpStatusCode = 0;
}
}