1 /* 2 * Copyright (C) 2009 Gustavo Noronha Silva 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 */ 19 20 #include "config.h" 21 #include "ResourceRequest.h" 22 23 #include "GOwnPtr.h" 24 #include "GOwnPtrSoup.h" 25 #include "HTTPParsers.h" 26 #include "MIMETypeRegistry.h" 27 #include "PlatformString.h" 28 #include "SoupURIUtils.h" 29 #include <wtf/text/CString.h> 30 31 #include <libsoup/soup.h> 32 33 using namespace std; 34 35 namespace WebCore { 36 37 void ResourceRequest::updateSoupMessage(SoupMessage* soupMessage) const 38 { 39 g_object_set(soupMessage, SOUP_MESSAGE_METHOD, httpMethod().utf8().data(), NULL); 40 41 const HTTPHeaderMap& headers = httpHeaderFields(); 42 SoupMessageHeaders* soupHeaders = soupMessage->request_headers; 43 if (!headers.isEmpty()) { 44 HTTPHeaderMap::const_iterator end = headers.end(); 45 for (HTTPHeaderMap::const_iterator it = headers.begin(); it != end; ++it) 46 soup_message_headers_append(soupHeaders, it->first.string().utf8().data(), it->second.utf8().data()); 47 } 48 49 String firstPartyString = firstPartyForCookies().string(); 50 if (!firstPartyString.isEmpty()) { 51 GOwnPtr<SoupURI> firstParty(soup_uri_new(firstPartyString.utf8().data())); 52 soup_message_set_first_party(soupMessage, firstParty.get()); 53 } 54 55 soup_message_set_flags(soupMessage, m_soupFlags); 56 } 57 58 SoupMessage* ResourceRequest::toSoupMessage() const 59 { 60 SoupMessage* soupMessage = soup_message_new(httpMethod().utf8().data(), url().string().utf8().data()); 61 if (!soupMessage) 62 return 0; 63 64 const HTTPHeaderMap& headers = httpHeaderFields(); 65 SoupMessageHeaders* soupHeaders = soupMessage->request_headers; 66 if (!headers.isEmpty()) { 67 HTTPHeaderMap::const_iterator end = headers.end(); 68 for (HTTPHeaderMap::const_iterator it = headers.begin(); it != end; ++it) 69 soup_message_headers_append(soupHeaders, it->first.string().utf8().data(), it->second.utf8().data()); 70 } 71 72 String firstPartyString = firstPartyForCookies().string(); 73 if (!firstPartyString.isEmpty()) { 74 GOwnPtr<SoupURI> firstParty(soup_uri_new(firstPartyString.utf8().data())); 75 soup_message_set_first_party(soupMessage, firstParty.get()); 76 } 77 78 soup_message_set_flags(soupMessage, m_soupFlags); 79 80 // Body data is only handled at ResourceHandleSoup::startHttp for 81 // now; this is because this may not be a good place to go 82 // openning and mmapping files. We should maybe revisit this. 83 return soupMessage; 84 } 85 86 void ResourceRequest::updateFromSoupMessage(SoupMessage* soupMessage) 87 { 88 m_url = soupURIToKURL(soup_message_get_uri(soupMessage)); 89 90 m_httpMethod = String::fromUTF8(soupMessage->method); 91 92 m_httpHeaderFields.clear(); 93 SoupMessageHeadersIter headersIter; 94 const char* headerName; 95 const char* headerValue; 96 soup_message_headers_iter_init(&headersIter, soupMessage->request_headers); 97 while (soup_message_headers_iter_next(&headersIter, &headerName, &headerValue)) { 98 m_httpHeaderFields.set(String::fromUTF8(headerName), String::fromUTF8(headerValue)); 99 } 100 101 if (soupMessage->request_body->data) 102 m_httpBody = FormData::create(soupMessage->request_body->data, soupMessage->request_body->length); 103 104 SoupURI* firstParty = soup_message_get_first_party(soupMessage); 105 if (firstParty) 106 m_firstPartyForCookies = soupURIToKURL(firstParty); 107 108 m_soupFlags = soup_message_get_flags(soupMessage); 109 110 // FIXME: m_allowCookies should probably be handled here and on 111 // doUpdatePlatformRequest somehow. 112 } 113 114 unsigned initializeMaximumHTTPConnectionCountPerHost() 115 { 116 // Soup has its own queue control; it wants to have all requests 117 // given to it, so that it is able to look ahead, and schedule 118 // them in a good way. 119 return 10000; 120 } 121 122 } 123