18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/* 28f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2006, 2008 Apple Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2009 Google Inc. All rights reserved. 58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 68f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Redistribution and use in source and binary forms, with or without 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modification, are permitted provided that the following conditions 88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * are met: 98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 1. Redistributions of source code must retain the above copyright 108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer. 118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 2. Redistributions in binary form must reproduce the above copyright 128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer in the 138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * documentation and/or other materials provided with the distribution. 148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */ 278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "config.h" 298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "ContentType.h" 308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace WebCore { 328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianContentType::ContentType(const String& contentType) 348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian : m_type(contentType) 358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianString ContentType::parameter(const String& parameterName) const 398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian String parameterValue; 418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian String strippedType = m_type.stripWhiteSpace(); 428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // a MIME type can have one or more "param=value" after a semi-colon, and separated from each other by semi-colons 44f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick size_t semi = strippedType.find(';'); 45f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (semi != notFound) { 46f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick size_t start = strippedType.find(parameterName, semi + 1, false); 47f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (start != notFound) { 482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch start = strippedType.find('=', start + parameterName.length()); 49f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (start != notFound) { 502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t quote = strippedType.find('\"', start + 1); 512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch size_t end = strippedType.find('\"', start + 2); 522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (quote != notFound && end != notFound) 532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch start = quote; 542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else { 552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch end = strippedType.find(';', start + 1); 562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (end == notFound) 572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch end = strippedType.length(); 582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 598f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian parameterValue = strippedType.substring(start + 1, end - (start + 1)).stripWhiteSpace(); 608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return parameterValue; 658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianString ContentType::type() const 688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian String strippedType = m_type.stripWhiteSpace(); 708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // "type" can have parameters after a semi-colon, strip them 72f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick size_t semi = strippedType.find(';'); 73f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick if (semi != notFound) 748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian strippedType = strippedType.left(semi).stripWhiteSpace(); 758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return strippedType; 778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} // namespace WebCore 80