Package org.eclipse.wst.wsi.internal.core.util

Source Code of org.eclipse.wst.wsi.internal.core.util.HttpHeadersValidator$MailboxValidator

/*******************************************************************************
* 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);
  }
}
TOP

Related Classes of org.eclipse.wst.wsi.internal.core.util.HttpHeadersValidator$MailboxValidator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.