Old cookies classes removed (#8812)
Motivation: We currently include two different cookie implementations, one is deprecated and one is not. We should remove the deprecated implentation. Modifications: Remove deprecated cookies classes. Result: Less code to maintain.
This commit is contained in:
parent
e3846c54f6
commit
245cccd5e0
@ -1,88 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2014 The Netty Project
|
|
||||||
*
|
|
||||||
* The Netty Project licenses this file to you under the Apache License,
|
|
||||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package io.netty.handler.codec.http;
|
|
||||||
|
|
||||||
import io.netty.handler.codec.http.cookie.ClientCookieDecoder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A <a href="http://tools.ietf.org/html/rfc6265">RFC6265</a> compliant cookie encoder to be used client side,
|
|
||||||
* so only name=value pairs are sent.
|
|
||||||
*
|
|
||||||
* User-Agents are not supposed to interpret cookies, so, if present, {@link Cookie#rawValue()} will be used.
|
|
||||||
* Otherwise, {@link Cookie#value()} will be used unquoted.
|
|
||||||
*
|
|
||||||
* Note that multiple cookies are supposed to be sent at once in a single "Cookie" header.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* // Example
|
|
||||||
* {@link HttpRequest} req = ...;
|
|
||||||
* res.setHeader("Cookie", {@link ClientCookieEncoder}.encode("JSESSIONID", "1234"));
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @see ClientCookieDecoder
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public final class ClientCookieEncoder {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the specified cookie into a Cookie header value.
|
|
||||||
*
|
|
||||||
* @param name the cookie name
|
|
||||||
* @param value the cookie value
|
|
||||||
* @return a Rfc6265 style Cookie header value
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String encode(String name, String value) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ClientCookieEncoder.LAX.encode(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the specified cookie into a Cookie header value.
|
|
||||||
*
|
|
||||||
* @param cookie the specified cookie
|
|
||||||
* @return a Rfc6265 style Cookie header value
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String encode(Cookie cookie) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ClientCookieEncoder.LAX.encode(cookie);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the specified cookies into a single Cookie header value.
|
|
||||||
*
|
|
||||||
* @param cookies some cookies
|
|
||||||
* @return a Rfc6265 style Cookie header value, null if no cookies are passed.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String encode(Cookie... cookies) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ClientCookieEncoder.LAX.encode(cookies);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the specified cookies into a single Cookie header value.
|
|
||||||
*
|
|
||||||
* @param cookies some cookies
|
|
||||||
* @return a Rfc6265 style Cookie header value, null if no cookies are passed.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String encode(Iterable<Cookie> cookies) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ClientCookieEncoder.LAX.encode(cookies);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ClientCookieEncoder() {
|
|
||||||
// unused
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,221 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 The Netty Project
|
|
||||||
*
|
|
||||||
* The Netty Project licenses this file to you under the Apache License,
|
|
||||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package io.netty.handler.codec.http;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An interface defining an
|
|
||||||
* <a href="http://en.wikipedia.org/wiki/HTTP_cookie">HTTP cookie</a>.
|
|
||||||
* @deprecated Use {@link io.netty.handler.codec.http.cookie.Cookie} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public interface Cookie extends io.netty.handler.codec.http.cookie.Cookie {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #name()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String getName();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #value()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String getValue();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #domain()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String getDomain();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #path()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String getPath();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #comment()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String getComment();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the comment of this {@link Cookie}.
|
|
||||||
*
|
|
||||||
* @return The comment of this {@link Cookie}
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String comment();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the comment of this {@link Cookie}.
|
|
||||||
*
|
|
||||||
* @param comment The comment to use
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
void setComment(String comment);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #maxAge()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
long getMaxAge();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the maximum age of this {@link Cookie} in seconds or {@link Long#MIN_VALUE} if unspecified
|
|
||||||
*
|
|
||||||
* @return The maximum age of this {@link Cookie}
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Override
|
|
||||||
long maxAge();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the maximum age of this {@link Cookie} in seconds.
|
|
||||||
* If an age of {@code 0} is specified, this {@link Cookie} will be
|
|
||||||
* automatically removed by browser because it will expire immediately.
|
|
||||||
* If {@link Long#MIN_VALUE} is specified, this {@link Cookie} will be removed when the
|
|
||||||
* browser is closed.
|
|
||||||
*
|
|
||||||
* @param maxAge The maximum age of this {@link Cookie} in seconds
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Override
|
|
||||||
void setMaxAge(long maxAge);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #version()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
int getVersion();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the version of this {@link Cookie}.
|
|
||||||
*
|
|
||||||
* @return The version of this {@link Cookie}
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
int version();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the version of this {@link Cookie}.
|
|
||||||
*
|
|
||||||
* @param version The new version to use
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
void setVersion(int version);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #commentUrl()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String getCommentUrl();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the comment URL of this {@link Cookie}.
|
|
||||||
*
|
|
||||||
* @return The comment URL of this {@link Cookie}
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
String commentUrl();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the comment URL of this {@link Cookie}.
|
|
||||||
*
|
|
||||||
* @param commentUrl The comment URL to use
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
void setCommentUrl(String commentUrl);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks to see if this {@link Cookie} is to be discarded by the browser
|
|
||||||
* at the end of the current session.
|
|
||||||
*
|
|
||||||
* @return True if this {@link Cookie} is to be discarded, otherwise false
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
boolean isDiscard();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the discard flag of this {@link Cookie}.
|
|
||||||
* If set to true, this {@link Cookie} will be discarded by the browser
|
|
||||||
* at the end of the current session
|
|
||||||
*
|
|
||||||
* @param discard True if the {@link Cookie} is to be discarded
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
void setDiscard(boolean discard);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #ports()} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
Set<Integer> getPorts();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the ports that this {@link Cookie} can be accessed on.
|
|
||||||
*
|
|
||||||
* @return The {@link Set} of ports that this {@link Cookie} can use
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
Set<Integer> ports();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the ports that this {@link Cookie} can be accessed on.
|
|
||||||
*
|
|
||||||
* @param ports The ports that this {@link Cookie} can be accessed on
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
void setPorts(int... ports);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the ports that this {@link Cookie} can be accessed on.
|
|
||||||
*
|
|
||||||
* @param ports The {@link Iterable} collection of ports that this
|
|
||||||
* {@link Cookie} can be accessed on.
|
|
||||||
*
|
|
||||||
* @deprecated Not part of RFC6265
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
void setPorts(Iterable<Integer> ports);
|
|
||||||
}
|
|
@ -1,369 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 The Netty Project
|
|
||||||
*
|
|
||||||
* The Netty Project licenses this file to you under the Apache License,
|
|
||||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package io.netty.handler.codec.http;
|
|
||||||
|
|
||||||
import static io.netty.handler.codec.http.CookieUtil.firstInvalidCookieNameOctet;
|
|
||||||
import static io.netty.handler.codec.http.CookieUtil.firstInvalidCookieValueOctet;
|
|
||||||
import static io.netty.handler.codec.http.CookieUtil.unwrapValue;
|
|
||||||
|
|
||||||
import io.netty.handler.codec.DateFormatter;
|
|
||||||
import io.netty.handler.codec.http.cookie.CookieHeaderNames;
|
|
||||||
import io.netty.util.internal.logging.InternalLogger;
|
|
||||||
import io.netty.util.internal.logging.InternalLoggerFactory;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link io.netty.handler.codec.http.cookie.ClientCookieDecoder}
|
|
||||||
* or {@link io.netty.handler.codec.http.cookie.ServerCookieDecoder} instead.
|
|
||||||
*
|
|
||||||
* Decodes an HTTP header value into {@link Cookie}s. This decoder can decode
|
|
||||||
* the HTTP cookie version 0, 1, and 2.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* {@link HttpRequest} req = ...;
|
|
||||||
* String value = req.getHeader("Cookie");
|
|
||||||
* Set<{@link Cookie}> cookies = {@link CookieDecoder}.decode(value);
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @see io.netty.handler.codec.http.cookie.ClientCookieDecoder
|
|
||||||
* @see io.netty.handler.codec.http.cookie.ServerCookieDecoder
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public final class CookieDecoder {
|
|
||||||
|
|
||||||
private final InternalLogger logger = InternalLoggerFactory.getInstance(getClass());
|
|
||||||
|
|
||||||
private static final CookieDecoder STRICT = new CookieDecoder(true);
|
|
||||||
|
|
||||||
private static final CookieDecoder LAX = new CookieDecoder(false);
|
|
||||||
|
|
||||||
private static final String COMMENT = "Comment";
|
|
||||||
|
|
||||||
private static final String COMMENTURL = "CommentURL";
|
|
||||||
|
|
||||||
private static final String DISCARD = "Discard";
|
|
||||||
|
|
||||||
private static final String PORT = "Port";
|
|
||||||
|
|
||||||
private static final String VERSION = "Version";
|
|
||||||
|
|
||||||
private final boolean strict;
|
|
||||||
|
|
||||||
public static Set<Cookie> decode(String header) {
|
|
||||||
return decode(header, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Set<Cookie> decode(String header, boolean strict) {
|
|
||||||
return (strict ? STRICT : LAX).doDecode(header);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decodes the specified HTTP header value into {@link Cookie}s.
|
|
||||||
*
|
|
||||||
* @return the decoded {@link Cookie}s
|
|
||||||
*/
|
|
||||||
private Set<Cookie> doDecode(String header) {
|
|
||||||
List<String> names = new ArrayList<>(8);
|
|
||||||
List<String> values = new ArrayList<>(8);
|
|
||||||
extractKeyValuePairs(header, names, values);
|
|
||||||
|
|
||||||
if (names.isEmpty()) {
|
|
||||||
return Collections.emptySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
int i;
|
|
||||||
int version = 0;
|
|
||||||
|
|
||||||
// $Version is the only attribute that can appear before the actual
|
|
||||||
// cookie name-value pair.
|
|
||||||
if (names.get(0).equalsIgnoreCase(VERSION)) {
|
|
||||||
try {
|
|
||||||
version = Integer.parseInt(values.get(0));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// Ignore.
|
|
||||||
}
|
|
||||||
i = 1;
|
|
||||||
} else {
|
|
||||||
i = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (names.size() <= i) {
|
|
||||||
// There's a version attribute, but nothing more.
|
|
||||||
return Collections.emptySet();
|
|
||||||
}
|
|
||||||
|
|
||||||
Set<Cookie> cookies = new TreeSet<>();
|
|
||||||
for (; i < names.size(); i ++) {
|
|
||||||
String name = names.get(i);
|
|
||||||
String value = values.get(i);
|
|
||||||
if (value == null) {
|
|
||||||
value = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
Cookie c = initCookie(name, value);
|
|
||||||
|
|
||||||
if (c == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean discard = false;
|
|
||||||
boolean secure = false;
|
|
||||||
boolean httpOnly = false;
|
|
||||||
String comment = null;
|
|
||||||
String commentURL = null;
|
|
||||||
String domain = null;
|
|
||||||
String path = null;
|
|
||||||
long maxAge = Long.MIN_VALUE;
|
|
||||||
List<Integer> ports = new ArrayList<>(2);
|
|
||||||
|
|
||||||
for (int j = i + 1; j < names.size(); j++, i++) {
|
|
||||||
name = names.get(j);
|
|
||||||
value = values.get(j);
|
|
||||||
|
|
||||||
if (DISCARD.equalsIgnoreCase(name)) {
|
|
||||||
discard = true;
|
|
||||||
} else if (CookieHeaderNames.SECURE.equalsIgnoreCase(name)) {
|
|
||||||
secure = true;
|
|
||||||
} else if (CookieHeaderNames.HTTPONLY.equalsIgnoreCase(name)) {
|
|
||||||
httpOnly = true;
|
|
||||||
} else if (COMMENT.equalsIgnoreCase(name)) {
|
|
||||||
comment = value;
|
|
||||||
} else if (COMMENTURL.equalsIgnoreCase(name)) {
|
|
||||||
commentURL = value;
|
|
||||||
} else if (CookieHeaderNames.DOMAIN.equalsIgnoreCase(name)) {
|
|
||||||
domain = value;
|
|
||||||
} else if (CookieHeaderNames.PATH.equalsIgnoreCase(name)) {
|
|
||||||
path = value;
|
|
||||||
} else if (CookieHeaderNames.EXPIRES.equalsIgnoreCase(name)) {
|
|
||||||
Date date = DateFormatter.parseHttpDate(value);
|
|
||||||
if (date != null) {
|
|
||||||
long maxAgeMillis = date.getTime() - System.currentTimeMillis();
|
|
||||||
maxAge = maxAgeMillis / 1000 + (maxAgeMillis % 1000 != 0? 1 : 0);
|
|
||||||
}
|
|
||||||
} else if (CookieHeaderNames.MAX_AGE.equalsIgnoreCase(name)) {
|
|
||||||
maxAge = Integer.parseInt(value);
|
|
||||||
} else if (VERSION.equalsIgnoreCase(name)) {
|
|
||||||
version = Integer.parseInt(value);
|
|
||||||
} else if (PORT.equalsIgnoreCase(name)) {
|
|
||||||
String[] portList = value.split(",");
|
|
||||||
for (String s1: portList) {
|
|
||||||
try {
|
|
||||||
ports.add(Integer.valueOf(s1));
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
// Ignore.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
c.setVersion(version);
|
|
||||||
c.setMaxAge(maxAge);
|
|
||||||
c.setPath(path);
|
|
||||||
c.setDomain(domain);
|
|
||||||
c.setSecure(secure);
|
|
||||||
c.setHttpOnly(httpOnly);
|
|
||||||
if (version > 0) {
|
|
||||||
c.setComment(comment);
|
|
||||||
}
|
|
||||||
if (version > 1) {
|
|
||||||
c.setCommentUrl(commentURL);
|
|
||||||
c.setPorts(ports);
|
|
||||||
c.setDiscard(discard);
|
|
||||||
}
|
|
||||||
|
|
||||||
cookies.add(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
return cookies;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void extractKeyValuePairs(
|
|
||||||
final String header, final List<String> names, final List<String> values) {
|
|
||||||
final int headerLen = header.length();
|
|
||||||
loop: for (int i = 0;;) {
|
|
||||||
|
|
||||||
// Skip spaces and separators.
|
|
||||||
for (;;) {
|
|
||||||
if (i == headerLen) {
|
|
||||||
break loop;
|
|
||||||
}
|
|
||||||
switch (header.charAt(i)) {
|
|
||||||
case '\t': case '\n': case 0x0b: case '\f': case '\r':
|
|
||||||
case ' ': case ',': case ';':
|
|
||||||
i ++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip '$'.
|
|
||||||
for (;;) {
|
|
||||||
if (i == headerLen) {
|
|
||||||
break loop;
|
|
||||||
}
|
|
||||||
if (header.charAt(i) == '$') {
|
|
||||||
i ++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
String name;
|
|
||||||
String value;
|
|
||||||
|
|
||||||
if (i == headerLen) {
|
|
||||||
name = null;
|
|
||||||
value = null;
|
|
||||||
} else {
|
|
||||||
int newNameStart = i;
|
|
||||||
keyValLoop: for (;;) {
|
|
||||||
switch (header.charAt(i)) {
|
|
||||||
case ';':
|
|
||||||
// NAME; (no value till ';')
|
|
||||||
name = header.substring(newNameStart, i);
|
|
||||||
value = null;
|
|
||||||
break keyValLoop;
|
|
||||||
case '=':
|
|
||||||
// NAME=VALUE
|
|
||||||
name = header.substring(newNameStart, i);
|
|
||||||
i ++;
|
|
||||||
if (i == headerLen) {
|
|
||||||
// NAME= (empty value, i.e. nothing after '=')
|
|
||||||
value = "";
|
|
||||||
break keyValLoop;
|
|
||||||
}
|
|
||||||
|
|
||||||
int newValueStart = i;
|
|
||||||
char c = header.charAt(i);
|
|
||||||
if (c == '"' || c == '\'') {
|
|
||||||
// NAME="VALUE" or NAME='VALUE'
|
|
||||||
StringBuilder newValueBuf = new StringBuilder(header.length() - i);
|
|
||||||
final char q = c;
|
|
||||||
boolean hadBackslash = false;
|
|
||||||
i ++;
|
|
||||||
for (;;) {
|
|
||||||
if (i == headerLen) {
|
|
||||||
value = newValueBuf.toString();
|
|
||||||
break keyValLoop;
|
|
||||||
}
|
|
||||||
if (hadBackslash) {
|
|
||||||
hadBackslash = false;
|
|
||||||
c = header.charAt(i ++);
|
|
||||||
switch (c) {
|
|
||||||
case '\\': case '"': case '\'':
|
|
||||||
// Escape last backslash.
|
|
||||||
newValueBuf.setCharAt(newValueBuf.length() - 1, c);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// Do not escape last backslash.
|
|
||||||
newValueBuf.append(c);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
c = header.charAt(i ++);
|
|
||||||
if (c == q) {
|
|
||||||
value = newValueBuf.toString();
|
|
||||||
break keyValLoop;
|
|
||||||
}
|
|
||||||
newValueBuf.append(c);
|
|
||||||
if (c == '\\') {
|
|
||||||
hadBackslash = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// NAME=VALUE;
|
|
||||||
int semiPos = header.indexOf(';', i);
|
|
||||||
if (semiPos > 0) {
|
|
||||||
value = header.substring(newValueStart, semiPos);
|
|
||||||
i = semiPos;
|
|
||||||
} else {
|
|
||||||
value = header.substring(newValueStart);
|
|
||||||
i = headerLen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break keyValLoop;
|
|
||||||
default:
|
|
||||||
i ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == headerLen) {
|
|
||||||
// NAME (no value till the end of string)
|
|
||||||
name = header.substring(newNameStart);
|
|
||||||
value = null;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
names.add(name);
|
|
||||||
values.add(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private CookieDecoder(boolean strict) {
|
|
||||||
this.strict = strict;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DefaultCookie initCookie(String name, String value) {
|
|
||||||
if (name == null || name.length() == 0) {
|
|
||||||
logger.debug("Skipping cookie with null name");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value == null) {
|
|
||||||
logger.debug("Skipping cookie with null value");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
CharSequence unwrappedValue = unwrapValue(value);
|
|
||||||
if (unwrappedValue == null) {
|
|
||||||
logger.debug("Skipping cookie because starting quotes are not properly balanced in '{}'",
|
|
||||||
unwrappedValue);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
int invalidOctetPos;
|
|
||||||
if (strict && (invalidOctetPos = firstInvalidCookieNameOctet(name)) >= 0) {
|
|
||||||
if (logger.isDebugEnabled()) {
|
|
||||||
logger.debug("Skipping cookie because name '{}' contains invalid char '{}'",
|
|
||||||
name, name.charAt(invalidOctetPos));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final boolean wrap = unwrappedValue.length() != value.length();
|
|
||||||
|
|
||||||
if (strict && (invalidOctetPos = firstInvalidCookieValueOctet(unwrappedValue)) >= 0) {
|
|
||||||
if (logger.isDebugEnabled()) {
|
|
||||||
logger.debug("Skipping cookie because value '{}' contains invalid char '{}'",
|
|
||||||
unwrappedValue, unwrappedValue.charAt(invalidOctetPos));
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
DefaultCookie cookie = new DefaultCookie(name, unwrappedValue.toString());
|
|
||||||
cookie.setWrap(wrap);
|
|
||||||
return cookie;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,104 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 The Netty Project
|
|
||||||
*
|
|
||||||
* The Netty Project licenses this file to you under the Apache License,
|
|
||||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package io.netty.handler.codec.http;
|
|
||||||
|
|
||||||
import java.util.BitSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Duplicate of package private ${@link io.netty.handler.codec.http.cookie.CookieUtil}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
final class CookieUtil {
|
|
||||||
|
|
||||||
private static final BitSet VALID_COOKIE_VALUE_OCTETS = validCookieValueOctets();
|
|
||||||
|
|
||||||
private static final BitSet VALID_COOKIE_NAME_OCTETS = validCookieNameOctets(VALID_COOKIE_VALUE_OCTETS);
|
|
||||||
|
|
||||||
// US-ASCII characters excluding CTLs, whitespace, DQUOTE, comma, semicolon, and backslash
|
|
||||||
private static BitSet validCookieValueOctets() {
|
|
||||||
BitSet bits = new BitSet(8);
|
|
||||||
for (int i = 35; i < 127; i++) {
|
|
||||||
// US-ASCII characters excluding CTLs (%x00-1F / %x7F)
|
|
||||||
bits.set(i);
|
|
||||||
}
|
|
||||||
bits.set('"', false); // exclude DQUOTE = %x22
|
|
||||||
bits.set(',', false); // exclude comma = %x2C
|
|
||||||
bits.set(';', false); // exclude semicolon = %x3B
|
|
||||||
bits.set('\\', false); // exclude backslash = %x5C
|
|
||||||
return bits;
|
|
||||||
}
|
|
||||||
|
|
||||||
// token = 1*<any CHAR except CTLs or separators>
|
|
||||||
// separators = "(" | ")" | "<" | ">" | "@"
|
|
||||||
// | "," | ";" | ":" | "\" | <">
|
|
||||||
// | "/" | "[" | "]" | "?" | "="
|
|
||||||
// | "{" | "}" | SP | HT
|
|
||||||
private static BitSet validCookieNameOctets(BitSet validCookieValueOctets) {
|
|
||||||
BitSet bits = new BitSet(8);
|
|
||||||
bits.or(validCookieValueOctets);
|
|
||||||
bits.set('(', false);
|
|
||||||
bits.set(')', false);
|
|
||||||
bits.set('<', false);
|
|
||||||
bits.set('>', false);
|
|
||||||
bits.set('@', false);
|
|
||||||
bits.set(':', false);
|
|
||||||
bits.set('/', false);
|
|
||||||
bits.set('[', false);
|
|
||||||
bits.set(']', false);
|
|
||||||
bits.set('?', false);
|
|
||||||
bits.set('=', false);
|
|
||||||
bits.set('{', false);
|
|
||||||
bits.set('}', false);
|
|
||||||
bits.set(' ', false);
|
|
||||||
bits.set('\t', false);
|
|
||||||
return bits;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int firstInvalidCookieNameOctet(CharSequence cs) {
|
|
||||||
return firstInvalidOctet(cs, VALID_COOKIE_NAME_OCTETS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int firstInvalidCookieValueOctet(CharSequence cs) {
|
|
||||||
return firstInvalidOctet(cs, VALID_COOKIE_VALUE_OCTETS);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int firstInvalidOctet(CharSequence cs, BitSet bits) {
|
|
||||||
for (int i = 0; i < cs.length(); i++) {
|
|
||||||
char c = cs.charAt(i);
|
|
||||||
if (!bits.get(c)) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static CharSequence unwrapValue(CharSequence cs) {
|
|
||||||
final int len = cs.length();
|
|
||||||
if (len > 0 && cs.charAt(0) == '"') {
|
|
||||||
if (len >= 2 && cs.charAt(len - 1) == '"') {
|
|
||||||
// properly balanced
|
|
||||||
return len == 2 ? "" : cs.subSequence(1, len - 1);
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cs;
|
|
||||||
}
|
|
||||||
|
|
||||||
private CookieUtil() {
|
|
||||||
// Unused
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,195 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 The Netty Project
|
|
||||||
*
|
|
||||||
* The Netty Project licenses this file to you under the Apache License,
|
|
||||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package io.netty.handler.codec.http;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The default {@link Cookie} implementation.
|
|
||||||
*
|
|
||||||
* @deprecated Use {@link io.netty.handler.codec.http.cookie.DefaultCookie} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public class DefaultCookie extends io.netty.handler.codec.http.cookie.DefaultCookie implements Cookie {
|
|
||||||
|
|
||||||
private String comment;
|
|
||||||
private String commentUrl;
|
|
||||||
private boolean discard;
|
|
||||||
private Set<Integer> ports = Collections.emptySet();
|
|
||||||
private Set<Integer> unmodifiablePorts = ports;
|
|
||||||
private int version;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new cookie with the specified name and value.
|
|
||||||
*/
|
|
||||||
public DefaultCookie(String name, String value) {
|
|
||||||
super(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String getName() {
|
|
||||||
return name();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String getValue() {
|
|
||||||
return value();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String getDomain() {
|
|
||||||
return domain();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String getPath() {
|
|
||||||
return path();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String getComment() {
|
|
||||||
return comment();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String comment() {
|
|
||||||
return comment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public void setComment(String comment) {
|
|
||||||
this.comment = validateValue("comment", comment);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String getCommentUrl() {
|
|
||||||
return commentUrl();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public String commentUrl() {
|
|
||||||
return commentUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public void setCommentUrl(String commentUrl) {
|
|
||||||
this.commentUrl = validateValue("commentUrl", commentUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public boolean isDiscard() {
|
|
||||||
return discard;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public void setDiscard(boolean discard) {
|
|
||||||
this.discard = discard;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public Set<Integer> getPorts() {
|
|
||||||
return ports();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public Set<Integer> ports() {
|
|
||||||
if (unmodifiablePorts == null) {
|
|
||||||
unmodifiablePorts = Collections.unmodifiableSet(ports);
|
|
||||||
}
|
|
||||||
return unmodifiablePorts;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public void setPorts(int... ports) {
|
|
||||||
if (ports == null) {
|
|
||||||
throw new NullPointerException("ports");
|
|
||||||
}
|
|
||||||
|
|
||||||
int[] portsCopy = ports.clone();
|
|
||||||
if (portsCopy.length == 0) {
|
|
||||||
unmodifiablePorts = this.ports = Collections.emptySet();
|
|
||||||
} else {
|
|
||||||
Set<Integer> newPorts = new TreeSet<>();
|
|
||||||
for (int p: portsCopy) {
|
|
||||||
if (p <= 0 || p > 65535) {
|
|
||||||
throw new IllegalArgumentException("port out of range: " + p);
|
|
||||||
}
|
|
||||||
newPorts.add(Integer.valueOf(p));
|
|
||||||
}
|
|
||||||
this.ports = newPorts;
|
|
||||||
unmodifiablePorts = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public void setPorts(Iterable<Integer> ports) {
|
|
||||||
Set<Integer> newPorts = new TreeSet<>();
|
|
||||||
for (int p: ports) {
|
|
||||||
if (p <= 0 || p > 65535) {
|
|
||||||
throw new IllegalArgumentException("port out of range: " + p);
|
|
||||||
}
|
|
||||||
newPorts.add(Integer.valueOf(p));
|
|
||||||
}
|
|
||||||
if (newPorts.isEmpty()) {
|
|
||||||
unmodifiablePorts = this.ports = Collections.emptySet();
|
|
||||||
} else {
|
|
||||||
this.ports = newPorts;
|
|
||||||
unmodifiablePorts = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public long getMaxAge() {
|
|
||||||
return maxAge();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public int getVersion() {
|
|
||||||
return version();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public int version() {
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated
|
|
||||||
public void setVersion(int version) {
|
|
||||||
this.version = version;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2014 The Netty Project
|
|
||||||
*
|
|
||||||
* The Netty Project licenses this file to you under the Apache License,
|
|
||||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
||||||
* with the License. You may obtain a copy of the License at:
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
* License for the specific language governing permissions and limitations
|
|
||||||
* under the License.
|
|
||||||
*/
|
|
||||||
package io.netty.handler.codec.http;
|
|
||||||
|
|
||||||
import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A <a href="http://tools.ietf.org/html/rfc6265">RFC6265</a> compliant cookie encoder to be used server side,
|
|
||||||
* so some fields are sent (Version is typically ignored).
|
|
||||||
*
|
|
||||||
* As Netty's Cookie merges Expires and MaxAge into one single field, only Max-Age field is sent.
|
|
||||||
*
|
|
||||||
* Note that multiple cookies must be sent as separate "Set-Cookie" headers.
|
|
||||||
*
|
|
||||||
* <pre>
|
|
||||||
* // Example
|
|
||||||
* {@link HttpResponse} res = ...;
|
|
||||||
* res.setHeader("Set-Cookie", {@link ServerCookieEncoder}.encode("JSESSIONID", "1234"));
|
|
||||||
* </pre>
|
|
||||||
*
|
|
||||||
* @see ServerCookieDecoder
|
|
||||||
*
|
|
||||||
* @deprecated Use {@link io.netty.handler.codec.http.cookie.ServerCookieEncoder} instead
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public final class ServerCookieEncoder {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the specified cookie name-value pair into a Set-Cookie header value.
|
|
||||||
*
|
|
||||||
* @param name the cookie name
|
|
||||||
* @param value the cookie value
|
|
||||||
* @return a single Set-Cookie header value
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String encode(String name, String value) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ServerCookieEncoder.LAX.encode(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encodes the specified cookie into a Set-Cookie header value.
|
|
||||||
*
|
|
||||||
* @param cookie the cookie
|
|
||||||
* @return a single Set-Cookie header value
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static String encode(Cookie cookie) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ServerCookieEncoder.LAX.encode(cookie);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Batch encodes cookies into Set-Cookie header values.
|
|
||||||
*
|
|
||||||
* @param cookies a bunch of cookies
|
|
||||||
* @return the corresponding bunch of Set-Cookie headers
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static List<String> encode(Cookie... cookies) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ServerCookieEncoder.LAX.encode(cookies);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Batch encodes cookies into Set-Cookie header values.
|
|
||||||
*
|
|
||||||
* @param cookies a bunch of cookies
|
|
||||||
* @return the corresponding bunch of Set-Cookie headers
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static List<String> encode(Collection<Cookie> cookies) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ServerCookieEncoder.LAX.encode(cookies);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Batch encodes cookies into Set-Cookie header values.
|
|
||||||
*
|
|
||||||
* @param cookies a bunch of cookies
|
|
||||||
* @return the corresponding bunch of Set-Cookie headers
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static List<String> encode(Iterable<Cookie> cookies) {
|
|
||||||
return io.netty.handler.codec.http.cookie.ServerCookieEncoder.LAX.encode(cookies);
|
|
||||||
}
|
|
||||||
|
|
||||||
private ServerCookieEncoder() {
|
|
||||||
// Unused
|
|
||||||
}
|
|
||||||
}
|
|
@ -194,19 +194,6 @@ public class DefaultCookie implements Cookie {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Validate a cookie attribute value, throws a {@link IllegalArgumentException} otherwise.
|
|
||||||
* Only intended to be used by {@link io.netty.handler.codec.http.DefaultCookie}.
|
|
||||||
* @param name attribute name
|
|
||||||
* @param value attribute value
|
|
||||||
* @return the trimmed, validated attribute value
|
|
||||||
* @deprecated CookieUtil is package private, will be removed once old Cookie API is dropped
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
protected String validateValue(String name, String value) {
|
|
||||||
return validateAttributeValue(name, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuilder buf = stringBuilder()
|
StringBuilder buf = stringBuilder()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user