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
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() {

View file

@ -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
*/

View file

@ -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;
}

View file

@ -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();
}
}

View file

@ -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);

View file

@ -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();
}
}

View file

@ -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();

View file

@ -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();