Refactoring of header keys

This commit is contained in:
Ziver Koc 2020-10-25 23:51:35 +01:00
parent e116f999c5
commit 3c697c12ad
8 changed files with 84 additions and 40 deletions

View file

@ -43,13 +43,15 @@ public class HttpClient implements AutoCloseable {
} }
// Request variables // Request variables
private HttpURL url; private HttpURL url;
private String type; private String type;
private HashMap<String, String> headers; private HashMap<String, String> headers;
private HashMap<String, String> cookies; private HashMap<String, String> cookies;
private String data; private String content;
// Response variables // Response variables
private HttpHeaderParser responseHeader; private HttpHeaderParser responseHeader;
private InputStream responseStream; private InputStream responseStream;
@ -102,18 +104,21 @@ public class HttpClient implements AutoCloseable {
* Sets the content data that will be included in the request. * Sets the content data that will be included in the request.
* NOTE: this will disable the POST data parameter inclusion. * NOTE: this will disable the POST data parameter inclusion.
*/ */
public void setData(String data) { public void setContent(String content) {
this.data = data; this.content = content;
} }
/** /**
* Will send a HTTP request to the target host. * Will send a HTTP request to the target host.
* NOTE: any previous request connections will be closed * 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()); Socket conn = new Socket(url.getHost(), url.getPort());
// ---------------------------------
// Request // Request
// ---------------------------------
HttpPrintStream request = new HttpPrintStream(conn.getOutputStream(), HttpMessageType.REQUEST); HttpPrintStream request = new HttpPrintStream(conn.getOutputStream(), HttpMessageType.REQUEST);
request.setRequestType(type); request.setRequestType(type);
request.setRequestURL(url.getHttpURL()); request.setRequestURL(url.getHttpURL());
@ -122,28 +127,27 @@ public class HttpClient implements AutoCloseable {
if (HttpRequestType.POST.toString().equals(type)) { if (HttpRequestType.POST.toString().equals(type)) {
String postData; String postData;
if (data != null) if (content != null)
postData = data; postData = content;
else else
postData = url.getParameterString(); postData = url.getParameterString();
request.setHeader("Content-Length", "" + postData.length()); request.setHeader(HttpHeader.HEADER_CONTENT_LENGTH, "" + postData.length());
request.println(); request.println();
request.print(postData); request.print(postData);
} else } else
request.println(); request.println();
request.close(); request.flush();
// ---------------------------------
// Response // Response
// ---------------------------------
if (responseHeader != null || responseStream != null) // Close previous request if (responseHeader != null || responseStream != null) // Close previous request
this.close(); this.close();
responseStream = new BufferedInputStream(conn.getInputStream()); responseStream = new BufferedInputStream(conn.getInputStream());
responseHeader = new HttpHeaderParser(responseStream); responseHeader = new HttpHeaderParser(responseStream);
return responseHeader; return responseHeader.read();
}
public HttpHeaderParser getResponseHeader() {
return responseHeader;
} }
public InputStream getResponseInputStream() { public InputStream getResponseInputStream() {

View file

@ -33,6 +33,16 @@ import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
public class HttpHeader { 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; private boolean isRequest = true;
/** Specifies the protocol that should be used */ /** 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 * @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 * @return a Iterator with all defined cookies
*/ */

View file

@ -36,8 +36,6 @@ import java.util.Map;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class HttpHeaderParser { public class HttpHeaderParser {
private static final String HEADER_COOKIE = "COOKIE";
private static final Pattern PATTERN_COLON = Pattern.compile(":"); private static final Pattern PATTERN_COLON = Pattern.compile(":");
private static final Pattern PATTERN_EQUAL = Pattern.compile("="); private static final Pattern PATTERN_EQUAL = Pattern.compile("=");
private static final Pattern PATTERN_AND = Pattern.compile("&"); private static final Pattern PATTERN_AND = Pattern.compile("&");
@ -84,7 +82,7 @@ public class HttpHeaderParser {
} }
// Post processing // Post processing
parseCookieValues(header.getCookieMap(), header.getHeader(HEADER_COOKIE)); parseCookieValues(header.getCookieMap(), header.getHeader(HttpHeader.HEADER_COOKIE));
header.setInputStream(in); header.setInputStream(in);
return header; return header;
} }

View file

@ -235,14 +235,14 @@ public class HttpPrintStream extends OutputStream {
if (!header.getCookieMap().isEmpty()) { if (!header.getCookieMap().isEmpty()) {
if (header.isRequest()) { if (header.isRequest()) {
out.print("Cookie:"); out.print(HttpHeader.HEADER_COOKIE);
for (String key : header.getCookieMap().keySet()) { for (String key : header.getCookieMap().keySet()) {
out.print(" " + key + "=" + header.getCookie(key) + ";"); out.print(" " + key + "=" + header.getCookie(key) + ";");
} }
out.println(); out.println();
} else { } else {
for (String key : header.getCookieMap().keySet()) { 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(); out.println();
} }
} }

View file

@ -42,6 +42,9 @@ import java.util.concurrent.TimeUnit;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; 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 * A simple web server that handles both cookies and
@ -166,23 +169,27 @@ public class HttpServer extends ThreadedTCPNetworkServer{
HttpHeader header = null; HttpHeader header = null;
Map<String, Object> session = null; Map<String, Object> session = null;
try { try {
//**************************** PARSE REQUEST ********************************* // ----------------------------------------------------------------
// PARSE REQUEST
// ----------------------------------------------------------------
headerParser = new HttpHeaderParser(in); headerParser = new HttpHeaderParser(in);
header = headerParser.read(); header = headerParser.read();
if (header == null) { if (header == null) {
logger.finer("No header received"); logger.finer("No header received");
return; return;
} }
//******* Read in the post data if available // Read in the post data if available
if (header.getHeader("Content-Length") != null &&
header.getHeader("Content-Type") != null && if (header.containsHeader(HEADER_CONTENT_LENGTH) &&
header.getHeader("Content-Type").contains("application/x-www-form-urlencoded")) { header.containsHeader(HEADER_CONTENT_TYPE) &&
header.getHeader(HEADER_CONTENT_TYPE).contains("application/x-www-form-urlencoded")) {
// Reads the post data size // 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 // read the data
StringBuilder tmpBuff = new StringBuilder(); StringBuilder tmpBuff = new StringBuilder();
// read the data
for (int i = 0; i < postDataLength; i++) { for (int i = 0; i < postDataLength; i++) {
tmpBuff.append((char) in.read()); tmpBuff.append((char) in.read());
} }
@ -190,7 +197,10 @@ public class HttpServer extends ThreadedTCPNetworkServer{
HttpHeaderParser.parseURLParameters(header, tmpBuff.toString()); HttpHeaderParser.parseURLParameters(header, tmpBuff.toString());
} }
//**************************** HANDLE REQUEST ********************************* // ----------------------------------------------------------------
// HANDLE REQUEST
// ----------------------------------------------------------------
// Get the client session or create one // Get the client session or create one
String sessionCookie = header.getCookie(SESSION_KEY_ID); String sessionCookie = header.getCookie(SESSION_KEY_ID);
if (sessionCookie != null && sessions.containsKey(sessionCookie) && if (sessionCookie != null && sessions.containsKey(sessionCookie) &&
@ -201,27 +211,33 @@ public class HttpServer extends ThreadedTCPNetworkServer{
} else { } else {
synchronized (sessions) { synchronized (sessions) {
session = new ConcurrentHashMap<>(); 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()); 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; ++nextSessionId;
} }
} }
//**************************** RESPONSE ************************************ // ----------------------------------------------------------------
// RESPONSE
// ----------------------------------------------------------------
out.setProtocolVersion(1.0f); out.setProtocolVersion(1.0f);
out.setResponseStatusCode(200); out.setResponseStatusCode(200);
out.setHeader("Server", SERVER_NAME); out.setHeader(HttpHeader.HEADER_SERVER, SERVER_NAME);
out.setHeader("Content-Type", "text/html"); out.setHeader(HEADER_CONTENT_TYPE, "text/html");
if (header.getRequestURL() != null && pages.containsKey(header.getRequestURL())) { if (header.getRequestURL() != null && pages.containsKey(header.getRequestURL())) {
HttpPage page = pages.get(header.getRequestURL()); HttpPage page = pages.get(header.getRequestURL());
page.respond(out, header, session, header.getCookieMap(), header.getURLAttributeMap()); page.respond(out, header, session, header.getCookieMap(), header.getURLAttributeMap());
if (LogUtil.isLoggable(page.getClass(), Level.FINER)) if (LogUtil.isLoggable(page.getClass(), Level.FINER))
logRequest(header, session, time); logRequest(header, session, time);
} else if (header.getRequestURL() != null && defaultPage != null) { } else if (header.getRequestURL() != null && defaultPage != null) {
defaultPage.respond(out, header, session, header.getCookieMap(), header.getURLAttributeMap()); defaultPage.respond(out, header, session, header.getCookieMap(), header.getURLAttributeMap());
if (LogUtil.isLoggable(defaultPage.getClass(), Level.FINER)) if (LogUtil.isLoggable(defaultPage.getClass(), Level.FINER))
logRequest(header, session, time); logRequest(header, session, time);
} else { } else {
@ -229,7 +245,7 @@ public class HttpServer extends ThreadedTCPNetworkServer{
out.println("404 Page Not Found: " + header.getRequestURL()); out.println("404 Page Not Found: " + header.getRequestURL());
logger.warning("Page not defined: " + header.getRequestURL()); logger.warning("Page not defined: " + header.getRequestURL());
} }
//********************************************************************************
} catch (Exception e) { } catch (Exception e) {
logRequest(header, session, time); logRequest(header, session, time);
logger.log(Level.SEVERE, "500 Internal Server Error", e); logger.log(Level.SEVERE, "500 Internal Server Error", e);

View file

@ -25,15 +25,16 @@
package zutil.net.torrent; package zutil.net.torrent;
import zutil.net.http.HttpClient; import zutil.net.http.HttpClient;
import zutil.net.http.HttpHeader;
import zutil.net.http.HttpHeaderParser; import zutil.net.http.HttpHeaderParser;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
/** /**
* This tracker represents a tracker client * This tracker represents a tracker client
* that connects to a tracker * that connects to a tracker
* *
* @author Ziver * @author Ziver
*/ */
public class TorrentTracker { public class TorrentTracker {
@ -45,6 +46,6 @@ public class TorrentTracker {
public void update() throws IOException { public void update() throws IOException {
HttpClient request = new HttpClient(HttpClient.HttpRequestType.GET); HttpClient request = new HttpClient(HttpClient.HttpRequestType.GET);
request.setURL( trackerURL ); request.setURL( trackerURL );
HttpHeaderParser response = request.send(); HttpHeader response = request.send();
} }
} }

View file

@ -27,6 +27,7 @@ package zutil.net.ws.rest;
import zutil.io.IOUtil; import zutil.io.IOUtil;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import zutil.net.http.HttpClient; import zutil.net.http.HttpClient;
import zutil.net.http.HttpHeader;
import zutil.net.http.HttpHeaderParser; import zutil.net.http.HttpHeaderParser;
import zutil.net.http.HttpURL; import zutil.net.http.HttpURL;
import zutil.net.ws.WSInterface; import zutil.net.ws.WSInterface;
@ -75,7 +76,7 @@ public class RESTClientInvocationHandler implements InvocationHandler {
// Send request // Send request
HttpClient request = new HttpClient(HttpClient.HttpRequestType.POST); HttpClient request = new HttpClient(HttpClient.HttpRequestType.POST);
request.setURL(url); request.setURL(url);
HttpHeaderParser response = request.send(); HttpHeader response = request.send();
String rspJson = IOUtil.readContentAsString(request.getResponseInputStream()); String rspJson = IOUtil.readContentAsString(request.getResponseInputStream());
request.close(); request.close();

View file

@ -31,7 +31,7 @@ import org.dom4j.Element;
import zutil.io.IOUtil; import zutil.io.IOUtil;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import zutil.net.http.HttpClient; import zutil.net.http.HttpClient;
import zutil.net.http.HttpHeaderParser; import zutil.net.http.HttpHeader;
import zutil.net.ws.WSInterface; import zutil.net.ws.WSInterface;
import zutil.net.ws.WSMethodDef; import zutil.net.ws.WSMethodDef;
import zutil.net.ws.WSParameterDef; import zutil.net.ws.WSParameterDef;
@ -78,8 +78,8 @@ public class SOAPClientInvocationHandler implements InvocationHandler {
// Send request // Send request
HttpClient request = new HttpClient(HttpClient.HttpRequestType.POST); HttpClient request = new HttpClient(HttpClient.HttpRequestType.POST);
request.setURL(url); request.setURL(url);
request.setData(reqXml); request.setContent(reqXml);
HttpHeaderParser response = request.send(); HttpHeader response = request.send();
String rspXml = IOUtil.readContentAsString(request.getResponseInputStream()); String rspXml = IOUtil.readContentAsString(request.getResponseInputStream());
request.close(); request.close();