287 lines
15 KiB
Markdown
287 lines
15 KiB
Markdown
# HttpStatus JSP Tag Library
|
|
|
|
[](http://opensource.org/licenses/BSD-3-Clause)
|
|
[](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html)
|
|
[](https://github.com/ethauvin/httpstatus/releases/latest)
|
|
[](https://search.maven.org/search?q=g:%22net.thauvin.erik.httpstatus%22%20AND%20a:%22httpstatus%22)
|
|

|
|
[](https://snyk.io/test/github/ethauvin/httpstatus?targetFile=pom.xml)
|
|
[](https://sonarcloud.io/summary/new_code?id=ethauvin_HttpStatus)
|
|
[](https://github.com/ethauvin/httpstatus/actions/workflows/bld.yml)
|
|
[](https://circleci.com/gh/ethauvin/HttpStatus/tree/master)
|
|
|
|
|
|
A simple [JSP](http://www.oracle.com/technetwork/java/javaee/jsp/index.html) Tag Library to display the [code](#hscode), [reason](#hsreason), [cause](#hscode) and/or [message](#hsmessage) for [HTTP status codes](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) in JSP error pages.
|
|
|
|
For example:
|
|
|
|
```jsp
|
|
<%@ page isErrorPage="true" %>
|
|
<%@ taglib prefix="hs" uri="http://erik.thauvin.net/taglibs/httpstatus" %>
|
|
<html><head>
|
|
<title><hs:code/> <hs:reason default="Server Error"/></title>
|
|
</head>
|
|
<h1><hs:reason default="Server Error"/></h1>
|
|
Cause: <pre><hs:cause default="Unable to complete your request."/></pre>
|
|
Message: <pre><hs:message default="A server error has occured."/></pre>
|
|
...
|
|
```
|
|
|
|
or
|
|
|
|
```jsp
|
|
<%@ page isErrorPage="true" import="net.thauvin.erik.httpstatus.Reasons" %>
|
|
<%= Reasons.getReasonPhrase(pageContext.getErrorData().getStatusCode()) %>
|
|
```
|
|
|
|
would display on a [501 status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.2):
|
|
|
|
Not Implemented
|
|
|
|
## Usage with [Gradle](https://gradle.org/) or [Maven](http://maven.apache.org/)
|
|
Include the following in your `build.gradle` file:
|
|
|
|
```gradle
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
dependencies {
|
|
implementation 'net.thauvin.erik.httpstatus:httpstatus:1.0.5'
|
|
}
|
|
```
|
|
|
|
or as a Maven artifact:
|
|
|
|
```xml
|
|
<dependency>
|
|
<groupId>net.thauvin.erik.httpstatus</groupId>
|
|
<artifactId>httpstatus</artifactId>
|
|
<version>1.0.5</version>
|
|
</dependency>
|
|
```
|
|
|
|
## hs:cause
|
|
|
|
The `<hs:cause/>` tag displays the cause of current HTTP status code, if any. A shorthand for:
|
|
|
|
```jsp
|
|
<%= pageContext.getErrorData().getThrowable().getCause().getLocalizedMessage() %>
|
|
```
|
|
|
|
Optional attributes are:
|
|
|
|
| Attribute | Description |
|
|
|-------------|----------------------------------------------------------------------------------------------------------|
|
|
| `default` | The fallback value to output, if no cause is |
|
|
| `escapeXml` | Converts <, >, &, ', " to their corresponding [entity codes](http://dev.w3.org/html5/html-author/charref). Value is `true` by default. |
|
|
|
|
## hs:code
|
|
The `<hs:code/>` tag displays the current HTTP status code, if any. A shorthand for:
|
|
|
|
```jsp
|
|
<%= pageContext.getErrorData().getStatusCode() %>
|
|
```
|
|
|
|
## hs:message
|
|
|
|
The `<hs:message/>` tag displays the current error message, if any. A shorthand for:
|
|
|
|
```jsp
|
|
<%= request.getAttribute("javax.servlet.error.message") %>
|
|
```
|
|
|
|
Optional attributes are:
|
|
|
|
| Attribute | Description |
|
|
|-------------|----------------------------------------------------------------------------------------------------------|
|
|
| `default` | The fallback value to output, if no error message is available. |
|
|
| `escapeXml` | Converts <, >, &, ', " to their corresponding [entity codes](http://dev.w3.org/html5/html-author/charref). Value is `true` by default. |
|
|
|
|
## hs:reason
|
|
|
|
The `<hs:reason/>` tag displays the reason for a HTTP status code, if any. Optional attributes are:
|
|
|
|
| Attribute | Description |
|
|
|-------------|----------------------------------------------------------------------------------------------------------|
|
|
| `default` | The fallback value to output, if no reason is available. |
|
|
| `code` | The HTTP status error code. If not specified the current status code is used. |
|
|
| `escapeXml` | Converts <, >, &, ', " to their corresponding [entity codes](http://dev.w3.org/html5/html-author/charref). Value is `true` by default. |
|
|
|
|
## StatusCode Bean
|
|
|
|
The `StatusCode` bean can be used to check the class of the status code error. For example, using the JSTL:
|
|
|
|
```jsp
|
|
<%@ taglib prefix="hs" uri="http://erik.thauvin.net/taglibs/httpstatus" %>
|
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
|
|
|
<jsp:useBean id="statusCode" class="net.thauvin.erik.httpstatus.StatusCode"/>
|
|
<c:set target="${statusCode}" property="code"><hs:code/></c:set>
|
|
<c:choose>
|
|
<c:when test="${statusCode.isClientError()}">
|
|
An error occurred on your side. (<hs:reason/>)
|
|
</c:when>
|
|
<c:otherwise>
|
|
An error occurred on our side. (<hs:message/>)
|
|
</c:otherwise>
|
|
</c:choose>
|
|
```
|
|
|
|
or in a Servlet:
|
|
|
|
```java
|
|
import net.thauvin.erik.httpstatus.StatusCode;
|
|
|
|
// ---
|
|
|
|
StatusCode statusCode = new StatusCode((Integer) request.getAttribute("javax.servlet.error.status_code"));
|
|
if (statusCode.isError()) {
|
|
if (statusCode.isServerError()) {
|
|
String reason = statusCode.getReason();
|
|
} else {
|
|
// ...
|
|
}
|
|
}
|
|
```
|
|
|
|
The `StatusCode` bean methods are:
|
|
|
|
| Method | Description |
|
|
|-----------------|----------------------------------------------------------------------|
|
|
| `getReason` | Returns the reason for the status code (eg: `Internal Server Error`) |
|
|
| `isClientError` | Checks if the status code is a client error. |
|
|
| `isError` | Checks if the status code is a server or client error. |
|
|
| `isInfo` | Checks if the status code is informational. |
|
|
| `isRedirect` | Checks if the status code is a redirect. |
|
|
| `isServerError` | Checks if the status code is a server error. |
|
|
| `isSuccess` | Checks if the status code is a success. (`OK`) |
|
|
| `isValid` | Checks if the status code is valid. |
|
|
|
|
## Reasons
|
|
|
|
The reasons are defined in a [ResourceBundle](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ResourceBundle.html) properties as follows:
|
|
|
|
| Status Code | Reason |
|
|
|-------------|------------------------------------------------------------|
|
|
| `100` | Continue |
|
|
| `101` | Switching Protocols |
|
|
| `102` | Processing |
|
|
| `103` | Early Hints |
|
|
| `200` | OK |
|
|
| `201` | Created |
|
|
| `202` | Accepted |
|
|
| `203` | Non-Authoritative Information |
|
|
| `204` | No Content |
|
|
| `205` | Reset Content |
|
|
| `206` | Partial Content |
|
|
| `207` | Multi-Status |
|
|
| `208` | Already Reported |
|
|
| `218` | This is fine |
|
|
| `226` | IM Used |
|
|
| `300` | Multiple Choices |
|
|
| `301` | Moved Permanently |
|
|
| `302` | Found/Moved Temporarily |
|
|
| `303` | See Other |
|
|
| `304` | Not Modified |
|
|
| `305` | Use Proxy |
|
|
| `306` | Switch Proxy |
|
|
| `307` | Temporary Redirect |
|
|
| `308` | Permanent Redirect |
|
|
| `400` | Bad Request |
|
|
| `401` | Unauthorized |
|
|
| `402` | Payment Required |
|
|
| `403` | Forbidden |
|
|
| `404` | Not Found |
|
|
| `405` | Method Not Allowed |
|
|
| `406` | Not Acceptable |
|
|
| `407` | Proxy Authentication Required |
|
|
| `408` | Request Timeout |
|
|
| `409` | Conflict |
|
|
| `410` | Gone |
|
|
| `411` | Length Required |
|
|
| `412` | Precondition Failed |
|
|
| `413` | Request Entity/Payload Too Large |
|
|
| `414` | Request-URI Too Long |
|
|
| `415` | Unsupported Media Type |
|
|
| `416` | Requested Range Not Satisfiable |
|
|
| `417` | Expectation Failed |
|
|
| `418` | I'm A Teapot |
|
|
| `419` | Insufficient Space on Resource |
|
|
| `420` | Method Failure |
|
|
| `421` | Misdirected Request |
|
|
| `422` | Unprocessable Entity |
|
|
| `423` | Locked |
|
|
| `424` | Failed Dependency |
|
|
| `426` | Upgrade Required |
|
|
| `428` | Precondition Required |
|
|
| `429` | Too Many Requests |
|
|
| `430` | Request Header Fields Too Large |
|
|
| `431` | Request Header Fields Too Large |
|
|
| `440` | Login Timeout |
|
|
| `444` | No Response |
|
|
| `449` | Retry With |
|
|
| `450` | Blocked by Windows Parental Controls |
|
|
| `451` | Unavailable For Legal Reasons |
|
|
| `460` | Client Closed Connection Before Load Balancer Idle Timeout |
|
|
| `463` | X-Forwarded-For Header with More than 30 IP Addresses |
|
|
| `494` | Request Header Too Large |
|
|
| `495` | SSL Certificate Error |
|
|
| `496` | No SSL Certificate |
|
|
| `497` | HTTP Request Sent to HTTPS Port |
|
|
| `498` | Token Expired/Invalid |
|
|
| `499` | Client Closed Request |
|
|
| `500` | Internal Server Error |
|
|
| `501` | Not Implemented |
|
|
| `502` | Bad Gateway |
|
|
| `503` | Service Unavailable |
|
|
| `504` | Gateway Timeout |
|
|
| `505` | HTTP Version Not Supported |
|
|
| `506` | Variant Also Negotiates |
|
|
| `507` | Insufficient Storage |
|
|
| `508` | Loop Detected |
|
|
| `509` | Bandwidth Limit Exceeded |
|
|
| `510` | Not Extended |
|
|
| `511` | Network Authentication Required |
|
|
| `520` | Unknown Error |
|
|
| `521` | Web Server Is Down |
|
|
| `522` | Origin Connection Time-out |
|
|
| `523` | Origin Is Unreachable |
|
|
| `524` | A Timeout Occurred |
|
|
| `525` | SSL Handshake Failed |
|
|
| `526` | Invalid SSL Certificate |
|
|
| `527` | Railgun Error |
|
|
| `529` | Site is overloaded |
|
|
| `530` | Site is frozen |
|
|
| `598` | Network Read Timeout Error |
|
|
| `599` | Network Connect Timeout Error |
|
|
|
|
## Command Line Usage
|
|
You can query the reason phrase for status codes as follows:
|
|
|
|
```sh
|
|
$ java -jar httpstatus-1.1.0.jar 404 500
|
|
404: Not Found
|
|
500: Internal Server Error
|
|
```
|
|
|
|
If no status code is specified, all will be printed:
|
|
|
|
```sh
|
|
$ java -jar httpstatus-1.1.0.jar
|
|
100: Continue
|
|
101: Switching Protocols
|
|
102: Processing
|
|
103: Early Hints
|
|
200: OK
|
|
201: Created
|
|
202: Accepted
|
|
203: Non-Authoritative Information
|
|
204: No Content
|
|
205: Reset Content
|
|
206: Partial Content
|
|
207: Multi-Status
|
|
208: Already Reported
|
|
226: IM Used
|
|
...
|
|
```
|