Refactoring of header keys
This commit is contained in:
parent
e116f999c5
commit
3c697c12ad
8 changed files with 84 additions and 40 deletions
|
|
@ -43,13 +43,15 @@ public class HttpClient implements AutoCloseable {
|
|||
}
|
||||
|
||||
// Request variables
|
||||
|
||||
private HttpURL url;
|
||||
private String type;
|
||||
private HashMap<String, String> headers;
|
||||
private HashMap<String, String> cookies;
|
||||
private String data;
|
||||
private String content;
|
||||
|
||||
// Response variables
|
||||
|
||||
private HttpHeaderParser responseHeader;
|
||||
private InputStream responseStream;
|
||||
|
||||
|
|
@ -102,18 +104,21 @@ public class HttpClient implements AutoCloseable {
|
|||
* Sets the content data that will be included in the request.
|
||||
* NOTE: this will disable the POST data parameter inclusion.
|
||||
*/
|
||||
public void setData(String data) {
|
||||
this.data = data;
|
||||
public void setContent(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Will send a HTTP request to the target host.
|
||||
* NOTE: any previous request connections will be closed
|
||||
*/
|
||||
public HttpHeaderParser send() throws IOException {
|
||||
public HttpHeader send() throws IOException {
|
||||
Socket conn = new Socket(url.getHost(), url.getPort());
|
||||
|
||||
// ---------------------------------
|
||||
// Request
|
||||
// ---------------------------------
|
||||
|
||||
HttpPrintStream request = new HttpPrintStream(conn.getOutputStream(), HttpMessageType.REQUEST);
|
||||
request.setRequestType(type);
|
||||
request.setRequestURL(url.getHttpURL());
|
||||
|
|
@ -122,28 +127,27 @@ public class HttpClient implements AutoCloseable {
|
|||
|
||||
if (HttpRequestType.POST.toString().equals(type)) {
|
||||
String postData;
|
||||
if (data != null)
|
||||
postData = data;
|
||||
if (content != null)
|
||||
postData = content;
|
||||
else
|
||||
postData = url.getParameterString();
|
||||
request.setHeader("Content-Length", "" + postData.length());
|
||||
request.setHeader(HttpHeader.HEADER_CONTENT_LENGTH, "" + postData.length());
|
||||
request.println();
|
||||
request.print(postData);
|
||||
} else
|
||||
request.println();
|
||||
request.close();
|
||||
request.flush();
|
||||
|
||||
// ---------------------------------
|
||||
// Response
|
||||
// ---------------------------------
|
||||
|
||||
if (responseHeader != null || responseStream != null) // Close previous request
|
||||
this.close();
|
||||
responseStream = new BufferedInputStream(conn.getInputStream());
|
||||
responseHeader = new HttpHeaderParser(responseStream);
|
||||
|
||||
return responseHeader;
|
||||
}
|
||||
|
||||
public HttpHeaderParser getResponseHeader() {
|
||||
return responseHeader;
|
||||
return responseHeader.read();
|
||||
}
|
||||
|
||||
public InputStream getResponseInputStream() {
|
||||
|
|
|
|||
|
|
@ -33,6 +33,16 @@ import java.util.Map;
|
|||
import java.util.TreeMap;
|
||||
|
||||
public class HttpHeader {
|
||||
// Constants
|
||||
|
||||
public static final String HEADER_CONTENT_TYPE = "Content-Type";
|
||||
public static final String HEADER_CONTENT_LENGTH = "Content-Length";
|
||||
public static final String HEADER_COOKIE = "Cookie";
|
||||
public static final String HEADER_SET_COOKIE = "Set-Cookie";
|
||||
public static final String HEADER_SERVER = "Server";
|
||||
|
||||
// Variables
|
||||
|
||||
private boolean isRequest = true;
|
||||
|
||||
/** Specifies the protocol that should be used */
|
||||
|
|
@ -180,6 +190,13 @@ public class HttpHeader {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return true if the specified header has been set, false otherwise.
|
||||
*/
|
||||
public boolean containsHeader(String name) {
|
||||
return headers.containsKey(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a Iterator with all defined headers
|
||||
*/
|
||||
|
|
@ -207,6 +224,13 @@ public class HttpHeader {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return true if the specified cookie has been set, false otherwise.
|
||||
*/
|
||||
public boolean containsCookie(String name) {
|
||||
return cookies.containsKey(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a Iterator with all defined cookies
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -36,8 +36,6 @@ import java.util.Map;
|
|||
import java.util.regex.Pattern;
|
||||
|
||||
public class HttpHeaderParser {
|
||||
private static final String HEADER_COOKIE = "COOKIE";
|
||||
|
||||
private static final Pattern PATTERN_COLON = Pattern.compile(":");
|
||||
private static final Pattern PATTERN_EQUAL = Pattern.compile("=");
|
||||
private static final Pattern PATTERN_AND = Pattern.compile("&");
|
||||
|
|
@ -84,7 +82,7 @@ public class HttpHeaderParser {
|
|||
}
|
||||
|
||||
// Post processing
|
||||
parseCookieValues(header.getCookieMap(), header.getHeader(HEADER_COOKIE));
|
||||
parseCookieValues(header.getCookieMap(), header.getHeader(HttpHeader.HEADER_COOKIE));
|
||||
header.setInputStream(in);
|
||||
return header;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -235,14 +235,14 @@ public class HttpPrintStream extends OutputStream {
|
|||
|
||||
if (!header.getCookieMap().isEmpty()) {
|
||||
if (header.isRequest()) {
|
||||
out.print("Cookie:");
|
||||
out.print(HttpHeader.HEADER_COOKIE);
|
||||
for (String key : header.getCookieMap().keySet()) {
|
||||
out.print(" " + key + "=" + header.getCookie(key) + ";");
|
||||
}
|
||||
out.println();
|
||||
} else {
|
||||
for (String key : header.getCookieMap().keySet()) {
|
||||
out.print("Set-Cookie: " + key + "=" + header.getCookie(key) + ";");
|
||||
out.print(HttpHeader.HEADER_SET_COOKIE + ": " + key + "=" + header.getCookie(key) + ";");
|
||||
out.println();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@ import java.util.concurrent.TimeUnit;
|
|||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import static zutil.net.http.HttpHeader.HEADER_CONTENT_LENGTH;
|
||||
import static zutil.net.http.HttpHeader.HEADER_CONTENT_TYPE;
|
||||
|
||||
|
||||
/**
|
||||
* A simple web server that handles both cookies and
|
||||
|
|
@ -166,23 +169,27 @@ public class HttpServer extends ThreadedTCPNetworkServer{
|
|||
HttpHeader header = null;
|
||||
Map<String, Object> session = null;
|
||||
try {
|
||||
//**************************** PARSE REQUEST *********************************
|
||||
// ----------------------------------------------------------------
|
||||
// PARSE REQUEST
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
headerParser = new HttpHeaderParser(in);
|
||||
header = headerParser.read();
|
||||
|
||||
if (header == null) {
|
||||
logger.finer("No header received");
|
||||
return;
|
||||
}
|
||||
|
||||
//******* Read in the post data if available
|
||||
if (header.getHeader("Content-Length") != null &&
|
||||
header.getHeader("Content-Type") != null &&
|
||||
header.getHeader("Content-Type").contains("application/x-www-form-urlencoded")) {
|
||||
// Read in the post data if available
|
||||
|
||||
if (header.containsHeader(HEADER_CONTENT_LENGTH) &&
|
||||
header.containsHeader(HEADER_CONTENT_TYPE) &&
|
||||
header.getHeader(HEADER_CONTENT_TYPE).contains("application/x-www-form-urlencoded")) {
|
||||
// Reads the post data size
|
||||
int postDataLength = Integer.parseInt(header.getHeader("Content-Length"));
|
||||
int postDataLength = Integer.parseInt(header.getHeader(HEADER_CONTENT_LENGTH));
|
||||
// read the data
|
||||
StringBuilder tmpBuff = new StringBuilder();
|
||||
// read the data
|
||||
for (int i = 0; i < postDataLength; i++) {
|
||||
tmpBuff.append((char) in.read());
|
||||
}
|
||||
|
|
@ -190,7 +197,10 @@ public class HttpServer extends ThreadedTCPNetworkServer{
|
|||
HttpHeaderParser.parseURLParameters(header, tmpBuff.toString());
|
||||
}
|
||||
|
||||
//**************************** HANDLE REQUEST *********************************
|
||||
// ----------------------------------------------------------------
|
||||
// HANDLE REQUEST
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
// Get the client session or create one
|
||||
String sessionCookie = header.getCookie(SESSION_KEY_ID);
|
||||
if (sessionCookie != null && sessions.containsKey(sessionCookie) &&
|
||||
|
|
@ -201,27 +211,33 @@ public class HttpServer extends ThreadedTCPNetworkServer{
|
|||
} else {
|
||||
synchronized (sessions) {
|
||||
session = new ConcurrentHashMap<>();
|
||||
session.put(SESSION_KEY_ID, ""+nextSessionId);
|
||||
session.put(SESSION_KEY_ID, "" + nextSessionId);
|
||||
session.put(SESSION_KEY_TTL, new Timer(SESSION_TTL).start());
|
||||
sessions.put(""+nextSessionId, session);
|
||||
out.setCookie(SESSION_KEY_ID, ""+nextSessionId);
|
||||
|
||||
sessions.put("" + nextSessionId, session);
|
||||
out.setCookie(SESSION_KEY_ID, "" + nextSessionId);
|
||||
++nextSessionId;
|
||||
}
|
||||
}
|
||||
|
||||
//**************************** RESPONSE ************************************
|
||||
// ----------------------------------------------------------------
|
||||
// RESPONSE
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
out.setProtocolVersion(1.0f);
|
||||
out.setResponseStatusCode(200);
|
||||
out.setHeader("Server", SERVER_NAME);
|
||||
out.setHeader("Content-Type", "text/html");
|
||||
out.setHeader(HttpHeader.HEADER_SERVER, SERVER_NAME);
|
||||
out.setHeader(HEADER_CONTENT_TYPE, "text/html");
|
||||
|
||||
if (header.getRequestURL() != null && pages.containsKey(header.getRequestURL())) {
|
||||
HttpPage page = pages.get(header.getRequestURL());
|
||||
page.respond(out, header, session, header.getCookieMap(), header.getURLAttributeMap());
|
||||
|
||||
if (LogUtil.isLoggable(page.getClass(), Level.FINER))
|
||||
logRequest(header, session, time);
|
||||
} else if (header.getRequestURL() != null && defaultPage != null) {
|
||||
defaultPage.respond(out, header, session, header.getCookieMap(), header.getURLAttributeMap());
|
||||
|
||||
if (LogUtil.isLoggable(defaultPage.getClass(), Level.FINER))
|
||||
logRequest(header, session, time);
|
||||
} else {
|
||||
|
|
@ -229,7 +245,7 @@ public class HttpServer extends ThreadedTCPNetworkServer{
|
|||
out.println("404 Page Not Found: " + header.getRequestURL());
|
||||
logger.warning("Page not defined: " + header.getRequestURL());
|
||||
}
|
||||
//********************************************************************************
|
||||
|
||||
} catch (Exception e) {
|
||||
logRequest(header, session, time);
|
||||
logger.log(Level.SEVERE, "500 Internal Server Error", e);
|
||||
|
|
|
|||
|
|
@ -25,15 +25,16 @@
|
|||
package zutil.net.torrent;
|
||||
|
||||
import zutil.net.http.HttpClient;
|
||||
import zutil.net.http.HttpHeader;
|
||||
import zutil.net.http.HttpHeaderParser;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* This tracker represents a tracker client
|
||||
* This tracker represents a tracker client
|
||||
* that connects to a tracker
|
||||
*
|
||||
*
|
||||
* @author Ziver
|
||||
*/
|
||||
public class TorrentTracker {
|
||||
|
|
@ -45,6 +46,6 @@ public class TorrentTracker {
|
|||
public void update() throws IOException {
|
||||
HttpClient request = new HttpClient(HttpClient.HttpRequestType.GET);
|
||||
request.setURL( trackerURL );
|
||||
HttpHeaderParser response = request.send();
|
||||
HttpHeader response = request.send();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ package zutil.net.ws.rest;
|
|||
import zutil.io.IOUtil;
|
||||
import zutil.log.LogUtil;
|
||||
import zutil.net.http.HttpClient;
|
||||
import zutil.net.http.HttpHeader;
|
||||
import zutil.net.http.HttpHeaderParser;
|
||||
import zutil.net.http.HttpURL;
|
||||
import zutil.net.ws.WSInterface;
|
||||
|
|
@ -75,7 +76,7 @@ public class RESTClientInvocationHandler implements InvocationHandler {
|
|||
// Send request
|
||||
HttpClient request = new HttpClient(HttpClient.HttpRequestType.POST);
|
||||
request.setURL(url);
|
||||
HttpHeaderParser response = request.send();
|
||||
HttpHeader response = request.send();
|
||||
String rspJson = IOUtil.readContentAsString(request.getResponseInputStream());
|
||||
request.close();
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ import org.dom4j.Element;
|
|||
import zutil.io.IOUtil;
|
||||
import zutil.log.LogUtil;
|
||||
import zutil.net.http.HttpClient;
|
||||
import zutil.net.http.HttpHeaderParser;
|
||||
import zutil.net.http.HttpHeader;
|
||||
import zutil.net.ws.WSInterface;
|
||||
import zutil.net.ws.WSMethodDef;
|
||||
import zutil.net.ws.WSParameterDef;
|
||||
|
|
@ -78,8 +78,8 @@ public class SOAPClientInvocationHandler implements InvocationHandler {
|
|||
// Send request
|
||||
HttpClient request = new HttpClient(HttpClient.HttpRequestType.POST);
|
||||
request.setURL(url);
|
||||
request.setData(reqXml);
|
||||
HttpHeaderParser response = request.send();
|
||||
request.setContent(reqXml);
|
||||
HttpHeader response = request.send();
|
||||
String rspXml = IOUtil.readContentAsString(request.getResponseInputStream());
|
||||
request.close();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue