Index: module-main/src/test/java/org/apache/http/TestHttpStatus.java =================================================================== --- module-main/src/test/java/org/apache/http/TestHttpStatus.java (revision 503279) +++ module-main/src/test/java/org/apache/http/TestHttpStatus.java (working copy) @@ -34,6 +34,9 @@ import junit.framework.*; import java.lang.reflect.*; +import org.apache.http.impl.EnglishReasonPhraseCatalog; + + /** * * Unit tests for {@link HttpStatus} @@ -81,8 +84,8 @@ && Modifier.isStatic(modifiers) ) { final int iValue = f.getInt(null); - final String text = HttpStatus.getStatusText(iValue); - + final String text = EnglishReasonPhraseCatalog. + INSTANCE.getReason(iValue, null); assertTrue( "text is null for HttpStatus." + f.getName(), (text != null) ); @@ -92,17 +95,27 @@ } - public void testStatusTextNegative() throws Exception { + public void testStatusInvalid() throws Exception { try { - HttpStatus.getStatusText(-1); - fail("IllegalArgumentException must have been thrown"); + EnglishReasonPhraseCatalog.INSTANCE.getReason(-1, null); + fail("IllegalArgumentException must have been thrown (-1)"); } catch (IllegalArgumentException expected) { } + try { + EnglishReasonPhraseCatalog.INSTANCE.getReason(99, null); + fail("IllegalArgumentException must have been thrown (99)"); + } catch (IllegalArgumentException expected) { + } + try { + EnglishReasonPhraseCatalog.INSTANCE.getReason(600, null); + fail("IllegalArgumentException must have been thrown (600)"); + } catch (IllegalArgumentException expected) { + } } - public void testStatusTextAll() throws Exception { - for (int i = 0; i < 600; i++) { - HttpStatus.getStatusText(i); + public void testStatusAll() throws Exception { + for (int i = 100; i < 600; i++) { + EnglishReasonPhraseCatalog.INSTANCE.getReason(i, null); } } } Index: module-main/src/main/java/org/apache/http/message/BasicStatusLine.java =================================================================== --- module-main/src/main/java/org/apache/http/message/BasicStatusLine.java (revision 503279) +++ module-main/src/main/java/org/apache/http/message/BasicStatusLine.java (working copy) @@ -37,7 +37,9 @@ import org.apache.http.StatusLine; import org.apache.http.protocol.HTTP; import org.apache.http.util.CharArrayBuffer; +import org.apache.http.impl.EnglishReasonPhraseCatalog; + /** * Represents a Status-Line as returned from a HTTP server. * @@ -78,7 +80,7 @@ // ----------------------------------------------------------- Constructors /** - * Default constructor + * Creates a new status line with the given version, status, and reason. */ public BasicStatusLine(final HttpVersion httpVersion, int statusCode, final String reasonPhrase) { super(); @@ -93,8 +95,13 @@ this.reasonPhrase = reasonPhrase; } + /** + * Creates a new status line with the given version and status. + */ public BasicStatusLine(final HttpVersion httpVersion, int statusCode) { - this(httpVersion, statusCode, HttpStatus.getStatusText(statusCode)); + this(httpVersion, statusCode, + //@@@ TODO: reason null instead of English? + EnglishReasonPhraseCatalog.INSTANCE.getReason(statusCode, null)); } /** Index: module-main/src/main/java/org/apache/http/impl/EnglishReasonPhraseCatalog.java =================================================================== --- module-main/src/main/java/org/apache/http/impl/EnglishReasonPhraseCatalog.java (revision 503279) +++ module-main/src/main/java/org/apache/http/impl/EnglishReasonPhraseCatalog.java (working copy) @@ -29,284 +29,204 @@ * */ -package org.apache.http; +package org.apache.http.impl; +import org.apache.http.HttpStatus; +import org.apache.http.ReasonPhraseCatalog; +import org.apache.http.protocol.HttpContext; + + /** - * Constants enumerating the HTTP status codes. + * English reason phrases for HTTP status codes. * All status codes defined in RFC1945 (HTTP/1.0), RFC2616 (HTTP/1.1), and * RFC2518 (WebDAV) are supported. * - * @see StatusLine * @author Unascribed * @author Mike Bowler * @author Jeff Dever * - * TODO: Internationalization of reason phrases - * - * @version $Id$ + * @version $Revision$ */ -public class HttpStatus { +public class EnglishReasonPhraseCatalog + implements ReasonPhraseCatalog { + // static array with english reason phrases defined below - // -------------------------------------------------------- Class Variables + /** + * The default instance of this catalog. + * This catalog is thread safe, so there typically + * is no need to create other instances. + */ + public final static EnglishReasonPhraseCatalog INSTANCE = + new EnglishReasonPhraseCatalog(); - /** Reason phrases lookup table. */ - private static final String[][] REASON_PHRASES = new String[][]{ - new String[0], - new String[3], - new String[8], - new String[8], - new String[25], - new String[8] - }; - - // --------------------------------------------------------- Public Methods - /** - * Get the reason phrase for a particular status code. - * - * This method always returns the English text as specified in the - * relevent RFCs and is not internationalized. - * - * @param statusCode the numeric status code - * @return the reason phrase associated with the given status code - * or null if the status code is not recognized. - * - * TODO: getStatusText should be called getReasonPhrase to match RFC + * Restricted default constructor, for derived classes. + * If you need an instance of this class, use {@link #INSTANCE INSTANCE}. */ - public static String getStatusText(int statusCode) { - - if (statusCode < 0) { - throw new IllegalArgumentException("status code may not be negative"); - } - int classIndex = statusCode / 100; - int codeIndex = statusCode - classIndex * 100; - if (classIndex < 1 || classIndex > (REASON_PHRASES.length - 1) - || codeIndex < 0 || codeIndex > (REASON_PHRASES[classIndex].length - 1)) { - return null; - } - return REASON_PHRASES[classIndex][codeIndex]; + protected EnglishReasonPhraseCatalog() { + // no body } - // -------------------------------------------------------- Private Methods - /** - * Store the given reason phrase, by status code. - * @param statusCode The status code to lookup - * @param reasonPhrase The reason phrase for this status code + * Obtains the reason phrase for a status code. + * + * @param status the status code, in the range 100-599 + * @param context ignored + * + * @return the reason phrase, or null */ - private static void addStatusCodeMap(int statusCode, String reasonPhrase) { - int classIndex = statusCode / 100; - REASON_PHRASES[classIndex][statusCode - classIndex * 100] = reasonPhrase; - } + public String getReason(int status, HttpContext context) { + if ((status < 100) || (status >= 600)) { + throw new IllegalArgumentException + ("Unknown category for status code " + status + "."); + } + final int category = status / 100; + final int subcode = status - 100*category; - // -------------------------------------------------------------- Constants + String reason = null; + if (REASON_PHRASES[category].length > subcode) + reason = REASON_PHRASES[category][subcode]; - // --- 1xx Informational --- + return reason; + } - /** 100 Continue (HTTP/1.1 - RFC 2616) */ - public static final int SC_CONTINUE = 100; - /** 101 Switching Protocols (HTTP/1.1 - RFC 2616)*/ - public static final int SC_SWITCHING_PROTOCOLS = 101; - /** 102 Processing (WebDAV - RFC 2518) */ - public static final int SC_PROCESSING = 102; - // --- 2xx Success --- + /** Reason phrases lookup table. */ + private static final String[][] REASON_PHRASES = new String[][]{ + null, + new String[3], // 1xx + new String[8], // 2xx + new String[8], // 3xx + new String[25], // 4xx + new String[8] // 5xx + }; - /** 200 OK (HTTP/1.0 - RFC 1945) */ - public static final int SC_OK = 200; - /** 201 Created (HTTP/1.0 - RFC 1945) */ - public static final int SC_CREATED = 201; - /** 202 Accepted (HTTP/1.0 - RFC 1945) */ - public static final int SC_ACCEPTED = 202; - /** 203 Non Authoritative Information (HTTP/1.1 - RFC 2616) */ - public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203; - /** 204 No Content (HTTP/1.0 - RFC 1945) */ - public static final int SC_NO_CONTENT = 204; - /** 205 Reset Content (HTTP/1.1 - RFC 2616) */ - public static final int SC_RESET_CONTENT = 205; - /** 206 Partial Content (HTTP/1.1 - RFC 2616) */ - public static final int SC_PARTIAL_CONTENT = 206; - /** - * 207 Multi-Status (WebDAV - RFC 2518) or 207 Partial Update - * OK (HTTP/1.1 - draft-ietf-http-v11-spec-rev-01?) - */ - public static final int SC_MULTI_STATUS = 207; - // --- 3xx Redirection --- - /** 300 Mutliple Choices (HTTP/1.1 - RFC 2616) */ - public static final int SC_MULTIPLE_CHOICES = 300; - /** 301 Moved Permanently (HTTP/1.0 - RFC 1945) */ - public static final int SC_MOVED_PERMANENTLY = 301; - /** 302 Moved Temporarily (Sometimes Found) (HTTP/1.0 - RFC 1945) */ - public static final int SC_MOVED_TEMPORARILY = 302; - /** 303 See Other (HTTP/1.1 - RFC 2616) */ - public static final int SC_SEE_OTHER = 303; - /** 304 Not Modified (HTTP/1.0 - RFC 1945) */ - public static final int SC_NOT_MODIFIED = 304; - /** 305 Use Proxy (HTTP/1.1 - RFC 2616) */ - public static final int SC_USE_PROXY = 305; - /** 307 Temporary Redirect (HTTP/1.1 - RFC 2616) */ - public static final int SC_TEMPORARY_REDIRECT = 307; - - // --- 4xx Client Error --- - - /** 400 Bad Request (HTTP/1.1 - RFC 2616) */ - public static final int SC_BAD_REQUEST = 400; - /** 401 Unauthorized (HTTP/1.0 - RFC 1945) */ - public static final int SC_UNAUTHORIZED = 401; - /** 402 Payment Required (HTTP/1.1 - RFC 2616) */ - public static final int SC_PAYMENT_REQUIRED = 402; - /** 403 Forbidden (HTTP/1.0 - RFC 1945) */ - public static final int SC_FORBIDDEN = 403; - /** 404 Not Found (HTTP/1.0 - RFC 1945) */ - public static final int SC_NOT_FOUND = 404; - /** 405 Method Not Allowed (HTTP/1.1 - RFC 2616) */ - public static final int SC_METHOD_NOT_ALLOWED = 405; - /** 406 Not Acceptable (HTTP/1.1 - RFC 2616) */ - public static final int SC_NOT_ACCEPTABLE = 406; - /** 407 Proxy Authentication Required (HTTP/1.1 - RFC 2616)*/ - public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407; - /** 408 Request Timeout (HTTP/1.1 - RFC 2616) */ - public static final int SC_REQUEST_TIMEOUT = 408; - /** 409 Conflict (HTTP/1.1 - RFC 2616) */ - public static final int SC_CONFLICT = 409; - /** 410 Gone (HTTP/1.1 - RFC 2616) */ - public static final int SC_GONE = 410; - /** 411 Length Required (HTTP/1.1 - RFC 2616) */ - public static final int SC_LENGTH_REQUIRED = 411; - /** 412 Precondition Failed (HTTP/1.1 - RFC 2616) */ - public static final int SC_PRECONDITION_FAILED = 412; - /** 413 Request Entity Too Large (HTTP/1.1 - RFC 2616) */ - public static final int SC_REQUEST_TOO_LONG = 413; - /** 414 Request-URI Too Long (HTTP/1.1 - RFC 2616) */ - public static final int SC_REQUEST_URI_TOO_LONG = 414; - /** 415 Unsupported Media Type (HTTP/1.1 - RFC 2616) */ - public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415; - /** 416 Requested Range Not Satisfiable (HTTP/1.1 - RFC 2616) */ - public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416; - /** 417 Expectation Failed (HTTP/1.1 - RFC 2616) */ - public static final int SC_EXPECTATION_FAILED = 417; - /** - * Static constant for a 418 error. - * 418 Unprocessable Entity (WebDAV drafts?) - * or 418 Reauthentication Required (HTTP/1.1 drafts?) + * Stores the given reason phrase, by status code. + * Helper method to initialize the static lookup table. + * + * @param status the status code for which to define the phrase + * @param reason the reason phrase for this status code */ - // not used - // public static final int SC_UNPROCESSABLE_ENTITY = 418; + private static void setReason(int status, String reason) { + final int category = status / 100; + final int subcode = status - 100*category; + REASON_PHRASES[category][subcode] = reason; + } - /** - * Static constant for a 419 error. - * 419 Insufficient Space on Resource - * (WebDAV - draft-ietf-webdav-protocol-05?) - * or 419 Proxy Reauthentication Required - * (HTTP/1.1 drafts?) - */ - public static final int SC_INSUFFICIENT_SPACE_ON_RESOURCE = 419; - /** - * Static constant for a 420 error. - * 420 Method Failure - * (WebDAV - draft-ietf-webdav-protocol-05?) - */ - public static final int SC_METHOD_FAILURE = 420; - /** 422 Unprocessable Entity (WebDAV - RFC 2518) */ - public static final int SC_UNPROCESSABLE_ENTITY = 422; - /** 423 Locked (WebDAV - RFC 2518) */ - public static final int SC_LOCKED = 423; - /** 424 Failed Dependency (WebDAV - RFC 2518) */ - public static final int SC_FAILED_DEPENDENCY = 424; - // --- 5xx Server Error --- - - /** 500 Server Error (HTTP/1.0 - RFC 1945) */ - public static final int SC_INTERNAL_SERVER_ERROR = 500; - /** 501 Not Implemented (HTTP/1.0 - RFC 1945) */ - public static final int SC_NOT_IMPLEMENTED = 501; - /** 502 Bad Gateway (HTTP/1.0 - RFC 1945) */ - public static final int SC_BAD_GATEWAY = 502; - /** 503 Service Unavailable (HTTP/1.0 - RFC 1945) */ - public static final int SC_SERVICE_UNAVAILABLE = 503; - /** 504 Gateway Timeout (HTTP/1.1 - RFC 2616) */ - public static final int SC_GATEWAY_TIMEOUT = 504; - /** 505 HTTP Version Not Supported (HTTP/1.1 - RFC 2616) */ - public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505; - - /** 507 Insufficient Storage (WebDAV - RFC 2518) */ - public static final int SC_INSUFFICIENT_STORAGE = 507; - - // ----------------------------------------------------- Static Initializer /** Set up status code to "reason phrase" map. */ static { // HTTP 1.0 Server status codes -- see RFC 1945 - addStatusCodeMap(SC_OK, "OK"); - addStatusCodeMap(SC_CREATED, "Created"); - addStatusCodeMap(SC_ACCEPTED, "Accepted"); - addStatusCodeMap(SC_NO_CONTENT, "No Content"); - addStatusCodeMap(SC_MOVED_PERMANENTLY, "Moved Permanently"); - addStatusCodeMap(SC_MOVED_TEMPORARILY, "Moved Temporarily"); - addStatusCodeMap(SC_NOT_MODIFIED, "Not Modified"); - addStatusCodeMap(SC_BAD_REQUEST, "Bad Request"); - addStatusCodeMap(SC_UNAUTHORIZED, "Unauthorized"); - addStatusCodeMap(SC_FORBIDDEN, "Forbidden"); - addStatusCodeMap(SC_NOT_FOUND, "Not Found"); - addStatusCodeMap(SC_INTERNAL_SERVER_ERROR, "Internal Server Error"); - addStatusCodeMap(SC_NOT_IMPLEMENTED, "Not Implemented"); - addStatusCodeMap(SC_BAD_GATEWAY, "Bad Gateway"); - addStatusCodeMap(SC_SERVICE_UNAVAILABLE, "Service Unavailable"); + setReason(HttpStatus.SC_OK, + "OK"); + setReason(HttpStatus.SC_CREATED, + "Created"); + setReason(HttpStatus.SC_ACCEPTED, + "Accepted"); + setReason(HttpStatus.SC_NO_CONTENT, + "No Content"); + setReason(HttpStatus.SC_MOVED_PERMANENTLY, + "Moved Permanently"); + setReason(HttpStatus.SC_MOVED_TEMPORARILY, + "Moved Temporarily"); + setReason(HttpStatus.SC_NOT_MODIFIED, + "Not Modified"); + setReason(HttpStatus.SC_BAD_REQUEST, + "Bad Request"); + setReason(HttpStatus.SC_UNAUTHORIZED, + "Unauthorized"); + setReason(HttpStatus.SC_FORBIDDEN, + "Forbidden"); + setReason(HttpStatus.SC_NOT_FOUND, + "Not Found"); + setReason(HttpStatus.SC_INTERNAL_SERVER_ERROR, + "Internal Server Error"); + setReason(HttpStatus.SC_NOT_IMPLEMENTED, + "Not Implemented"); + setReason(HttpStatus.SC_BAD_GATEWAY, + "Bad Gateway"); + setReason(HttpStatus.SC_SERVICE_UNAVAILABLE, + "Service Unavailable"); // HTTP 1.1 Server status codes -- see RFC 2048 - addStatusCodeMap(SC_CONTINUE, "Continue"); - addStatusCodeMap(SC_TEMPORARY_REDIRECT, "Temporary Redirect"); - addStatusCodeMap(SC_METHOD_NOT_ALLOWED, "Method Not Allowed"); - addStatusCodeMap(SC_CONFLICT, "Conflict"); - addStatusCodeMap(SC_PRECONDITION_FAILED, "Precondition Failed"); - addStatusCodeMap(SC_REQUEST_TOO_LONG, "Request Too Long"); - addStatusCodeMap(SC_REQUEST_URI_TOO_LONG, "Request-URI Too Long"); - addStatusCodeMap(SC_UNSUPPORTED_MEDIA_TYPE, "Unsupported Media Type"); - addStatusCodeMap(SC_MULTIPLE_CHOICES, "Multiple Choices"); - addStatusCodeMap(SC_SEE_OTHER, "See Other"); - addStatusCodeMap(SC_USE_PROXY, "Use Proxy"); - addStatusCodeMap(SC_PAYMENT_REQUIRED, "Payment Required"); - addStatusCodeMap(SC_NOT_ACCEPTABLE, "Not Acceptable"); - addStatusCodeMap(SC_PROXY_AUTHENTICATION_REQUIRED, - "Proxy Authentication Required"); - addStatusCodeMap(SC_REQUEST_TIMEOUT, - "Request Timeout"); + setReason(HttpStatus.SC_CONTINUE, + "Continue"); + setReason(HttpStatus.SC_TEMPORARY_REDIRECT, + "Temporary Redirect"); + setReason(HttpStatus.SC_METHOD_NOT_ALLOWED, + "Method Not Allowed"); + setReason(HttpStatus.SC_CONFLICT, + "Conflict"); + setReason(HttpStatus.SC_PRECONDITION_FAILED, + "Precondition Failed"); + setReason(HttpStatus.SC_REQUEST_TOO_LONG, + "Request Too Long"); + setReason(HttpStatus.SC_REQUEST_URI_TOO_LONG, + "Request-URI Too Long"); + setReason(HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE, + "Unsupported Media Type"); + setReason(HttpStatus.SC_MULTIPLE_CHOICES, + "Multiple Choices"); + setReason(HttpStatus.SC_SEE_OTHER, + "See Other"); + setReason(HttpStatus.SC_USE_PROXY, + "Use Proxy"); + setReason(HttpStatus.SC_PAYMENT_REQUIRED, + "Payment Required"); + setReason(HttpStatus.SC_NOT_ACCEPTABLE, + "Not Acceptable"); + setReason(HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED, + "Proxy Authentication Required"); + setReason(HttpStatus.SC_REQUEST_TIMEOUT, + "Request Timeout"); - addStatusCodeMap(SC_SWITCHING_PROTOCOLS, "Switching Protocols"); - addStatusCodeMap(SC_NON_AUTHORITATIVE_INFORMATION, - "Non Authoritative Information"); - addStatusCodeMap(SC_RESET_CONTENT, "Reset Content"); - addStatusCodeMap(SC_PARTIAL_CONTENT, "Partial Content"); - addStatusCodeMap(SC_GATEWAY_TIMEOUT, "Gateway Timeout"); - addStatusCodeMap(SC_HTTP_VERSION_NOT_SUPPORTED, - "Http Version Not Supported"); - addStatusCodeMap(SC_GONE, - "Gone"); - addStatusCodeMap(SC_LENGTH_REQUIRED, - "Length Required"); - addStatusCodeMap(SC_REQUESTED_RANGE_NOT_SATISFIABLE, - "Requested Range Not Satisfiable"); - addStatusCodeMap(SC_EXPECTATION_FAILED, - "Expectation Failed"); + setReason(HttpStatus.SC_SWITCHING_PROTOCOLS, + "Switching Protocols"); + setReason(HttpStatus.SC_NON_AUTHORITATIVE_INFORMATION, + "Non Authoritative Information"); + setReason(HttpStatus.SC_RESET_CONTENT, + "Reset Content"); + setReason(HttpStatus.SC_PARTIAL_CONTENT, + "Partial Content"); + setReason(HttpStatus.SC_GATEWAY_TIMEOUT, + "Gateway Timeout"); + setReason(HttpStatus.SC_HTTP_VERSION_NOT_SUPPORTED, + "Http Version Not Supported"); + setReason(HttpStatus.SC_GONE, + "Gone"); + setReason(HttpStatus.SC_LENGTH_REQUIRED, + "Length Required"); + setReason(HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE, + "Requested Range Not Satisfiable"); + setReason(HttpStatus.SC_EXPECTATION_FAILED, + "Expectation Failed"); // WebDAV Server-specific status codes - addStatusCodeMap(SC_PROCESSING, "Processing"); - addStatusCodeMap(SC_MULTI_STATUS, "Multi-Status"); - addStatusCodeMap(SC_UNPROCESSABLE_ENTITY, "Unprocessable Entity"); - addStatusCodeMap(SC_INSUFFICIENT_SPACE_ON_RESOURCE, - "Insufficient Space On Resource"); - addStatusCodeMap(SC_METHOD_FAILURE, "Method Failure"); - addStatusCodeMap(SC_LOCKED, "Locked"); - addStatusCodeMap(SC_INSUFFICIENT_STORAGE , "Insufficient Storage"); - addStatusCodeMap(SC_FAILED_DEPENDENCY, "Failed Dependency"); + setReason(HttpStatus.SC_PROCESSING, + "Processing"); + setReason(HttpStatus.SC_MULTI_STATUS, + "Multi-Status"); + setReason(HttpStatus.SC_UNPROCESSABLE_ENTITY, + "Unprocessable Entity"); + setReason(HttpStatus.SC_INSUFFICIENT_SPACE_ON_RESOURCE, + "Insufficient Space On Resource"); + setReason(HttpStatus.SC_METHOD_FAILURE, + "Method Failure"); + setReason(HttpStatus.SC_LOCKED, + "Locked"); + setReason(HttpStatus.SC_INSUFFICIENT_STORAGE, + "Insufficient Storage"); + setReason(HttpStatus.SC_FAILED_DEPENDENCY, + "Failed Dependency"); } Index: module-main/src/main/java/org/apache/http/impl/DefaultHttpResponseFactory.java =================================================================== --- module-main/src/main/java/org/apache/http/impl/DefaultHttpResponseFactory.java (revision 503279) +++ module-main/src/main/java/org/apache/http/impl/DefaultHttpResponseFactory.java (working copy) @@ -38,6 +38,8 @@ import org.apache.http.StatusLine; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; +import org.apache.http.ReasonPhraseCatalog; +import org.apache.http.impl.EnglishReasonPhraseCatalog; /** * Default implementation of a factory for creating response objects. @@ -49,19 +51,48 @@ * @since 4.0 */ public class DefaultHttpResponseFactory implements HttpResponseFactory { - + + /** The catalog for looking up reason phrases. */ + protected final ReasonPhraseCatalog reasonCatalog; + + + /** + * Creates a new response factory with the given catalog. + * + * @param catalog the catalog of reason phrases + */ + public DefaultHttpResponseFactory(ReasonPhraseCatalog catalog) { + if (catalog == null) { + throw new IllegalArgumentException + ("Reason phrase catalog must not be null."); + } + this.reasonCatalog = catalog; + } + + /** + * Creates a new response factory with the default catalog. + * The default catalog is + * {@link EnglishReasonPhraseCatalog EnglishReasonPhraseCatalog}. + */ public DefaultHttpResponseFactory() { - super(); + this(EnglishReasonPhraseCatalog.INSTANCE); } - public HttpResponse newHttpResponse(final HttpVersion ver, final int status) { + + // non-javadoc, see interface HttpResponseFactory + public HttpResponse newHttpResponse(final HttpVersion ver, + final int status) { if (ver == null) { throw new IllegalArgumentException("HTTP version may not be null"); } - StatusLine statusline = new BasicStatusLine(ver, status, HttpStatus.getStatusText(status)); + //@@@ TODO: how to get to the context? + final String reason = reasonCatalog.getReason(status, null); + StatusLine statusline = new BasicStatusLine(ver, status, reason); return new BasicHttpResponse(statusline); } - + + + // non-javadoc, see interface HttpResponseFactory public HttpResponse newHttpResponse(final StatusLine statusline) { if (statusline == null) { throw new IllegalArgumentException("Status line may not be null"); Index: module-main/src/main/java/org/apache/http/HttpStatus.java =================================================================== --- module-main/src/main/java/org/apache/http/HttpStatus.java (revision 503279) +++ module-main/src/main/java/org/apache/http/HttpStatus.java (working copy) @@ -34,77 +34,17 @@ /** * Constants enumerating the HTTP status codes. * All status codes defined in RFC1945 (HTTP/1.0), RFC2616 (HTTP/1.1), and - * RFC2518 (WebDAV) are supported. + * RFC2518 (WebDAV) are listed. * * @see StatusLine * @author Unascribed * @author Mike Bowler * @author Jeff Dever * - * TODO: Internationalization of reason phrases - * - * @version $Id$ + * @version $Revision$ */ public class HttpStatus { - - // -------------------------------------------------------- Class Variables - - /** Reason phrases lookup table. */ - private static final String[][] REASON_PHRASES = new String[][]{ - new String[0], - new String[3], - new String[8], - new String[8], - new String[25], - new String[8] - }; - - - // --------------------------------------------------------- Public Methods - - /** - * Get the reason phrase for a particular status code. - * - * This method always returns the English text as specified in the - * relevent RFCs and is not internationalized. - * - * @param statusCode the numeric status code - * @return the reason phrase associated with the given status code - * or null if the status code is not recognized. - * - * TODO: getStatusText should be called getReasonPhrase to match RFC - */ - public static String getStatusText(int statusCode) { - - if (statusCode < 0) { - throw new IllegalArgumentException("status code may not be negative"); - } - int classIndex = statusCode / 100; - int codeIndex = statusCode - classIndex * 100; - if (classIndex < 1 || classIndex > (REASON_PHRASES.length - 1) - || codeIndex < 0 || codeIndex > (REASON_PHRASES[classIndex].length - 1)) { - return null; - } - return REASON_PHRASES[classIndex][codeIndex]; - } - - - // -------------------------------------------------------- Private Methods - - /** - * Store the given reason phrase, by status code. - * @param statusCode The status code to lookup - * @param reasonPhrase The reason phrase for this status code - */ - private static void addStatusCodeMap(int statusCode, String reasonPhrase) { - int classIndex = statusCode / 100; - REASON_PHRASES[classIndex][statusCode - classIndex * 100] = reasonPhrase; - } - - - // -------------------------------------------------------------- Constants - // --- 1xx Informational --- /** 100 Continue (HTTP/1.1 - RFC 2616) */ @@ -239,75 +179,4 @@ /** 507 Insufficient Storage (WebDAV - RFC 2518) */ public static final int SC_INSUFFICIENT_STORAGE = 507; - - // ----------------------------------------------------- Static Initializer - - /** Set up status code to "reason phrase" map. */ - static { - // HTTP 1.0 Server status codes -- see RFC 1945 - addStatusCodeMap(SC_OK, "OK"); - addStatusCodeMap(SC_CREATED, "Created"); - addStatusCodeMap(SC_ACCEPTED, "Accepted"); - addStatusCodeMap(SC_NO_CONTENT, "No Content"); - addStatusCodeMap(SC_MOVED_PERMANENTLY, "Moved Permanently"); - addStatusCodeMap(SC_MOVED_TEMPORARILY, "Moved Temporarily"); - addStatusCodeMap(SC_NOT_MODIFIED, "Not Modified"); - addStatusCodeMap(SC_BAD_REQUEST, "Bad Request"); - addStatusCodeMap(SC_UNAUTHORIZED, "Unauthorized"); - addStatusCodeMap(SC_FORBIDDEN, "Forbidden"); - addStatusCodeMap(SC_NOT_FOUND, "Not Found"); - addStatusCodeMap(SC_INTERNAL_SERVER_ERROR, "Internal Server Error"); - addStatusCodeMap(SC_NOT_IMPLEMENTED, "Not Implemented"); - addStatusCodeMap(SC_BAD_GATEWAY, "Bad Gateway"); - addStatusCodeMap(SC_SERVICE_UNAVAILABLE, "Service Unavailable"); - - // HTTP 1.1 Server status codes -- see RFC 2048 - addStatusCodeMap(SC_CONTINUE, "Continue"); - addStatusCodeMap(SC_TEMPORARY_REDIRECT, "Temporary Redirect"); - addStatusCodeMap(SC_METHOD_NOT_ALLOWED, "Method Not Allowed"); - addStatusCodeMap(SC_CONFLICT, "Conflict"); - addStatusCodeMap(SC_PRECONDITION_FAILED, "Precondition Failed"); - addStatusCodeMap(SC_REQUEST_TOO_LONG, "Request Too Long"); - addStatusCodeMap(SC_REQUEST_URI_TOO_LONG, "Request-URI Too Long"); - addStatusCodeMap(SC_UNSUPPORTED_MEDIA_TYPE, "Unsupported Media Type"); - addStatusCodeMap(SC_MULTIPLE_CHOICES, "Multiple Choices"); - addStatusCodeMap(SC_SEE_OTHER, "See Other"); - addStatusCodeMap(SC_USE_PROXY, "Use Proxy"); - addStatusCodeMap(SC_PAYMENT_REQUIRED, "Payment Required"); - addStatusCodeMap(SC_NOT_ACCEPTABLE, "Not Acceptable"); - addStatusCodeMap(SC_PROXY_AUTHENTICATION_REQUIRED, - "Proxy Authentication Required"); - addStatusCodeMap(SC_REQUEST_TIMEOUT, - "Request Timeout"); - - addStatusCodeMap(SC_SWITCHING_PROTOCOLS, "Switching Protocols"); - addStatusCodeMap(SC_NON_AUTHORITATIVE_INFORMATION, - "Non Authoritative Information"); - addStatusCodeMap(SC_RESET_CONTENT, "Reset Content"); - addStatusCodeMap(SC_PARTIAL_CONTENT, "Partial Content"); - addStatusCodeMap(SC_GATEWAY_TIMEOUT, "Gateway Timeout"); - addStatusCodeMap(SC_HTTP_VERSION_NOT_SUPPORTED, - "Http Version Not Supported"); - addStatusCodeMap(SC_GONE, - "Gone"); - addStatusCodeMap(SC_LENGTH_REQUIRED, - "Length Required"); - addStatusCodeMap(SC_REQUESTED_RANGE_NOT_SATISFIABLE, - "Requested Range Not Satisfiable"); - addStatusCodeMap(SC_EXPECTATION_FAILED, - "Expectation Failed"); - - // WebDAV Server-specific status codes - addStatusCodeMap(SC_PROCESSING, "Processing"); - addStatusCodeMap(SC_MULTI_STATUS, "Multi-Status"); - addStatusCodeMap(SC_UNPROCESSABLE_ENTITY, "Unprocessable Entity"); - addStatusCodeMap(SC_INSUFFICIENT_SPACE_ON_RESOURCE, - "Insufficient Space On Resource"); - addStatusCodeMap(SC_METHOD_FAILURE, "Method Failure"); - addStatusCodeMap(SC_LOCKED, "Locked"); - addStatusCodeMap(SC_INSUFFICIENT_STORAGE , "Insufficient Storage"); - addStatusCodeMap(SC_FAILED_DEPENDENCY, "Failed Dependency"); - } - - } Index: module-main/src/main/java/org/apache/http/ReasonPhraseCatalog.java =================================================================== --- module-main/src/main/java/org/apache/http/ReasonPhraseCatalog.java (revision 0) +++ module-main/src/main/java/org/apache/http/ReasonPhraseCatalog.java (revision 0) @@ -0,0 +1,63 @@ +/* + * $HeadURL$ + * $Revision$ + * $Date$ + * + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.http; + +import org.apache.http.protocol.HttpContext; + +/** + * Interface for obtaining reason phrases for HTTP status codes. + * + * @author Roland Weber + * + * + * + * @version $Revision$ + * + * @since 4.0 + */ +public interface ReasonPhraseCatalog { + + /** + * Obtains the reason phrase for a status code. + * The optional context allows for catalogs that detect + * the language for the reason phrase. + * + * @param status the status code, in the range 100-599 + * @param context the context for the response being generated, or + * null if not available + * + * @return the reason phrase, or null if unknown + */ + public String getReason(int status, HttpContext context) + ; + +} Property changes on: module-main/src/main/java/org/apache/http/ReasonPhraseCatalog.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Date Author Id Revision HeadURL Name: svn:eol-style + native