Fix HTML encoding of ampersand.
[Sone.git] / src / main / java / net / pterodactylus / sone / web / page / Page.java
index a1125cc..297081e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * shortener - Page.java - Copyright © 2010 David Roden
+ * Sone - Page.java - Copyright © 2010 David Roden
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,21 +30,21 @@ import freenet.support.api.HTTPRequest;
 /**
  * A page is responsible for handling HTTP requests and creating appropriate
  * responses.
- * 
+ *
  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
  */
 public interface Page {
 
        /**
         * Returns the path of this toadlet.
-        * 
+        *
         * @return The path of this toadlet
         */
        public String getPath();
 
        /**
         * Handles a request.
-        * 
+        *
         * @param request
         *            The request to handle
         * @return The response
@@ -53,16 +53,47 @@ public interface Page {
 
        /**
         * Container for request data.
-        * 
+        *
         * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
         */
        public class Request {
 
+               /**
+                * Enumeration for all possible HTTP request methods.
+                *
+                * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’
+                *         Roden</a>
+                */
+               public enum Method {
+
+                       /** GET. */
+                       GET,
+
+                       /** POST. */
+                       POST,
+
+                       /** PUT. */
+                       PUT,
+
+                       /** DELETE. */
+                       DELETE,
+
+                       /** HEAD. */
+                       HEAD,
+
+                       /** OPTIONS. */
+                       OPTIONS,
+
+                       /** TRACE. */
+                       TRACE,
+
+               }
+
                /** The URI that was accessed. */
                private final URI uri;
 
                /** The HTTP method that was used. */
-               private final String method;
+               private final Method method;
 
                /** The HTTP request. */
                private final HTTPRequest httpRequest;
@@ -72,7 +103,7 @@ public interface Page {
 
                /**
                 * Creates a new request that holds the given data.
-                * 
+                *
                 * @param uri
                 *            The URI of the request
                 * @param method
@@ -82,7 +113,7 @@ public interface Page {
                 * @param toadletContext
                 *            The toadlet context of the request
                 */
-               public Request(URI uri, String method, HTTPRequest httpRequest, ToadletContext toadletContext) {
+               public Request(URI uri, Method method, HTTPRequest httpRequest, ToadletContext toadletContext) {
                        this.uri = uri;
                        this.method = method;
                        this.httpRequest = httpRequest;
@@ -91,25 +122,25 @@ public interface Page {
 
                /**
                 * Returns the URI that was accessed.
-                * 
+                *
                 * @return The accessed URI
                 */
-               public URI getURI() {
+               public URI getUri() {
                        return uri;
                }
 
                /**
                 * Returns the HTTP method that was used to access the page.
-                * 
+                *
                 * @return The HTTP method
                 */
-               public String getMethod() {
+               public Method getMethod() {
                        return method;
                }
 
                /**
                 * Returns the HTTP request.
-                * 
+                *
                 * @return The HTTP request
                 */
                public HTTPRequest getHttpRequest() {
@@ -118,7 +149,7 @@ public interface Page {
 
                /**
                 * Returns the toadlet context.
-                * 
+                *
                 * @return The toadlet context
                 */
                public ToadletContext getToadletContext() {
@@ -129,7 +160,7 @@ public interface Page {
 
        /**
         * Container for the HTTP response of a {@link Page}.
-        * 
+        *
         * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
         */
        public class Response {
@@ -151,7 +182,7 @@ public interface Page {
 
                /**
                 * Creates a new response.
-                * 
+                *
                 * @param statusCode
                 *            The HTTP status code of the response
                 * @param statusText
@@ -167,7 +198,7 @@ public interface Page {
 
                /**
                 * Creates a new response.
-                * 
+                *
                 * @param statusCode
                 *            The HTTP status code of the response
                 * @param statusText
@@ -178,12 +209,12 @@ public interface Page {
                 *            The content of the reponse body
                 */
                public Response(int statusCode, String statusText, String contentType, byte[] content) {
-                       this(statusCode, statusText, contentType, null, content);
+                       this(statusCode, statusText, contentType, new HashMap<String, String>(), content);
                }
 
                /**
                 * Creates a new response.
-                * 
+                *
                 * @param statusCode
                 *            The HTTP status code of the response
                 * @param statusText
@@ -199,7 +230,7 @@ public interface Page {
 
                /**
                 * Creates a new response.
-                * 
+                *
                 * @param statusCode
                 *            The HTTP status code of the response
                 * @param statusText
@@ -217,7 +248,7 @@ public interface Page {
 
                /**
                 * Creates a new response.
-                * 
+                *
                 * @param statusCode
                 *            The HTTP status code of the response
                 * @param statusText
@@ -239,7 +270,7 @@ public interface Page {
 
                /**
                 * Returns the HTTP status code of the response.
-                * 
+                *
                 * @return The HTTP status code
                 */
                public int getStatusCode() {
@@ -248,7 +279,7 @@ public interface Page {
 
                /**
                 * Returns the HTTP status text.
-                * 
+                *
                 * @return The HTTP status text
                 */
                public String getStatusText() {
@@ -257,7 +288,7 @@ public interface Page {
 
                /**
                 * Returns the content type of the response.
-                * 
+                *
                 * @return The content type of the reponse
                 */
                public String getContentType() {
@@ -267,7 +298,7 @@ public interface Page {
                /**
                 * Returns HTTP headers of the response. May be {@code null} if no
                 * headers are returned.
-                * 
+                *
                 * @return The response headers, or {@code null} if there are no
                 *         response headers
                 */
@@ -276,9 +307,24 @@ public interface Page {
                }
 
                /**
+                * Sets the HTTP header with the given name to the given value. Multiple
+                * headers with the same name are not implemented so that latest call to
+                * {@link #setHeader(String, String)} determines what is sent to the
+                * browser.
+                *
+                * @param name
+                *            The name of the header
+                * @param value
+                *            The value of the header
+                */
+               public void setHeader(String name, String value) {
+                       headers.put(name, value);
+               }
+
+               /**
                 * Returns the content of the response body. May be {@code null} if the
                 * response does not have a body.
-                * 
+                *
                 * @return The content of the response body
                 */
                public InputStream getContent() {
@@ -291,7 +337,7 @@ public interface Page {
 
                /**
                 * Returns the UTF-8 representation of the given text.
-                * 
+                *
                 * @param text
                 *            The text to encode
                 * @return The encoded text
@@ -307,7 +353,7 @@ public interface Page {
 
                /**
                 * Creates a header map containing a single header.
-                * 
+                *
                 * @param name
                 *            The name of the header
                 * @param value
@@ -324,14 +370,14 @@ public interface Page {
 
        /**
         * {@link Response} implementation that performs an HTTP redirect.
-        * 
+        *
         * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
         */
        public class RedirectResponse extends Response {
 
                /**
                 * Creates a new redirect response to the new location.
-                * 
+                *
                 * @param newLocation
                 *            The new location
                 */
@@ -341,7 +387,7 @@ public interface Page {
 
                /**
                 * Creates a new redirect response to the new location.
-                * 
+                *
                 * @param newLocation
                 *            The new location
                 * @param permanent