4875a2aad4
Motivation: The `AsciiString#toString` method calculate string value and cache it into field. If an `AsciiString` created from the `String` value, we can avoid rebuilding strings if we cache them immediately when creating `AsciiString`. It would be useful for constants strings, which already stored in the JVMs string table, or in cases where an unavoidable `#toString `method call is assumed. Modifications: - Add new static method `AsciiString#cache(String)` which save string value into cache field. - Apply a "benign" data race in the `#hashCode` and `#toString` methods. Result: Less memory usage in some `AsciiString` use cases.
122 lines
3.3 KiB
Java
122 lines
3.3 KiB
Java
/*
|
|
* 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.util.AsciiString;
|
|
|
|
/**
|
|
* The class of HTTP status.
|
|
*/
|
|
public enum HttpStatusClass {
|
|
/**
|
|
* The informational class (1xx)
|
|
*/
|
|
INFORMATIONAL(100, 200, "Informational"),
|
|
/**
|
|
* The success class (2xx)
|
|
*/
|
|
SUCCESS(200, 300, "Success"),
|
|
/**
|
|
* The redirection class (3xx)
|
|
*/
|
|
REDIRECTION(300, 400, "Redirection"),
|
|
/**
|
|
* The client error class (4xx)
|
|
*/
|
|
CLIENT_ERROR(400, 500, "Client Error"),
|
|
/**
|
|
* The server error class (5xx)
|
|
*/
|
|
SERVER_ERROR(500, 600, "Server Error"),
|
|
/**
|
|
* The unknown class
|
|
*/
|
|
UNKNOWN(0, 0, "Unknown Status") {
|
|
@Override
|
|
public boolean contains(int code) {
|
|
return code < 100 || code >= 600;
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Returns the class of the specified HTTP status code.
|
|
*/
|
|
public static HttpStatusClass valueOf(int code) {
|
|
if (INFORMATIONAL.contains(code)) {
|
|
return INFORMATIONAL;
|
|
}
|
|
if (SUCCESS.contains(code)) {
|
|
return SUCCESS;
|
|
}
|
|
if (REDIRECTION.contains(code)) {
|
|
return REDIRECTION;
|
|
}
|
|
if (CLIENT_ERROR.contains(code)) {
|
|
return CLIENT_ERROR;
|
|
}
|
|
if (SERVER_ERROR.contains(code)) {
|
|
return SERVER_ERROR;
|
|
}
|
|
return UNKNOWN;
|
|
}
|
|
|
|
/**
|
|
* Returns the class of the specified HTTP status code.
|
|
* @param code Just the numeric portion of the http status code.
|
|
*/
|
|
public static HttpStatusClass valueOf(CharSequence code) {
|
|
if (code != null && code.length() == 3) {
|
|
char c0 = code.charAt(0);
|
|
return isDigit(c0) && isDigit(code.charAt(1)) && isDigit(code.charAt(2)) ? valueOf(digit(c0) * 100)
|
|
: UNKNOWN;
|
|
}
|
|
return UNKNOWN;
|
|
}
|
|
|
|
private static int digit(char c) {
|
|
return c - '0';
|
|
}
|
|
|
|
private static boolean isDigit(char c) {
|
|
return c >= '0' && c <= '9';
|
|
}
|
|
|
|
private final int min;
|
|
private final int max;
|
|
private final AsciiString defaultReasonPhrase;
|
|
|
|
HttpStatusClass(int min, int max, String defaultReasonPhrase) {
|
|
this.min = min;
|
|
this.max = max;
|
|
this.defaultReasonPhrase = AsciiString.cached(defaultReasonPhrase);
|
|
}
|
|
|
|
/**
|
|
* Returns {@code true} if and only if the specified HTTP status code falls into this class.
|
|
*/
|
|
public boolean contains(int code) {
|
|
return code >= min && code < max;
|
|
}
|
|
|
|
/**
|
|
* Returns the default reason phrase of this HTTP status class.
|
|
*/
|
|
AsciiString defaultReasonPhrase() {
|
|
return defaultReasonPhrase;
|
|
}
|
|
}
|