void WebSoupRequestManager::didReceiveURIRequestData(const IPC::DataReference& requestData, uint64_t requestID) { WebSoupRequestAsyncData* data = m_requestMap.get(requestID); // The data might have been removed from the request map if a previous chunk failed // and a new message was sent by the UI process before being notified about the failure. if (!data) return; ASSERT(data->stream.get()); if (data->requestFailed()) { // ResourceRequest failed or it was cancelled. It doesn't matter here the error or if it was cancelled, // because that's already handled by the resource handle client, we just want to notify the UI process // to stop reading data from the user input stream. If UI process already sent all the data we simply // finish silently. if (!webkitSoupRequestInputStreamFinished(WEBKIT_SOUP_REQUEST_INPUT_STREAM(data->stream.get()))) m_process->parentProcessConnection()->send(Messages::WebSoupRequestManagerProxy::DidFailToLoadURIRequest(requestID), 0); m_requestMap.remove(requestID); return; } webkitSoupRequestInputStreamAddData(WEBKIT_SOUP_REQUEST_INPUT_STREAM(data->stream.get()), requestData.data(), requestData.size()); if (webkitSoupRequestInputStreamFinished(WEBKIT_SOUP_REQUEST_INPUT_STREAM(data->stream.get()))) m_requestMap.remove(requestID); }
void WebSoupRequestManager::didHandleURIRequest(const IPC::DataReference& requestData, uint64_t contentLength, const String& mimeType, uint64_t requestID) { WebSoupRequestAsyncData* data = m_requestMap.get(requestID); ASSERT(data); GRefPtr<GTask> task = data->releaseTask(); ASSERT(task.get()); WebKitSoupRequestGeneric* request = WEBKIT_SOUP_REQUEST_GENERIC(g_task_get_source_object(task.get())); webkitSoupRequestGenericSetContentLength(request, contentLength ? contentLength : -1); webkitSoupRequestGenericSetContentType(request, !mimeType.isEmpty() ? mimeType.utf8().data() : 0); GInputStream* dataStream; if (!requestData.size()) { // Empty reply, just create and empty GMemoryInputStream. dataStream = g_memory_input_stream_new(); m_requestMap.remove(requestID); } else if (requestData.size() == contentLength) { // We don't expect more data, so we can just create a GMemoryInputStream with all the data. dataStream = g_memory_input_stream_new_from_data(g_memdup(requestData.data(), requestData.size()), contentLength, g_free); m_requestMap.remove(requestID); } else { // We expect more data chunks from the UI process. dataStream = webkitSoupRequestInputStreamNew(contentLength); data->stream = dataStream; webkitSoupRequestInputStreamAddData(WEBKIT_SOUP_REQUEST_INPUT_STREAM(dataStream), requestData.data(), requestData.size()); } g_task_return_pointer(task.get(), dataStream, g_object_unref); }
void CustomProtocolManagerImpl::didLoadData(uint64_t customProtocolID, const IPC::DataReference& dataReference) { WebSoupRequestAsyncData* data = m_customProtocolMap.get(customProtocolID); // The data might have been removed from the request map if a previous chunk failed // and a new message was sent by the UI process before being notified about the failure. if (!data) return; if (!data->stream) { GRefPtr<GTask> task = data->releaseTask(); ASSERT(task.get()); goffset soupContentLength = soup_request_get_content_length(SOUP_REQUEST(g_task_get_source_object(task.get()))); uint64_t contentLength = soupContentLength == -1 ? 0 : static_cast<uint64_t>(soupContentLength); if (!dataReference.size()) { // Empty reply, just create and empty GMemoryInputStream. data->stream = g_memory_input_stream_new(); } else if (dataReference.size() == contentLength) { // We don't expect more data, so we can just create a GMemoryInputStream with all the data. data->stream = g_memory_input_stream_new_from_data(g_memdup(dataReference.data(), dataReference.size()), contentLength, g_free); } else { // We expect more data chunks from the UI process. data->stream = webkitSoupRequestInputStreamNew(contentLength); webkitSoupRequestInputStreamAddData(WEBKIT_SOUP_REQUEST_INPUT_STREAM(data->stream.get()), dataReference.data(), dataReference.size()); } g_task_return_pointer(task.get(), data->stream.get(), g_object_unref); return; } if (data->requestFailed()) { // ResourceRequest failed or it was cancelled. It doesn't matter here the error or if it was cancelled, // because that's already handled by the resource handle client, we just want to notify the UI process // to stop reading data from the user input stream. If UI process already sent all the data we simply // finish silently. if (!webkitSoupRequestInputStreamFinished(WEBKIT_SOUP_REQUEST_INPUT_STREAM(data->stream.get()))) m_childProcess->send(Messages::CustomProtocolManagerProxy::StopLoading(customProtocolID), 0); return; } webkitSoupRequestInputStreamAddData(WEBKIT_SOUP_REQUEST_INPUT_STREAM(data->stream.get()), dataReference.data(), dataReference.size()); }