/** * Copyright (c) 2006 Parity Communications, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Sergey Yakovlev - initial API and implementation */ package org.eclipse.ecf.internal.provider.rss.http; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.util.Date; /** * A HTTP response message * */ public class HttpResponse extends HttpMessage { // status codes: // informational public static final int CONTINUE = 100; public static final int SWITCH_PROTOCOLS = 101; // success public static final int OK = 200; public static final int CREATED = 201; public static final int ACCEPTED = 202; public static final int NON_AUTHORATIVE = 203; public static final int NO_CONTENT = 204; public static final int RESET_CONTENT = 205; public static final int PARTIAL_CONTENT = 206; // redirection public static final int MULTIPLE_CHOICES = 300; public static final int MOVED_PERMANENTLY = 301; public static final int MOVED_TEMPORARILY = 302; public static final int SEE_OTHER = 303; public static final int NOT_MODIFIED = 304; public static final int USE_PROXY = 305; // client error public static final int BAD_REQUEST = 400; public static final int UNAUTHORIZED = 401; public static final int PAYMENT_REQUIRED = 402; public static final int FORBIDDEN = 403; public static final int NOT_FOUND = 404; public static final int METHOD_NOT_ALLOWD = 405; public static final int NOT_ACCEPTABLE = 406; public static final int PROXY_AUTHENTICATION_REQUIRED = 407; public static final int REQUEST_TIMEOUT = 408; public static final int CONFLICT = 409; public static final int GONE = 410; public static final int LENGTH_REQUIRED = 411; public static final int PRECONDITION_FAILED = 412; public static final int REQUEST_TOO_LARGE = 413; public static final int URI_TOO_LARGE = 414; public static final int UNSUPPORTED_MEDIA = 415; // server error public static final int SERVER_ERROR = 500; public static final int NOT_IMPLEMENTED = 501; public static final int BAD_GATEWAY = 502; public static final int UNAVAILABLE = 503; public static final int GATEWAY_TIMEOUT = 504; public static final int VERSION_NOT_SUPPORTED = 505; private String version; private int code; private String reason; /** Creates a new instance of HttpResponse * @param version * @param code * @param reason */ public HttpResponse(String version, int code, String reason) { this.version = version; this.code = code; this.reason = reason; setDateHeader("Date", new Date()); } /** * use default version HTTP/1.1 * @param code * @param body */ public HttpResponse(int code, String body) { this(DEFAULT_VERSION, code, type2String(code)); this.setBody(body.getBytes()); } /** * response ok (200) with string as body default version * @param body */ public HttpResponse(String body) { this(DEFAULT_VERSION, OK, type2String(OK)); this.setBody(body.getBytes()); } /** * default version and code. * @param code */ public HttpResponse(int code) { this(DEFAULT_VERSION, code, type2String(code)); } /** * create the response from the inputstream * @param in * @throws MalformedURLException * @throws IOException */ public HttpResponse(InputStream in) throws MalformedURLException, IOException { super(in); } /** * Reads the head of the message (startline and headers) from the * InputStream, and parses the startline for version, return code and * reason. * @throws IOException * @throws MalformedURLException */ public void readHead() throws IOException, MalformedURLException { super.readHead(); // parse requestline final int i = startLine.indexOf(' '); final int j = startLine.indexOf(' ', i + 1); version = startLine.substring(0, i); if (j > -1) { code = Integer.parseInt(startLine.substring(i + 1, j)); reason = startLine.substring(j + 1); } else { code = Integer.parseInt(startLine.substring(i + 1)); reason = ""; } if ((code >= 100 && code < 200) || code == 204 || code == 304) { // - and responses to HEAD requests hasBody = false; } else { hasBody = true; } // read body in immediately if cunked transfer-encoding... if ((containsHeader("Transfer-Encoding")) && (getHeader("Transfer-Encoding").equals("chunked"))) { getBody(); } } public String getVersion() { return version; } public int getCode() { return code; } public String getReason() { return reason; } public void setVersion(String version) { this.version = version; } public void setCode(int code) { this.code = code; } public void setReason(String reason) { this.reason = reason; } public String getStartLine() { return version + " " + code + " " + reason; } public boolean isHTML() { if (this.containsHeader("content-type")) { if (this.getHeader("content-type").indexOf("text/html") > -1) { return true; } } return false; } public boolean isCSS() { if (this.containsHeader("content-type")) { if (this.getHeader("content-type").indexOf("text/css") > -1) { return true; } } return false; } public boolean isGIF() { if (this.containsHeader("content-type")) { if (this.getHeader("content-type").indexOf("image/gif") > -1) { return true; } } return false; } public boolean isEncoded() { return this.containsHeader("content-encoding"); } public boolean isGZIPEncoded() { if (this.containsHeader("content-encoding")) { if (this.getHeader("content-encoding").indexOf("gzip") > -1) { return true; } } return false; } public boolean isDeflateEncoded() { if (this.containsHeader("content-encoding")) { if (this.getHeader("content-encoding").indexOf("deflate") > -1) { return true; } } return false; } public void appendToBody(String s) throws java.io.IOException { final String bs = new String(getBody()) + s; setBody(bs.getBytes()); } public void wrapBody(String header, String trailer) throws java.io.IOException { final String bs = header + new String(getBody()) + trailer; setBody(bs.getBytes()); } public void writeToStream(OutputStream stream) throws IOException { super.writeToStream(getStartLine(), stream); } private static String type2String(int type) { switch (type) { case CONTINUE : return "Continue"; case SWITCH_PROTOCOLS : return "Switching Protocols"; case OK : return "OK"; case CREATED : return "Created"; case ACCEPTED : return "Accepted"; case NON_AUTHORATIVE : return "Non-Authorative Information"; case NO_CONTENT : return "No Content"; case RESET_CONTENT : return "Reset Content"; case PARTIAL_CONTENT : return "Partial Content"; case MULTIPLE_CHOICES : return "Multiple Choices"; case MOVED_PERMANENTLY : return "Moved Permanently"; case MOVED_TEMPORARILY : return "Moved Temporarily"; case SEE_OTHER : return "See Other"; case NOT_MODIFIED : return "Not Modified"; case USE_PROXY : return "Use Proxy"; case BAD_REQUEST : return "Bad Request"; case UNAUTHORIZED : return "Unauthorized"; case PAYMENT_REQUIRED : return "Payment Required"; case FORBIDDEN : return "Forbidden"; case NOT_FOUND : return "Not Found"; case METHOD_NOT_ALLOWD : return "Method Not Allowed"; case NOT_ACCEPTABLE : return "Not Acceptable"; case PROXY_AUTHENTICATION_REQUIRED : return "Proxy Authentication required"; case REQUEST_TIMEOUT : return "Request Time-out"; case CONFLICT : return "Conflict"; case GONE : return "Gone"; case LENGTH_REQUIRED : return "Lenght Required"; case PRECONDITION_FAILED : return "Precondition Failed"; case REQUEST_TOO_LARGE : return "Request Entity Too Large"; case URI_TOO_LARGE : return "Request-URI Too Large"; case UNSUPPORTED_MEDIA : return "Unsupported Media Type"; case SERVER_ERROR : return "Internal Server Error"; case NOT_IMPLEMENTED : return "Not Implemented"; case BAD_GATEWAY : return "Bad Gateway"; case UNAVAILABLE : return "Service Unavailable"; case GATEWAY_TIMEOUT : return "Gateway Time-out"; case VERSION_NOT_SUPPORTED : return "HTTP Version not supported"; default : return "No Reason Phrase"; } } }