core/play/src/main/java/play/core/cookie/encoding/ServerCookieDecoder.java
public Set<Cookie> decode(String header) {
    if (header == null) {
      throw new NullPointerException("header");
    }
    final int headerLen = header.length();

    if (headerLen == 0) {
      return Collections.emptySet();
    }

    Set<Cookie> cookies = new TreeSet<Cookie>();

    int i = 0;

    boolean rfc2965Style = false;
    if (header.regionMatches(true, 0, RFC2965_VERSION, 0, RFC2965_VERSION.length())) {
      // RFC 2965 style cookie, move to after version value
      i = header.indexOf(';') + 1;
      rfc2965Style = true;
    }

    loop:
    for (; ; ) {

      // Skip spaces and separators.
      for (; ; ) {
        if (i == headerLen) {
          break loop;
        }
        char c = header.charAt(i);
        if (c == '\t' || c == '\n' || c == 0x0b || c == '\f' || c == '\r' || c == ' ' || c == ','
            || c == ';') {
          i++;
          continue;
        }
        break;
      }

      int nameBegin = i;
      int nameEnd = i;
      int valueBegin = -1;
      int valueEnd = -1;

      if (i != headerLen) {
        keyValLoop:
        for (; ; ) {

          char curChar = header.charAt(i);
          if (curChar == ';') {
            // NAME; (no value till ';')
            nameEnd = i;
            valueBegin = valueEnd = -1;
            break keyValLoop;

          } else if (curChar == '=') {
            // NAME=VALUE
            nameEnd = i;
            i++;
            if (i == headerLen) {
              // NAME= (empty value, i.e. nothing after '=')
              valueBegin = valueEnd = 0;
              break keyValLoop;
            }

            valueBegin = i;
            // NAME=VALUE;
            int semiPos = header.indexOf(';', i);
            valueEnd = i = semiPos > 0 ? semiPos : headerLen;
            break keyValLoop;
          } else {
            i++;
          }

          if (i == headerLen) {
            // NAME (no value till the end of string)
            nameEnd = headerLen;
            valueBegin = valueEnd = -1;
            break;
          }
        }
      }

      if (rfc2965Style
          && (header.regionMatches(nameBegin, RFC2965_PATH, 0, RFC2965_PATH.length())
              || header.regionMatches(nameBegin, RFC2965_DOMAIN, 0, RFC2965_DOMAIN.length())
              || header.regionMatches(nameBegin, RFC2965_PORT, 0, RFC2965_PORT.length()))) {

        // skip obsolete RFC2965 fields
        continue;
      }

      DefaultCookie cookie = initCookie(header, nameBegin, nameEnd, valueBegin, valueEnd);
      if (cookie != null) {
        cookies.add(cookie);
      }
    }

    return cookies;
  }
public Set<Cookie> decode(String header) {
    if (header == null) {
      throw new NullPointerException("header");
    }
    final int headerLen = header.length();

    if (headerLen == 0) {
      return Collections.emptySet();
    }

    Set<Cookie> cookies = new TreeSet<Cookie>();

    int i = 0;

    boolean rfc2965Style = false;
    if (header.regionMatches(true, 0, RFC2965_VERSION, 0, RFC2965_VERSION.length())) {
      // RFC 2965 style cookie, move to after version value
      i = header.indexOf(';') + 1;
      rfc2965Style = true;
    }

    loop:
    for (; ; ) {

      // Skip spaces and separators.
      for (; ; ) {
        if (i == headerLen) {
          break loop;
        }
        char c = header.charAt(i);
        if (c == '\t' || c == '\n' || c == 0x0b || c == '\f' || c == '\r' || c == ' ' || c == ','
            || c == ';') {
          i++;
          continue;
        }
        break;
      }

      int nameBegin = i;
      int nameEnd = i;
      int valueBegin = -1;
      int valueEnd = -1;

      if (i != headerLen) {
        keyValLoop:
        for (; ; ) {

          char curChar = header.charAt(i);
          if (curChar == ';') {
            // NAME; (no value till ';')
            nameEnd = i;
            valueBegin = valueEnd = -1;
            break keyValLoop;

          } else if (curChar == '=') {
            // NAME=VALUE
            nameEnd = i;
            i++;
            if (i == headerLen) {
              // NAME= (empty value, i.e. nothing after '=')
              valueBegin = valueEnd = 0;
              break keyValLoop;
            }

            valueBegin = i;
            // NAME=VALUE;
            int semiPos = header.indexOf(';', i);
            valueEnd = i = semiPos > 0 ? semiPos : headerLen;
            break keyValLoop;
          } else {
            i++;
          }

          if (i == headerLen) {
            // NAME (no value till the end of string)
            nameEnd = headerLen;
            valueBegin = valueEnd = -1;
            break;
          }
        }
      }

      if (rfc2965Style
          && (header.regionMatches(nameBegin, RFC2965_PATH, 0, RFC2965_PATH.length())
              || header.regionMatches(nameBegin, RFC2965_DOMAIN, 0, RFC2965_DOMAIN.length())
              || header.regionMatches(nameBegin, RFC2965_PORT, 0, RFC2965_PORT.length()))) {

        // skip obsolete RFC2965 fields
        continue;
      }

      DefaultCookie cookie = initCookie(header, nameBegin, nameEnd, valueBegin, valueEnd);
      if (cookie != null) {
        cookies.add(cookie);
      }
    }

    return cookies;
  }
public Set < Cookie > decode ( String header ) { if ( header == null ) { throw new NullPointerException ( "header" ) ; } final int headerLen = header . length ( ) ; if ( headerLen == 0 ) { return Collections . emptySet ( ) ; } Set < Cookie > cookies = new TreeSet < Cookie > ( ) ; int i = 0 ; boolean rfc2965Style = false ; if ( header . regionMatches ( true , 0 , RFC2965_VERSION , 0 , RFC2965_VERSION . length ( ) ) ) { // RFC 2965 style cookie, move to after version value i = header . indexOf ( ' ' ) + 1 ; rfc2965Style = true ; } loop : for ( ; ; ) { // Skip spaces and separators. for ( ; ; ) { if ( i == headerLen ) { break loop ; } char c = header . charAt ( i ) ; if ( c == ' ' || c == ' ' || c == 0x0b || c == ' ' || c == ' ' || c == ' ' || c == ' ' || c == ' ' ) { i ++ ; continue ; } break ; } int nameBegin = i ; int nameEnd = i ; int valueBegin = - 1 ; int valueEnd = - 1 ; if ( i != headerLen ) { keyValLoop : for ( ; ; ) { char curChar = header . charAt ( i ) ; if ( curChar == ' ' ) { // NAME; (no value till ';') nameEnd = i ; valueBegin = valueEnd = - 1 ; break keyValLoop ; } else if ( curChar == ' ' ) { // NAME=VALUE nameEnd = i ; i ++ ; if ( i == headerLen ) { // NAME= (empty value, i.e. nothing after '=') valueBegin = valueEnd = 0 ; break keyValLoop ; } valueBegin = i ; // NAME=VALUE; int semiPos = header . indexOf ( ' ' , i ) ; valueEnd = i = semiPos > 0 ? semiPos : headerLen ; break keyValLoop ; } else { i ++ ; } if ( i == headerLen ) { // NAME (no value till the end of string) nameEnd = headerLen ; valueBegin = valueEnd = - 1 ; break ; } } } if ( rfc2965Style && ( header . regionMatches ( nameBegin , RFC2965_PATH , 0 , RFC2965_PATH . length ( ) ) || header . regionMatches ( nameBegin , RFC2965_DOMAIN , 0 , RFC2965_DOMAIN . length ( ) ) || header . regionMatches ( nameBegin , RFC2965_PORT , 0 , RFC2965_PORT . length ( ) ) ) ) { // skip obsolete RFC2965 fields continue ; } DefaultCookie cookie = initCookie ( header , nameBegin , nameEnd , valueBegin , valueEnd ) ; if ( cookie != null ) { cookies . add ( cookie ) ; } } return cookies ; }
Decodes the specified Set-Cookie HTTP header value into a {@link Cookie}.

@param header the Set-Cookie header.
@return the decoded {@link Cookie}
Decodes the specified Set - Cookie HTTP header value into a { @link Cookie } .