From 3c697c12add4addfe44dd7e103603dde6bc87f14 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Sun, 25 Oct 2020 23:51:35 +0100 Subject: [PATCH] Refactoring of header keys --- src/zutil/net/http/HttpClient.java | 30 ++++++------ src/zutil/net/http/HttpHeader.java | 24 ++++++++++ src/zutil/net/http/HttpHeaderParser.java | 4 +- src/zutil/net/http/HttpPrintStream.java | 4 +- src/zutil/net/http/HttpServer.java | 46 +++++++++++++------ src/zutil/net/torrent/TorrentTracker.java | 7 +-- .../ws/rest/RESTClientInvocationHandler.java | 3 +- .../ws/soap/SOAPClientInvocationHandler.java | 6 +-- 8 files changed, 84 insertions(+), 40 deletions(-) diff --git a/src/zutil/net/http/HttpClient.java b/src/zutil/net/http/HttpClient.java index 55f8e3d..718a1d3 100755 --- a/src/zutil/net/http/HttpClient.java +++ b/src/zutil/net/http/HttpClient.java @@ -43,13 +43,15 @@ public class HttpClient implements AutoCloseable { } // Request variables + private HttpURL url; private String type; private HashMap headers; private HashMap 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() { diff --git a/src/zutil/net/http/HttpHeader.java b/src/zutil/net/http/HttpHeader.java index ebdb116..2b23838 100755 --- a/src/zutil/net/http/HttpHeader.java +++ b/src/zutil/net/http/HttpHeader.java @@ -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 */ diff --git a/src/zutil/net/http/HttpHeaderParser.java b/src/zutil/net/http/HttpHeaderParser.java index f49a068..b75d894 100755 --- a/src/zutil/net/http/HttpHeaderParser.java +++ b/src/zutil/net/http/HttpHeaderParser.java @@ -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; } diff --git a/src/zutil/net/http/HttpPrintStream.java b/src/zutil/net/http/HttpPrintStream.java index c9c9e0a..fc5a7da 100755 --- a/src/zutil/net/http/HttpPrintStream.java +++ b/src/zutil/net/http/HttpPrintStream.java @@ -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(); } } diff --git a/src/zutil/net/http/HttpServer.java b/src/zutil/net/http/HttpServer.java index 45de735..35a18b3 100755 --- a/src/zutil/net/http/HttpServer.java +++ b/src/zutil/net/http/HttpServer.java @@ -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 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); diff --git a/src/zutil/net/torrent/TorrentTracker.java b/src/zutil/net/torrent/TorrentTracker.java index 0959df6..8b52227 100755 --- a/src/zutil/net/torrent/TorrentTracker.java +++ b/src/zutil/net/torrent/TorrentTracker.java @@ -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(); } } diff --git a/src/zutil/net/ws/rest/RESTClientInvocationHandler.java b/src/zutil/net/ws/rest/RESTClientInvocationHandler.java index 63f3f76..bdd7a06 100644 --- a/src/zutil/net/ws/rest/RESTClientInvocationHandler.java +++ b/src/zutil/net/ws/rest/RESTClientInvocationHandler.java @@ -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(); diff --git a/src/zutil/net/ws/soap/SOAPClientInvocationHandler.java b/src/zutil/net/ws/soap/SOAPClientInvocationHandler.java index 61f2573..14ebb41 100755 --- a/src/zutil/net/ws/soap/SOAPClientInvocationHandler.java +++ b/src/zutil/net/ws/soap/SOAPClientInvocationHandler.java @@ -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();