Index: third_party/WebKit/WebCore/platform/network/soup/ResourceHandleSoup.cpp |
=================================================================== |
--- third_party/WebKit/WebCore/platform/network/soup/ResourceHandleSoup.cpp (revision 11154) |
+++ third_party/WebKit/WebCore/platform/network/soup/ResourceHandleSoup.cpp (working copy) |
@@ -214,6 +214,12 @@ |
if (!SOUP_STATUS_IS_SUCCESSFUL(msg->status_code)) |
return; |
+ // We still don't know anything about Content-Type, so we will try |
+ // sniffing the contents of the file, and then report that we got |
+ // headers |
+ if (!soup_message_headers_get_content_type(msg->response_headers, NULL)) |
+ return; |
+ |
ResourceHandle* handle = static_cast<ResourceHandle*>(data); |
if (!handle) |
return; |
@@ -226,7 +232,7 @@ |
fillResponseFromMessage(msg, &d->m_response); |
client->didReceiveResponse(handle, d->m_response); |
- soup_message_set_flags(msg, SOUP_MESSAGE_OVERWRITE_CHUNKS); |
+ d->m_reportedHeaders = true; |
} |
static void gotChunkCallback(SoupMessage* msg, SoupBuffer* chunk, gpointer data) |
@@ -244,6 +250,17 @@ |
if (!client) |
return; |
+ if (!d->m_reportedHeaders) { |
+ gboolean uncertain; |
+ char* contentType = g_content_type_guess(d->m_request.url().lastPathComponent().utf8().data(), reinterpret_cast<const guchar*>(chunk->data), chunk->length, &uncertain); |
+ soup_message_headers_set_content_type(msg->response_headers, contentType, NULL); |
+ g_free(contentType); |
+ |
+ fillResponseFromMessage(msg, &d->m_response); |
+ client->didReceiveResponse(handle, d->m_response); |
+ d->m_reportedHeaders = true; |
+ } |
+ |
client->didReceiveData(handle, chunk->data, chunk->length, false); |
} |
@@ -431,13 +448,8 @@ |
* be (big) files, which we will want to mmap instead of |
* copying into memory; TODO: support upload of non-local |
* (think sftp://) files by using GIO? |
- * |
- * TODO: we can avoid appending all the buffers to the |
- * request_body variable with the following call, but we |
- * need to depend on libsoup > 2.25.4 |
- * |
- * soup_message_body_set_accumulate(msg->request_body, FALSE); |
*/ |
+ soup_message_body_set_accumulate(msg->request_body, FALSE); |
for (size_t i = 0; i < numElements; i++) { |
const FormDataElement& element = httpBody->elements()[i]; |
@@ -487,6 +499,10 @@ |
d->m_msg = static_cast<SoupMessage*>(g_object_ref(msg)); |
// balanced by a deref() in finishedCallback, which should always run |
ref(); |
+ |
+ // We handle each chunk ourselves, and we don't need msg->response_body |
+ // to contain all of the data we got, when we finish downloading. |
+ soup_message_body_set_accumulate(msg->response_body, FALSE); |
soup_session_queue_message(session, d->m_msg, finishedCallback, this); |
return true; |
@@ -551,16 +567,10 @@ |
void ResourceHandle::cancel() |
{ |
d->m_cancelled = true; |
- if (d->m_msg) { |
+ if (d->m_msg) |
soup_session_cancel_message(defaultSession(), d->m_msg, SOUP_STATUS_CANCELLED); |
- // For re-entrancy troubles we call didFinishLoading when the message hasn't been handled yet. |
- if (client()) |
- client()->didFinishLoading(this); |
- } else if (d->m_cancellable) { |
+ else if (d->m_cancellable) |
g_cancellable_cancel(d->m_cancellable); |
- if (client()) |
- client()->didFinishLoading(this); |
- } |
} |
PassRefPtr<SharedBuffer> ResourceHandle::bufferedData() |