diff options
Diffstat (limited to 'WebCore/platform/network/DataURL.cpp')
-rw-r--r-- | WebCore/platform/network/DataURL.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/WebCore/platform/network/DataURL.cpp b/WebCore/platform/network/DataURL.cpp new file mode 100644 index 0000000..5de1b34 --- /dev/null +++ b/WebCore/platform/network/DataURL.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2007 Alp Toker <alp@atoker.com> + * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "DataURL.h" + +#include "Base64.h" +#include "HTTPParsers.h" +#include "ResourceHandle.h" +#include "ResourceHandleClient.h" +#include "ResourceRequest.h" +#include "ResourceResponse.h" +#include "TextEncoding.h" +#include <wtf/text/CString.h> + +namespace WebCore { + +void handleDataURL(ResourceHandle* handle) +{ + ASSERT(handle->firstRequest().url().protocolIs("data")); + String url = handle->firstRequest().url().string(); + + int index = url.find(','); + if (index == -1) { + handle->client()->cannotShowURL(handle); + return; + } + + String mediaType = url.substring(5, index - 5); + String data = url.substring(index + 1); + + bool base64 = mediaType.endsWith(";base64", false); + if (base64) + mediaType = mediaType.left(mediaType.length() - 7); + + if (mediaType.isEmpty()) + mediaType = "text/plain;charset=US-ASCII"; + + String mimeType = extractMIMETypeFromMediaType(mediaType); + String charset = extractCharsetFromMediaType(mediaType); + + ResourceResponse response; + response.setMimeType(mimeType); + response.setTextEncodingName(charset); + response.setURL(handle->firstRequest().url()); + + if (base64) { + data = decodeURLEscapeSequences(data); + handle->client()->didReceiveResponse(handle, response); + + Vector<char> out; + if (base64Decode(data, out, IgnoreWhitespace) && out.size() > 0) { + response.setExpectedContentLength(out.size()); + handle->client()->didReceiveData(handle, out.data(), out.size(), 0); + } + } else { + data = decodeURLEscapeSequences(data, TextEncoding(charset)); + handle->client()->didReceiveResponse(handle, response); + + CString encodedData = TextEncoding().encode(data.characters(), data.length(), URLEncodedEntitiesForUnencodables); + response.setExpectedContentLength(encodedData.length()); + if (encodedData.length()) + handle->client()->didReceiveData(handle, encodedData.data(), encodedData.length(), 0); + } + + handle->client()->didFinishLoading(handle, 0); +} + +} // namespace WebCore |