diff options
Diffstat (limited to 'bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/HttpHeadersValidator.java')
-rw-r--r-- | bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/HttpHeadersValidator.java | 1721 |
1 files changed, 0 insertions, 1721 deletions
diff --git a/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/HttpHeadersValidator.java b/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/HttpHeadersValidator.java deleted file mode 100644 index a76a499bd..000000000 --- a/bundles/org.eclipse.wst.wsi/src/org/eclipse/wst/wsi/internal/core/util/HttpHeadersValidator.java +++ /dev/null @@ -1,1721 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2002-2005 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * IBM - Initial API and implementation - *******************************************************************************/ -package org.eclipse.wst.wsi.internal.core.util; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.text.ParseException; -import java.util.Locale; -import com.ibm.icu.util.StringTokenizer; - -import sun.net.www.MessageHeader; - -import com.ibm.icu.text.SimpleDateFormat; - -/** - * This class checks HTTP request headers about RFC 2616. - * - * @author Volodin - */ -public class HttpHeadersValidator -{ - - private static final String HEADER_ALLOW = "Allow"; - private static final String HEADER_CONTENT_TYPE = "Content-Type"; - private static final String HEADER_CONTENT_ENCODING = "Content-Encoding"; - private static final String HEADER_CONTENT_LANGUAGE = "Content-Language"; - private static final String HEADER_CONTENT_LENGHT = "Content-Length"; - private static final String HEADER_CONTENT_LOCATION = "Content-Location"; - private static final String HEADER_CONTENT_RANGE = "Content-Range"; - private static final String HEADER_EXPIRES = "Expires"; - private static final String HEADER_LAST_MODIFIED = "Last-Modified"; - private static final String HEADER_CACHE_CONTROL = "Cache-Control"; - private static final String HEADER_CONNECTION = "Connection"; - private static final String HEADER_DATE = "Date"; - private static final String HEADER_PRAGMA = "Pragma"; - private static final String HEADER_TRAILER = "Trailer"; - private static final String HEADER_TRANSFER_ENCODING = "Transfer-Encoding"; - - private static final String HEADER_UPGRADE = "Upgrade"; - private static final String HEADER_VIA = "Via"; - private static final String HEADER_WARNING = "Warning"; - - private static final String HEADER_ACCEPT = "Accept"; - private static final String HEADER_ACCEPT_CHARSET = "Accept-Charset"; - private static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding"; - private static final String HEADER_ACCEPT_LANGUAGE = "Accept-Language"; - private static final String HEADER_AUTHORIZATION = "Authorization"; - private static final String HEADER_EXPECT = "Expect"; - private static final String HEADER_FROM = "From"; - private static final String HEADER_HOST = "Host"; - private static final String HEADER_IF_MATCH = "If-Match"; - private static final String HEADER_IF_MODIFIED_SINCE = "If-Modified-Since"; - private static final String HEADER_IF_NONE_MATCH = "If-None-Match"; - private static final String HEADER_IF_RANGE = "If-Range"; - private static final String HEADER_IF_UNMODIFIED_SINCE = - "If-Unmodified-Since"; - private static final String HEADER_MAX_FORWARDS = "Max-Forwards"; - private static final String HEADER_PROXY_AUTHORIZATION = - "Proxy-Authorization"; - private static final String HEADER_RANGE = "Range"; - private static final String HEADER_REFERER = "Referer"; - private static final String HEADER_TE = "TE"; - private static final String HEADER_USER_AGENT = "User-Agent"; - - /** - * This class checks e-mail string about RFC 822. - */ - public static class MailboxValidator - { - private static final char[] SPECIAL = - { '(', ')', '<', '>', '@', ',', ';', ':', '\\', '\"', '.', '[', ']' }; - - /** - * Validates e-mail string. - * @param mailbox e-mail string - * @return boolean true if e-mail string is conform to RFC 822, false otherwise. - */ - - public static boolean validateMailbox(String mailbox) - { - - if (!isFullAddr(mailbox) && !isShortAddr(mailbox)) - return false; - - return true; - } - - /** - * Method isSimpleAddr. - * @param mailbox - * @return boolean - */ - private static boolean isShortAddr(String mailbox) - { - int indexAt = mailbox.indexOf('@'); - if (indexAt == -1) - return false; - - if (!isLocalPart(mailbox.substring(0, indexAt)) - || !isDomain(mailbox.substring(indexAt + 1))) - return false; - - return true; - } - - /** - * Method isDomaim. - * @param string - * return boolean - */ - private static boolean isDomain(String string) - { - if (string.trim().length() == 0) - return false; - StringTokenizer st = new StringTokenizer(string, "."); - while (st.hasMoreTokens()) - { - String subDomain = st.nextToken(); - if (!isAtom(subDomain) && !isDomainLiteral(subDomain)) - return false; - - } - return true; - } - - /** - * Method isDomainLiteral. - * @param subDomain - * @return boolean - */ - private static boolean isDomainLiteral(String subDomain) - { - if (getLastDomainLiteral(subDomain, 0) == subDomain.length()) - { - return true; - } - else - { - return false; - } - } - - private static int getLastDomainLiteral(String str, int startIndex) - { - - int index = startIndex; - //int newIndex = 0; - - // if end if the string - if (startIndex == str.length()) - return startIndex; - // if the begin is not '[' - if (str.charAt(index) != '[') - return startIndex; - - index++; - while (true) - { - index = getLastDtext(str, index); - if (index == str.length()) - return startIndex; - if (BasicRules.isQuotedPair(str, index - 1)) - { - index++; - if (index == str.length()) - return startIndex; - } - else - break; - } - // if the end is not ']' - if (str.charAt(index) != ']') - return startIndex; - - index++; - return index; - } - - private static int getLastDtext(String str, int startIndex) - { - if (str.length() == startIndex) - return startIndex; - int i = 0; - for (; i < str.length(); i++) - { - char ch = str.charAt(i); - i = BasicRules.getLastIndexLWS(str, i); - if (!BasicRules.isCHAR(ch) - || str.charAt(i) == '[' - || str.charAt(i) == ']' - || str.charAt(i) == '\\' - || str.charAt(i) == BasicRules.CR) - { - return i + 1; - } - } - return i + 1; - } - - /** - * Method isLocalPart. - * @param string - * @return boolean - */ - private static boolean isLocalPart(String string) - { - if (string.trim().length() == 0) - return false; - StringTokenizer st = new StringTokenizer(string, "."); - while (st.hasMoreTokens()) - { - if (!isWord(st.nextToken())) - return false; - } - return true; - } - - /** - * Method isWord. - * @param string - * @return boolean - */ - private static boolean isWord(String string) - { - if (!isAtom(string) && !isQuotedString(string)) - return false; - return true; - } - - /** - * Method isAtom. - * @param string - * @return boolean - */ - private static boolean isAtom(String string) - { - if (string.length() == 0) - return false; - for (int i = 0; i < string.length(); i++) - { - if (!BasicRules.isCHAR(string.charAt(i)) - || isSpecial(string.charAt(i)) - || string.charAt(i) == ' ' - || BasicRules.isCTL(string.charAt(i))) - { - return false; - } - } - return true; - } - - /** - * Method isSpecial. - * @param c - * @return boolean - */ - private static boolean isSpecial(char ch) - { - for (int index = 0; index < SPECIAL.length; index++) - { - if (ch == SPECIAL[index]) - return true; - } - return false; - } - - /** - * Method isFullAddr. - * @param mailbox - * @return boolean - */ - private static boolean isFullAddr(String mailbox) - { - if (mailbox.length() == 0) - return false; - int idxLT = mailbox.indexOf('<'); - if (idxLT == -1) - return false; - - //is phrase - String phrase = mailbox.substring(0, idxLT); - StringTokenizer st = new StringTokenizer(phrase, " "); - if (st.countTokens() == 0) - return false; - while (st.hasMoreTokens()) - { - if (!isWord(st.nextToken())) - return false; - } - if (phrase.charAt(phrase.length() - 1) != BasicRules.SP) - { - return false; - } - - //is route-addr - String routeAddr = mailbox.substring(idxLT + 1); - // is route - int idxTwoSpot = routeAddr.indexOf(':'); - if (idxTwoSpot != -1) - { - StringTokenizer stRouteAddr = - new StringTokenizer(routeAddr.substring(0, idxTwoSpot), ","); - if (!stRouteAddr.hasMoreTokens()) - return false; - while (stRouteAddr.hasMoreTokens()) - { - if (!isDomain(stRouteAddr.nextToken())) - return false; - } - } - - //is addr spec - int idxGT = routeAddr.indexOf('>'); - if (idxGT == -1 || idxGT != (routeAddr.length() - 1)) - return false; - - if (!isShortAddr(routeAddr.substring(idxTwoSpot + 1, idxGT))) - return false; - - return true; - } - - } - - /** - * Validates HTTP request headers. - * @param headers HTTP request headers - * @return boolean true if all HTTP headers string is conform to RFC 2616, false otherwise. - */ - - public static boolean validateHttpRequestHeaders(String headers) - { - - MessageHeader mh = new MessageHeader(); - try - { - mh.parseHeader(new ByteArrayInputStream(headers.getBytes())); - } - catch (IOException e) - { - return false; - } - - String header = null; - String value = null; - - header = mh.getKey(0); - if (header != null) - return false; - - value = mh.getValue(0); - if (value == null) - return false; - - //method - StringTokenizer st = new StringTokenizer(value, " "); - if (!st.hasMoreElements()) - return false; - String str = st.nextToken(); - if (!isToken(str)) - return false; - - if (!st.hasMoreElements()) - return false; - str = st.nextToken(); - if (!isURI(str) && !str.equals("*")) - return false; - - if (!st.hasMoreElements()) - return false; - str = st.nextToken(); - if (!isHTTPVersion(str)) - return false; - - int i = 1; - try - { - while ((header = mh.getKey(i)) != null) - { - value = mh.getValue(i); - i++; - - // is message-header token - if (!isToken(header)) - return false; - - //---- entity-headers - - if (header.equals(HEADER_ALLOW)) - { - if (!isValidAllow(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_CONTENT_TYPE)) - { - if (!isMediaType(value)) - return false; - else - continue; - } - if (header.equals(HEADER_CONTENT_ENCODING)) - { - if (!isToken(value)) - return false; - else - continue; - } - if (header.equals(HEADER_CONTENT_LANGUAGE)) - { - if (!isLanguageTag(value)) - return false; - else - continue; - } - if (header.equals(HEADER_CONTENT_LENGHT)) - { - if (!isDidgit(value)) - return false; - else - continue; - } - if (header.equals(HEADER_CONTENT_LOCATION)) - { - if (!isURI(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_CONTENT_RANGE)) - { - if (!isValidContentRange(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_EXPIRES) - || header.equals(HEADER_LAST_MODIFIED)) - { - if (!isHTTPDate(value)) - return false; - else - continue; - } - - //---- general-headers - if (header.equals(HEADER_CACHE_CONTROL)) - { - if (!isValidCacheControl(value)) - return false; - - continue; - //return true; - } - - if (header.equals(HEADER_CONNECTION)) - { - if (!isToken(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_DATE)) - { - if (!isHTTPDate(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_PRAGMA)) - { - if (!isPragmaDerective(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_TRAILER)) - { - if (!isToken(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_TRANSFER_ENCODING)) - { - if (!isTransferCoding(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_UPGRADE)) - { - if (!isValidUpgrade(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_VIA)) - { - if (!isValidVia(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_WARNING)) - { - if (!isValidWarning(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_ACCEPT)) - { - if (!isValidAccept(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_ACCEPT_CHARSET)) - { - if (!isValidAcceptCharSet(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_ACCEPT_ENCODING)) - { - if (!isValidAcceptEncoding(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_ACCEPT_LANGUAGE)) - { - if (!isValidAcceptLanguage(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_AUTHORIZATION) - || header.equals(HEADER_PROXY_AUTHORIZATION)) - { - if (!isCredentials(value)) - return false; - else - continue; - } - if (header.equals(HEADER_EXPECT)) - { - if (!isExpectation(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_FROM)) - { - if (!MailboxValidator.validateMailbox(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_IF_MATCH) - || header.equals(HEADER_IF_NONE_MATCH)) - { - if (!isValidIfMatch(value)) - return false; - else - continue; - } - if (header.equals(HEADER_IF_RANGE)) - { - if (!isEntityTag(value) && !isHTTPDate(value)) - return false; - else - continue; - } - - //--- - if (header.equals(HEADER_IF_MODIFIED_SINCE)) - { - if (!isHTTPDate(value)) - return false; - else - continue; - } - if (header.equals(HEADER_IF_UNMODIFIED_SINCE)) - { - if (!isHTTPDate(value)) - return false; - else - continue; - } - if (header.equals(HEADER_MAX_FORWARDS)) - { - if (!isDidgit(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_USER_AGENT)) - { - if (!isValidUserAgent(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_TE)) - { - if (!isValidTE(value)) - return false; - else - continue; - } - - if (header.equals(HEADER_RANGE)) - { - if (!isRange(value)) - return false; - else - continue; - } - if (header.equals(HEADER_HOST)) - { - if (!isHost(value)) - return false; - else - continue; - } - if (header.equals(HEADER_REFERER)) - { - if (!isURI(value)) - return false; - else - continue; - } - - } - } - catch (Exception e) - { - return false; - } - return true; - } - - /** - * Method isValidIfMatch. - * @param value - * @return boolean - */ - private static boolean isValidIfMatch(String value) - { - if (value.trim().length() == 0) - return true; - if ("*".equals(value.trim())) - return true; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - if (!isEntityTag(str)) - return false; - - } - - return true; - } - - /** - * Method isValidUpgrade. - * @param value - * @return boolean - */ - private static boolean isValidUpgrade(String value) - { - if (value.trim().length() == 0) - return false; - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - if (!isProduct(str)) - return false; - - } - return true; - } - - /** - * Method isValidCacheControl. - * @param value - * @return boolean - */ - private static boolean isValidCacheControl(String value) - { - - if (value.trim().length() == 0) - return false; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - int index = str.indexOf('='); - if (index == -1) - { - - } - else - { - if (!isToken(str.substring(0, index))) - return false; - String strAfterEq = str.substring(index + 1); - if (!isToken(strAfterEq) && !isQuotedString(strAfterEq)) - { - return false; - } - } - } - - return true; - } - - /** - * Method isHTTPVersion. - * @param str - * @return boolean - */ - private static boolean isHTTPVersion(String str) - { - if (!str.startsWith("HTTP/")) - return false; - int idx = "HTTP/".length(); - - int idx2 = str.indexOf("."); - - // 1*DIGIT - String s = str.substring(idx, idx2); - if (!isDidgit(s)) - return false; - - s = str.substring(idx2 + 1); - if (!isDidgit(s)) - return false; - - return true; - } - - /** - * Method isValidWarning. - * @param value - * @return boolean - */ - private static boolean isValidWarning(String value) - { - if (value.length() == 0) - return false; - value = value.trim(); - StringTokenizer st = new StringTokenizer(value, " "); - String str = st.nextToken(); - - if (str.length() > 3 || !isDidgit(str)) - return false; - - if (!st.hasMoreTokens()) - return false; - str = st.nextToken(); - if (!isHost(str) && !isToken(str)) - return false; - - //if(!st.hasMoreTokens()) return false; - str = st.nextToken("").trim(); - //??? - - int lastQuotedString = BasicRules.getLastQuotedString(str, 0); - if (lastQuotedString == str.length()) - { - return true; - } - else - { - String data = str.substring(lastQuotedString); - if (data.charAt(data.length()) != '\"') - return false; - if (str.charAt(0) != '\"') - return false; - if (!isHTTPDate(str.substring(1, data.length() - 1))) - return false; - } - - return true; - } - - /** - * Method isValidVia. - * @param value - * @return boolean - */ - private static boolean isValidVia(String value) - { - if (value.trim().length() == 0) - return false; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - - String str = st.nextToken().trim(); - - StringTokenizer st2 = new StringTokenizer(str, " "); - - // protocol/version - str = st2.nextToken(); - int idx = str.indexOf("/"); - if (idx == -1) - { - if (!isToken(str)) - return false; - } - else - { - if (!isToken(str.substring(0, idx)) - || !isToken(str.substring(idx + 1))) - return false; - } - - //host - str = st2.nextToken(); - if (!isHost(str) && !isToken(str)) - return false; - - //comment - if (st2.hasMoreTokens()) - { - str = st2.nextToken(""); - if (!isComment(str.trim())) - return false; - } - } - return true; - } - - /** - * Method isHost. - * @param value - * @return boolean - */ - private static boolean isHost(String value) - { - - try - { - new URL("http://" + value); - } - catch (MalformedURLException e) - { - return false; - } - return true; - } - - /** - * Method isValidAllow. - * @param value - * @return boolean - */ - private static boolean isValidAllow(String value) - { - if (value.trim().length() == 0) - return true; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - if (!isToken(str)) - return false; - } - return true; - } - - /** - * Method isValidContentRange. - * @param value - * @return boolean - */ - private static boolean isValidContentRange(String value) - { - if (value.length() == 0) - return false; - if (!value.startsWith("bytes")) - return false; - String str = value.substring("bytes".length()).trim(); - - int idx = str.indexOf("/"); - if (idx == -1) - return false; - - String byteRange = str.substring(0, idx); - int idx2 = byteRange.indexOf("-"); - if (idx2 == -1) - { - if (!byteRange.equals("*")) - return false; - } - else - { - if (!isDidgit(byteRange.substring(0, idx2)) - || !isDidgit(byteRange.substring(idx2 + 1))) - return false; - } - - if (!isDidgit(str.substring(idx + 1)) - && !str.substring(idx + 1).equals("*")) - return false; - - return true; - } - - /** - * Method isRange. - * @param value - * @return boolean - */ - private static boolean isRange(String value) - { - if (value.length() == 0) - return false; - if (!value.startsWith("bytes=")) - return false; - String strByteRange = value.substring("bytes=".length()); - - StringTokenizer st = new StringTokenizer(strByteRange, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken(); - int idx = str.indexOf("-"); - if (idx == -1) - return false; - if (idx == 0) - { - if (!isDidgit(str.substring(1))) - return false; - } - else - { - if (idx == (str.length() - 1)) - { - if (!isDidgit(str.substring(0, str.length() - 1))) - return false; - } - else - { - if (!isDidgit(str.substring(0, idx)) - || !isDidgit(str.substring(idx + 1))) - return false; - } - - } - - } - return true; - } - - /** - * Method isValidTE. - * @param value - * @return boolean - */ - private static boolean isValidTE(String value) - { - if (value.trim().length() == 0) - return true; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - if (st.equals("trailers")) - return true; - - int idx = str.indexOf(";"); - if (idx == -1) - { - if (!isLanguageRange(str)) - return false; - } - else - { - String _1 = str.substring(0, idx).trim(); - String _2 = str.substring(idx + 1).trim(); - if (!isLanguageRange(_1)) - return false; - if (!isQAndQValue(_2)) - return false; - } - - } - - return true; - } - - /** - * Method isValidUserAgent. - * @param value - * @return boolean - */ - private static boolean isValidUserAgent(String value) - { - if (value.length() == 0) - return false; - StringTokenizer st = new StringTokenizer(value, " "); - while (st.hasMoreElements()) - { - String str = st.nextToken(); - if (!isProduct(str) && !isComment(str)) - return false; - - } - - return true; - } - - /** - * Method isComment. - * @param str - * @return boolean - */ - private static boolean isComment(String str) - { - if (BasicRules.getLastComment(str, 0) != str.length()) - return false; - return true; - } - - /** - * Method isValidAcceptLanguage. - * @param value - * @return boolean - */ - private static boolean isValidAcceptLanguage(String value) - { - if (value.trim().length() == 0) - return false; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - int idx = str.indexOf(";"); - if (idx == -1) - { - if (!isToken(str)) - return false; - } - else - { - String _1 = str.substring(0, idx).trim(); - String _2 = str.substring(idx + 1).trim(); - if (!isToken(_1)) - return false; - if (!isAcceptParams(_2)) - return false; - } - - } - - return true; - } - - /** - * Method isLanguageRange. - * @param str - * @return boolean - */ - private static boolean isLanguageRange(String str) - { - if (str.trim().equals("*")) - return true; - StringTokenizer st = new StringTokenizer(str, "-"); - while (st.hasMoreElements()) - { - if (!is8ALPHA(st.nextToken())) - return false; - } - return true; - } - - /** - * Method isValidAcceptEncoding. - * @param value - * @return boolean - */ - private static boolean isValidAcceptEncoding(String value) - { - if (value.trim().length() == 0) - return false; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - int idx = str.indexOf(";"); - if (idx == -1) - { - if (!isToken(str) && !str.equals("*")) - return false; - } - else - { - String _1 = str.substring(0, idx).trim(); - String _2 = str.substring(idx + 1).trim(); - - if ((!isToken(_1) && !_1.equals("*"))) - return false; - if (!isQAndQValue(_2)) - return false; - } - - } - - return true; - } - - /** - * Method isValidAcceptCharSet. - * @param value - * @return boolean - */ - private static boolean isValidAcceptCharSet(String value) - { - if (value.trim().length() == 0) - return false; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - int idx = str.indexOf(";"); - if (idx == -1) - { - if (!isToken(str) && !str.equals("*")) - return false; - } - else - { - String _1 = str.substring(0, idx).trim(); - String _2 = str.substring(idx + 1).trim(); - - if ((!isToken(_1) && !_1.equals("*"))) - return false; - if (!isQAndQValue(_2)) - return false; - } - - } - - return true; - } - - /** - * Method isValidAccept. - * @param value - * @return boolean - */ - private static boolean isValidAccept(String value) - { - if (value.trim().length() == 0) - return true; - - StringTokenizer st = new StringTokenizer(value, ","); - while (st.hasMoreElements()) - { - String str = st.nextToken().trim(); - int idx = str.indexOf(";"); - if (idx == -1) - { - if (!isMediaRange(str)) - return false; - } - else - { - if (!isMediaRange(str.substring(0, idx).trim()) - || !isAcceptParams(str.substring(idx + 1).trim())) - return false; - - } - - } - return true; - } - - /** - * Method isAcceptParams. - * @param string - * @return boolean - */ - private static boolean isAcceptParams(String string) - { - if (string.trim().length() == 0) - return false; - - StringTokenizer st = new StringTokenizer(string, ";"); - String str = st.nextToken(); - - int idx = str.indexOf("="); - if (idx == -1) - { - if (str.equals("q") || !isToken(str)) - return false; - } - else - { - if (str.substring(0, idx).equals("q")) - { - if (!isQValue(str.substring(idx + 1))) - return false; - } - else - { - if (!isParameterWithoutValue(str)) - return false; - } - } - - while (st.hasMoreElements()) - { - str = st.nextToken(); - if (!isParameterWithoutValue(str)) - return false; - } - return true; - } - - /** - * Method isQAndQValue. - * @param str - * @return boolean - */ - private static boolean isQAndQValue(String str) - { - str = str.trim(); - if (!str.trim().startsWith("q=")) - return false; - if (!isQValue(str.substring("q=".length()))) - return false; - return true; - } - - /** - * Method isQValue. - * @param string - * @return boolean - */ - private static boolean isQValue(String string) - { - if (string.trim().length() == 0) - return false; - - int idx = string.indexOf("."); - if (idx == -1) - { - if (!"0".equals(string) && !"1".equals(string)) - return false; - } - else - { - String strDig = string.substring(idx + 1); - if (strDig.length() > 3) - return false; - - if (string.substring(0, idx).equals("0")) - { - if (!isDidgit(strDig)) - return false; - - } - else - { - if (!string.substring(0, idx).equals("1")) - return false; - - for (int i = 0; i < strDig.length(); i++) - { - if (strDig.charAt(i) != '0') - return false; - } - } - - } - return true; - } - - /** - * Method isMediaRange. - * @param str - * @return boolean - */ - private static boolean isMediaRange(String str) - { - if (str.trim().length() == 0) - return false; - - int idx = str.indexOf("/"); - if (idx == -1) - return false; - - if (!isToken(str.substring(0, idx)) && !str.substring(0, idx).equals("*")) - return false; - if (!isToken(str.substring(idx + 1)) - && !str.substring(idx + 1).equals("*")) - return false; - - return true; - } - - /** - * Method isEntityTag. - * @param value - * @return boolean - */ - private static boolean isEntityTag(String value) - { - - int idx = 0; - if (value.startsWith("W/")) - idx = 2; - if (!isQuotedString(value.substring(idx))) - return false; - return true; - } - - /** - * Method isExpectation. - * @param value - * @return boolean - */ - private static boolean isExpectation(String value) - { - if (value.equals("100-continue")) - return true; - - StringTokenizer st = new StringTokenizer(value, ";"); - while (st.hasMoreElements()) - { - if (!isParameterWithoutValue(st.nextToken())) - return false; - } - - return true; - } - - /** - * Method isCredentials. - * @param value - * @return boolean - */ - private static boolean isCredentials(String value) - { - StringTokenizer st = new StringTokenizer(value, " "); - if (!isToken(st.nextToken())) - return false; - - while (st.hasMoreElements()) - { - String param = st.nextToken(","); - if (!isParameter(param)) - return false; - } - return true; - } - - /** - * Method isProduct. - * @param value - * @return boolean - */ - private static boolean isProduct(String value) - { - int idx = value.indexOf("/"); - if (idx == -1) - { - if (!isToken(value)) - return false; - } - else - { - if (!isToken(value.substring(0, idx)) - || !isToken(value.substring(idx + 1))) - return false; - } - return true; - } - - /** - * Method isTransferCoding. - * @param value - * @return boolean - */ - private static boolean isTransferCoding(String value) - { - if (value.equals("chunked")) - { - return true; - } - else - { - StringTokenizer st = new StringTokenizer(value, ";"); - if (!isToken(st.nextToken())) - return false; - - while (st.hasMoreElements()) - { - if (!isParameter(st.nextToken())) - return false; - } - - } - - return true; - } - - /** - * Method isParameter. - * @param string - * @return boolean - */ - private static boolean isParameter(String string) - { - - // check parameter - int idx = string.indexOf("="); - if (!isToken(string.substring(0, idx))) - return false; - - String parValue = string.substring(idx + 1); - if (!isToken(parValue) && !isQuotedString(parValue)) - return false; - - return true; - } - - /** - * Method isParameterWithoutValue. - * @param string - * @return boolean - */ - private static boolean isParameterWithoutValue(String string) - { - - // check parameter - int idx = string.indexOf("="); - if (idx != -1) - { - if (!isToken(string.substring(0, idx))) - return false; - String parValue = string.substring(idx + 1); - if (!isToken(parValue) && !isQuotedString(parValue)) - return false; - - } - else - { - if (!isToken(string)) - return false; - } - - return true; - } - - /** - * Method isPragmaDerective. - * @param value - * @return boolean - */ - private static boolean isPragmaDerective(String value) - { - if (value.equals("no-cache")) - return true; - else - { - int idx = value.indexOf("="); - if (idx == -1) - { - if (isToken(value)) - return true; - } - else - { - String str = value.substring(idx + 1); - if (isToken(value.substring(0, idx)) - && (isToken(str) || isQuotedString(str))) - return true; - } - } - return true; - } - - /** - * Method isHTTPDate. - * @param value - * @return boolean - */ - private static boolean isHTTPDate(String value) - { - - String rfc1123_date = "EEE, dd MMM yyyy hh:mm:ss 'GMT'"; - String rfc850_date = "EEEE, dd-MMM-yy hh:mm:ss 'GMT'"; - String asctime_date = "EEE MMM d hh:mm:ss yyyy"; - - try - { - SimpleDateFormat sdf = new SimpleDateFormat(rfc1123_date, Locale.US); - if (sdf.parse(value) != null) - return true; - } - catch (ParseException e) - { - } - - try - { - SimpleDateFormat sdf = new SimpleDateFormat(rfc850_date, Locale.US); - if (sdf.parse(value) != null) - return true; - } - catch (ParseException e) - { - } - - try - { - SimpleDateFormat sdf = new SimpleDateFormat(asctime_date, Locale.US); - if (sdf.parse(value) != null) - return true; - } - catch (ParseException e) - { - } - - return false; - - } - - /** - * Method isURI. - * @param value - * @return boolean - */ - private static boolean isURI(String value) - { - try - { - new URL(value); - } - catch (MalformedURLException e) - { - try - { - new URL("http://localhost" + value); - } - catch (MalformedURLException e2) - { - return false; - } - } - - return true; - } - - /** - * Method isLanguageTag. - * @param value - * @return boolean - */ - private static boolean isLanguageTag(String value) - { - int idx = value.indexOf("-"); - if (idx == -1) - { - return is8ALPHA(value); - } - else - { - if (!is8ALPHA(value.substring(0, idx)) - || !is8ALPHA(value.substring(idx + 1))) - return false; - else - return true; - - } - } - - /** - * Method is8ALPHA. - * @param string - * @return boolean - */ - private static boolean is8ALPHA(String string) - { - if (string.length() > 8 || !isALPHA(string)) - return false; - else - return true; - } - - /** - * Method isALPHA. - * @param string - * @return boolean - */ - private static boolean isALPHA(String string) - { - for (int i = 0; i < string.length(); i++) - { - if (!BasicRules.isCHAR(string.charAt(i))) - return false; - } - - return true; - } - - /** - * Method isDidgit. - * @param value - * @return boolean - */ - private static boolean isDidgit(String value) - { - if (value.length() == 0) - return false; - char[] chs = value.toCharArray(); - for (int i = 0; i < chs.length; i++) - { - if (chs[i] < '0' || chs[i] > '9') - return false; - } - - return true; - } - - /** - * Method isMediaType. - * @param value - * @return boolean - */ - private static boolean isMediaType(String value) - { - StringTokenizer st = new StringTokenizer(value, ";"); - String mediaType = st.nextToken(); - - int idx = mediaType.indexOf("/"); - if (!isToken(mediaType.substring(0, idx)) - || !isToken(mediaType.substring(idx + 1))) - { - return false; - } - - while (st.hasMoreElements()) - { - if (!isParameter(st.nextToken(";").trim())) - return false; - } - return true; - } - - /** - * Method isQuotedString. - * @param parValue - * @return boolean - */ - private static boolean isQuotedString(String parValue) - { - if (BasicRules.getLastQuotedString(parValue, 0) != parValue.length()) - { - return false; - } - return true; - } - - /** - * Method isToken. - * @param value - * @return boolean - */ - private static boolean isToken(String value) - { - return BasicRules.isToken(value); - } -} |