WebCore::ResourceResponse WebResponse::createResourceResponse() { WebCore::ResourceResponse resourceResponse(createKurl(), getMimeType().c_str(), m_expectedSize, m_encoding.c_str(), ""); resourceResponse.setHTTPStatusCode(m_httpStatusCode); resourceResponse.setHTTPStatusText(m_httpStatusText.c_str()); map<string, string>::const_iterator it; for (it = m_headerFields.begin(); it != m_headerFields.end(); ++it) resourceResponse.setHTTPHeaderField(it->first.c_str(), it->second.c_str()); return resourceResponse; }
void SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse(CFURLConnectionRef connection, CFURLResponseRef cfResponse) { LOG(Network, "CFNet - SynchronousResourceHandleCFURLConnectionDelegate::didReceiveResponse(handle=%p) (%s)", m_handle, m_handle->firstRequest().url().string().utf8().data()); if (!m_handle->client()) return; #if PLATFORM(COCOA) // Avoid MIME type sniffing if the response comes back as 304 Not Modified. auto msg = CFURLResponseGetHTTPResponse(cfResponse); int statusCode = msg ? CFHTTPMessageGetResponseStatusCode(msg) : 0; if (statusCode != 304) { bool isMainResourceLoad = m_handle->firstRequest().requester() == ResourceRequest::Requester::Main; adjustMIMETypeIfNecessary(cfResponse, isMainResourceLoad); } #if !PLATFORM(IOS) if (_CFURLRequestCopyProtocolPropertyForKey(m_handle->firstRequest().cfURLRequest(DoNotUpdateHTTPBody), CFSTR("ForceHTMLMIMEType"))) CFURLResponseSetMIMEType(cfResponse, CFSTR("text/html")); #endif // !PLATFORM(IOS) #else if (!CFURLResponseGetMIMEType(cfResponse)) adjustMIMETypeIfNecessary(cfResponse); if (!CFURLResponseGetMIMEType(cfResponse)) { // We should never be applying the default MIMEType if we told the networking layer to do content sniffing for handle. ASSERT(!m_handle->shouldContentSniff()); setDefaultMIMEType(cfResponse); } #endif #if USE(QUICK_LOOK) m_handle->setQuickLookHandle(QuickLookHandle::create(m_handle, this, cfResponse)); if (m_handle->quickLookHandle()) cfResponse = m_handle->quickLookHandle()->cfResponse(); #endif ResourceResponse resourceResponse(cfResponse); #if PLATFORM(COCOA) && ENABLE(WEB_TIMING) ResourceHandle::getConnectionTimingData(connection, resourceResponse.networkLoadTiming()); #else UNUSED_PARAM(connection); #endif m_handle->client()->didReceiveResponse(m_handle, WTFMove(resourceResponse)); }
TEST(ImageResourceTest, ReloadIfLoFi) { KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); URLTestHelpers::registerMockedURLLoad(testURL, "cancelTest.html", "text/html"); ResourceRequest request = ResourceRequest(testURL); request.setLoFiState(WebURLRequest::LoFiOn); ImageResource* cachedImage = ImageResource::create(request); cachedImage->setStatus(Resource::Pending); Persistent<MockImageResourceClient> client = new MockImageResourceClient(cachedImage); ResourceFetcher* fetcher = ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); // Send the image response. Vector<unsigned char> jpeg = jpegImage(); ResourceResponse resourceResponse(KURL(), "image/jpeg", jpeg.size(), nullAtom, String()); resourceResponse.addHTTPHeaderField("chrome-proxy", "q=low"); cachedImage->responseReceived(resourceResponse, nullptr); cachedImage->appendData(reinterpret_cast<const char*>(jpeg.data()), jpeg.size()); cachedImage->finish(); ASSERT_FALSE(cachedImage->errorOccurred()); ASSERT_TRUE(cachedImage->hasImage()); ASSERT_FALSE(cachedImage->getImage()->isNull()); ASSERT_EQ(client->imageChangedCount(), 2); ASSERT_TRUE(client->notifyFinishedCalled()); ASSERT_TRUE(cachedImage->getImage()->isBitmapImage()); EXPECT_EQ(1, cachedImage->getImage()->width()); EXPECT_EQ(1, cachedImage->getImage()->height()); cachedImage->reloadIfLoFi(fetcher); ASSERT_FALSE(cachedImage->errorOccurred()); ASSERT_FALSE(cachedImage->resourceBuffer()); ASSERT_FALSE(cachedImage->hasImage()); ASSERT_EQ(client->imageChangedCount(), 3); cachedImage->loader()->didReceiveResponse(nullptr, WrappedResourceResponse(resourceResponse), nullptr); cachedImage->loader()->didReceiveData(nullptr, reinterpret_cast<const char*>(jpeg.data()), jpeg.size(), jpeg.size()); cachedImage->loader()->didFinishLoading(nullptr, 0.0, jpeg.size()); ASSERT_FALSE(cachedImage->errorOccurred()); ASSERT_TRUE(cachedImage->hasImage()); ASSERT_FALSE(cachedImage->getImage()->isNull()); ASSERT_TRUE(client->notifyFinishedCalled()); ASSERT_TRUE(cachedImage->getImage()->isBitmapImage()); }
// ChangeSensorRepresentaion is an observation function, // which notifies any changes to the sensors to stack // via notifyObservers void SensorResource::ChangeSensorRepresentation() { if (m_observation) { std::cout << "Notifying observers with resource handle: " << m_resourceHandle << endl; OCStackResult result = OC_STACK_OK; std::shared_ptr<OCResourceResponse> resourceResponse(new OCResourceResponse()); resourceResponse->setErrorCode(200); resourceResponse->setResourceRepresentation(get(), DEFAULT_INTERFACE); result = OCPlatform::notifyListOfObservers(m_resourceHandle, m_interestedObservers, resourceResponse); if (OC_STACK_NO_OBSERVERS == result) { std::cout << "No More observers, stopping notifications" << endl; m_observation = 0; } } }
void URLResponse::encode(IPC::ArgumentEncoder& encoder) const { encoder << resourceResponse(); }
TEST(ImageResourceTest, ReloadIfLoFiAfterFinished) { KURL testURL(ParsedURLString, "http://www.test.com/cancelTest.html"); ScopedRegisteredURL scopedRegisteredURL(testURL); ResourceRequest request = ResourceRequest(testURL); request.setLoFiState(WebURLRequest::LoFiOn); ImageResource* cachedImage = ImageResource::create(request); cachedImage->setStatus(Resource::Pending); Persistent<MockImageResourceClient> client = new MockImageResourceClient(cachedImage); ResourceFetcher* fetcher = ResourceFetcher::create(ImageResourceTestMockFetchContext::create()); // Send the image response. Vector<unsigned char> jpeg = jpegImage(); ResourceResponse resourceResponse(KURL(), "image/jpeg", jpeg.size(), nullAtom, String()); resourceResponse.addHTTPHeaderField("chrome-proxy", "q=low"); cachedImage->responseReceived(resourceResponse, nullptr); cachedImage->appendData(reinterpret_cast<const char*>(jpeg.data()), jpeg.size()); cachedImage->finish(); EXPECT_FALSE(cachedImage->errorOccurred()); ASSERT_TRUE(cachedImage->hasImage()); EXPECT_FALSE(cachedImage->getImage()->isNull()); EXPECT_EQ(2, client->imageChangedCount()); EXPECT_EQ(jpeg.size(), client->encodedSizeOnLastImageChanged()); // The client should have been notified that the image load completed. EXPECT_TRUE(client->notifyFinishedCalled()); EXPECT_EQ(jpeg.size(), client->encodedSizeOnNotifyFinished()); EXPECT_EQ(jpeg.size(), client->encodedSizeOnImageNotifyFinished()); EXPECT_TRUE(cachedImage->getImage()->isBitmapImage()); EXPECT_EQ(1, cachedImage->getImage()->width()); EXPECT_EQ(1, cachedImage->getImage()->height()); // Call reloadIfLoFi() after the image has finished loading. cachedImage->reloadIfLoFi(fetcher); EXPECT_FALSE(cachedImage->errorOccurred()); EXPECT_FALSE(cachedImage->resourceBuffer()); EXPECT_FALSE(cachedImage->hasImage()); EXPECT_EQ(3, client->imageChangedCount()); Vector<unsigned char> jpeg2 = jpegImage2(); cachedImage->loader()->didReceiveResponse( nullptr, WrappedResourceResponse(resourceResponse), nullptr); cachedImage->loader()->didReceiveData( nullptr, reinterpret_cast<const char*>(jpeg2.data()), jpeg2.size(), jpeg2.size(), jpeg2.size()); cachedImage->loader()->didFinishLoading(nullptr, 0.0, jpeg2.size()); EXPECT_FALSE(cachedImage->errorOccurred()); ASSERT_TRUE(cachedImage->hasImage()); EXPECT_FALSE(cachedImage->getImage()->isNull()); EXPECT_EQ(jpeg2.size(), client->encodedSizeOnLastImageChanged()); EXPECT_TRUE(client->notifyFinishedCalled()); // The client should not have been notified of completion again. EXPECT_EQ(jpeg.size(), client->encodedSizeOnNotifyFinished()); EXPECT_EQ(jpeg.size(), client->encodedSizeOnImageNotifyFinished()); EXPECT_TRUE(cachedImage->getImage()->isBitmapImage()); EXPECT_EQ(50, cachedImage->getImage()->width()); EXPECT_EQ(50, cachedImage->getImage()->height()); }