/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
*
* Free Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.server.http;
import com.caucho.xml.XmlChar;
/**
* Parsed content type
*/
class ContentType {
private final String _userContentType;
private String _contentType;
private String _encoding;
/**
* Creates and parses the ContentType.
*/
ContentType(String userContentType)
{
_userContentType = userContentType;
parseContentType(userContentType);
}
public String getUserContentType()
{
return _userContentType;
}
public String getContentType()
{
return _contentType;
}
public String getEncoding()
{
return _encoding;
}
private void parseContentType(String value)
{
int length = value.length();
int ch;
int i = 0;
while (i < length) {
for (;
i < length && value.charAt(i) != ';';
i++) {
}
if (length <= i)
break;
int semicolon = i;
for (i++; i < length && XmlChar.isWhitespace(value.charAt(i)); i++) {
}
int keyIndex = i;
for (;
i < length
&& ! XmlChar.isWhitespace((ch = value.charAt(i)))
&& ch != '=';
i++) {
}
if (length <= i)
break;
else if ((ch = value.charAt(keyIndex)) != 'c' && ch != 'C') {
i++;
}
else if (! value.regionMatches(true, keyIndex,
"charset", 0, i - keyIndex)) {
i++;
}
else {
for (; i < length && XmlChar.isWhitespace(value.charAt(i)); i++) {
}
if (length <= i || value.charAt(i) != '=')
continue;
for (i++; i < length && XmlChar.isWhitespace(value.charAt(i)); i++) {
}
if (i < length && value.charAt(i) == '"') {
int encodingIndex = ++i;
for (; i < length && value.charAt(i) != '"'; i++) {
}
_encoding = value.substring(encodingIndex, i).intern();
}
else {
int encodingIndex = i;
for (;
i < length
&& ! XmlChar.isWhitespace(ch = value.charAt(i))
&& ch != ';';
i++) {
}
_encoding = value.substring(encodingIndex, i).intern();
}
for (; i < length && value.charAt(i) != ';'; i++) {
}
if (i < length) {
StringBuilder sb = new StringBuilder();
sb.append(value, 0, semicolon);
sb.append(value, i, value.length());
_contentType = sb.toString().intern();
}
else
_contentType = value.substring(0, semicolon).intern();
return;
}
}
_contentType = value.intern();
}
}