1/* 2 * Copyright (C) 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2006 Michael Emmel mike.emmel@gmail.com 4 * Copyright (C) 2007 Alp Toker <alp.toker@collabora.co.uk> 5 * Copyright (C) 2007 Holger Hans Peter Freyther 6 * Copyright (C) 2008 Collabora Ltd. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 25 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 26 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31#include "config.h" 32 33#if USE(CURL) 34 35#include "FormDataStreamCurl.h" 36 37#include "FormData.h" 38#include "ResourceRequest.h" 39#include <wtf/text/CString.h> 40 41namespace WebCore { 42 43FormDataStream::~FormDataStream() 44{ 45 if (m_file) 46 fclose(m_file); 47} 48 49size_t FormDataStream::read(void* ptr, size_t blockSize, size_t numberOfBlocks) 50{ 51 // Check for overflow. 52 if (!numberOfBlocks || blockSize > std::numeric_limits<size_t>::max() / numberOfBlocks) 53 return 0; 54 55 Vector<FormDataElement> elements; 56 if (m_resourceHandle->firstRequest().httpBody()) 57 elements = m_resourceHandle->firstRequest().httpBody()->elements(); 58 59 if (m_formDataElementIndex >= elements.size()) 60 return 0; 61 62 FormDataElement element = elements[m_formDataElementIndex]; 63 64 size_t toSend = blockSize * numberOfBlocks; 65 size_t sent; 66 67 if (element.m_type == FormDataElement::Type::EncodedFile) { 68 if (!m_file) 69 m_file = fopen(element.m_filename.utf8().data(), "rb"); 70 71 if (!m_file) { 72 // FIXME: show a user error? 73#ifndef NDEBUG 74 printf("Failed while trying to open %s for upload\n", element.m_filename.utf8().data()); 75#endif 76 return 0; 77 } 78 79 sent = fread(ptr, blockSize, numberOfBlocks, m_file); 80 if (!blockSize && ferror(m_file)) { 81 // FIXME: show a user error? 82#ifndef NDEBUG 83 printf("Failed while trying to read %s for upload\n", element.m_filename.utf8().data()); 84#endif 85 return 0; 86 } 87 if (feof(m_file)) { 88 fclose(m_file); 89 m_file = 0; 90 m_formDataElementIndex++; 91 } 92 } else { 93 size_t elementSize = element.m_data.size() - m_formDataElementDataOffset; 94 sent = elementSize > toSend ? toSend : elementSize; 95 memcpy(ptr, element.m_data.data() + m_formDataElementDataOffset, sent); 96 if (elementSize > sent) 97 m_formDataElementDataOffset += sent; 98 else { 99 m_formDataElementDataOffset = 0; 100 m_formDataElementIndex++; 101 } 102 } 103 104 return sent; 105} 106 107bool FormDataStream::hasMoreElements() const 108{ 109 Vector<FormDataElement> elements; 110 if (m_resourceHandle->firstRequest().httpBody()) 111 elements = m_resourceHandle->firstRequest().httpBody()->elements(); 112 113 return m_formDataElementIndex < elements.size(); 114} 115 116} // namespace WebCore 117 118#endif 119