/*
* 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.
*
*/
package org.apache.jmeter.protocol.http.proxy;
/**
* Utility class to generate HTTP responses of various types.
*
*/
public final class HttpReplyHdr {
/** String representing a carriage-return/line-feed pair. */
private static final String CR = "\r\n";
/** A HTTP protocol version string. */
private static final String HTTP_PROTOCOL = "HTTP/1.0";
/** The HTTP server name. */
private static final String HTTP_SERVER = "Java Proxy Server";
/**
* Don't allow instantiation of this utility class.
*/
private HttpReplyHdr() {
}
/**
* Forms a http ok reply header
*
* @param contentType
* the mime-type of the content
* @param contentLength
* the length of the content
* @return a string with the header in it
*/
public static String formOk(String contentType, long contentLength) {
StringBuilder out = new StringBuilder();
out.append(HTTP_PROTOCOL).append(" 200 Ok").append(CR);
out.append("Server: ").append(HTTP_SERVER).append(CR);
out.append("MIME-version: 1.0").append(CR);
if (0 < contentType.length()) {
out.append("Content-Type: ").append(contentType).append(CR);
} else {
out.append("Content-Type: text/html").append(CR);
}
if (0 != contentLength) {
out.append("Content-Length: ").append(contentLength).append(CR);
}
out.append(CR);
return out.toString();
}
/**
* private! builds an http document describing a headers reason.
*
* @param error
* Error name.
* @param description
* Errors description.
* @return A string with the HTML description body
*/
private static String formErrorBody(String error, String description) {
StringBuilder out = new StringBuilder();
// Generate Error Body
out.append("<HTML><HEAD><TITLE>");
out.append(error);
out.append("</TITLE></HEAD>");
out.append("<BODY><H2>").append(error).append("</H2>\n");
out.append("</P></H3>");
out.append(description);
out.append("</BODY></HTML>");
return out.toString();
}
/**
* builds an http document describing an error.
*
* @param error
* Error name.
* @param description
* Errors description.
* @return A string with the HTML description body
*/
private static String formError(String error, String description) {
/*
* A HTTP RESPONSE HEADER LOOKS ALOT LIKE:
*
* HTTP/1.0 200 OK Date: Wednesday, 02-Feb-94 23:04:12 GMT Server:
* NCSA/1.1 MIME-version: 1.0 Last-modified: Monday, 15-Nov-93 23:33:16
* GMT Content-Type: text/html Content-Length: 2345 \r\n
*/
String body = formErrorBody(error, description);
StringBuilder header = new StringBuilder();
header.append(HTTP_PROTOCOL).append(" ").append(error).append(CR);
header.append("Server: ").append(HTTP_SERVER).append(CR);
header.append("MIME-version: 1.0").append(CR);
header.append("Content-Type: text/html").append(CR);
header.append("Content-Length: ").append(body.length()).append(CR);
header.append(CR);
header.append(body);
return header.toString();
}
/**
* Indicates a new file was created.
*
* @return The header in a string;
*/
public static String formCreated() {
return formError("201 Created", "Object was created");
}
/**
* Indicates the document was accepted.
*
* @return The header in a string;
*/
public static String formAccepted() {
return formError("202 Accepted", "Object checked in");
}
/**
* Indicates only a partial responce was sent.
*
* @return The header in a string;
*/
public static String formPartial() {
return formError("203 Partial", "Only partail document available");
}
/**
* Indicates a requested URL has moved to a new address or name.
*
* @return The header in a string;
*/
public static String formMoved() {
// 300 codes tell client to do actions
return formError("301 Moved", "File has moved");
}
/**
* Never seen this used.
*
* @return The header in a string;
*/
public static String formFound() {
return formError("302 Found", "Object was found");
}
/**
* The requested method is not implemented by the server.
*
* @return The header in a string;
*/
public static String formMethod() {
return formError("303 Method unseported", "Method unseported");
}
/**
* Indicates remote copy of the requested object is current.
*
* @return The header in a string;
*/
public static String formNotModified() {
return formError("304 Not modified", "Use local copy");
}
/**
* Client not authorized for the request.
*
* @return The header in a string;
*/
public static String formUnauthorized() {
return formError("401 Unathorized", "Unathorized use of this service");
}
/**
* Payment is required for service.
*
* @return The header in a string;
*/
public static String formPaymentNeeded() {
return formError("402 Payment required", "Payment is required");
}
/**
* Client if forbidden to get the request service.
*
* @return The header in a string;
*/
public static String formForbidden() {
return formError("403 Forbidden", "You need permission for this service");
}
/**
* The requested object was not found.
*
* @return The header in a string;
*/
public static String formNotFound() {
return formError("404 Not_found", "Requested object was not found");
}
/**
* The server had a problem and could not fulfill the request.
*
* @return The header in a string;
*/
public static String formInternalError() {
return formError("500 Internal server error", "Server broke");
}
/**
* Server does not do the requested feature.
*
* @return The header in a string;
*/
public static String formNotImplemented() {
return formError("501 Method not implemented", "Service not implemented");
}
/**
* Server does not do the requested feature.
*
* @param reason detailed information for causing the failure
* @return The header in a string;
*/
public static String formNotImplemented(String reason) {
return formError("501 Method not implemented", "Service not implemented. " + reason);
}
/**
* Server is overloaded, client should try again latter.
*
* @return The header in a string;
*/
public static String formOverloaded() {
return formError("502 Server overloaded", "Try again latter");
}
/**
* Indicates the request took to long.
*
* @return The header in a string;
*/
public static String formTimeout() {
return formError("503 Gateway timeout", "The connection timed out");
}
/**
* Indicates the client's proxies could not locate a server.
*
* @return The header in a string;
*/
public static String formServerNotFound() {
return formError("503 Gateway timeout", "The requested server was not found");
}
/**
* Indicates the client is not allowed to access the object.
*
* @return The header in a string;
*/
public static String formNotAllowed() {
return formError("403 Access Denied", "Access is not allowed");
}
}