From 23055d7dec60da7e2cce4b2702070f1e519a7d2a Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Mon, 5 Oct 2020 01:32:57 +0200 Subject: [PATCH] Some robustness and cleanup of HTTP code --- src/zutil/net/http/HttpClient.java | 48 +++++++++------- src/zutil/net/http/HttpHeader.java | 69 +++++++++++++++-------- src/zutil/net/http/page/HttpFilePage.java | 6 +- 3 files changed, 76 insertions(+), 47 deletions(-) diff --git a/src/zutil/net/http/HttpClient.java b/src/zutil/net/http/HttpClient.java index 76ab793..55f8e3d 100755 --- a/src/zutil/net/http/HttpClient.java +++ b/src/zutil/net/http/HttpClient.java @@ -34,29 +34,35 @@ import java.net.URL; import java.util.HashMap; /** - * This class connects to a HTTP server and - * parses the result - * - * @author Ziver + * This class connects to a HTTP server and parses the result. */ public class HttpClient implements AutoCloseable { public enum HttpRequestType { - GET, POST + GET, + POST } // Request variables private HttpURL url; - private HttpRequestType type; + private String type; private HashMap headers; private HashMap cookies; private String data; // Response variables - private HttpHeaderParser rspHeader; - private InputStream rspStream; + private HttpHeaderParser responseHeader; + private InputStream responseStream; + public HttpClient() { + this(HttpRequestType.GET); + } + public HttpClient(HttpRequestType type) { + this(type.toString()); + } + + public HttpClient(String type) { this.type = type; headers = new HashMap<>(); cookies = new HashMap<>(); @@ -94,7 +100,7 @@ public class HttpClient implements AutoCloseable { /** * Sets the content data that will be included in the request. - * NOTE: this will override the POST data parameter inclusion. + * NOTE: this will disable the POST data parameter inclusion. */ public void setData(String data) { this.data = data; @@ -109,12 +115,12 @@ public class HttpClient implements AutoCloseable { // Request HttpPrintStream request = new HttpPrintStream(conn.getOutputStream(), HttpMessageType.REQUEST); - request.setRequestType(type.toString()); + request.setRequestType(type); request.setRequestURL(url.getHttpURL()); request.setHeaders(headers); request.setCookies(cookies); - if (type == HttpRequestType.POST) { + if (HttpRequestType.POST.toString().equals(type)) { String postData; if (data != null) postData = data; @@ -128,27 +134,27 @@ public class HttpClient implements AutoCloseable { request.close(); // Response - if (rspHeader != null || rspStream != null) // Close previous request + if (responseHeader != null || responseStream != null) // Close previous request this.close(); - rspStream = new BufferedInputStream(conn.getInputStream()); - rspHeader = new HttpHeaderParser(rspStream); + responseStream = new BufferedInputStream(conn.getInputStream()); + responseHeader = new HttpHeaderParser(responseStream); - return rspHeader; + return responseHeader; } public HttpHeaderParser getResponseHeader() { - return rspHeader; + return responseHeader; } public InputStream getResponseInputStream() { - return rspStream; + return responseStream; } @Override public void close() throws IOException { - if (rspStream != null) - rspStream.close(); - rspStream = null; - rspHeader = null; + if (responseStream != null) + responseStream.close(); + responseStream = null; + responseHeader = null; } } diff --git a/src/zutil/net/http/HttpHeader.java b/src/zutil/net/http/HttpHeader.java index b0ce035..ebdb116 100755 --- a/src/zutil/net/http/HttpHeader.java +++ b/src/zutil/net/http/HttpHeader.java @@ -275,30 +275,51 @@ public class HttpHeader { public static String getResponseStatusString(int type) { switch (type) { - case 100: - return "Continue"; - case 200: - return "OK"; - case 301: - return "Moved Permanently"; - case 304: - return "Not Modified"; - case 307: - return "Temporary Redirect"; - case 400: - return "Bad Request"; - case 401: - return "Unauthorized"; - case 403: - return "Forbidden"; - case 404: - return "Not Found"; - case 500: - return "Internal Server Error"; - case 501: - return "Not Implemented"; - default: - return ""; + case 100: return "Continue"; + case 200: return "OK"; + case 201: return "Created"; + case 250: return "Low on Storage Space"; + case 300: return "Multiple Choices"; + case 301: return "Moved Permanently"; + case 302: return "Moved Temporarily"; + case 303: return "See Other"; + case 304: return "Not Modified"; + case 305: return "Use Proxy"; + case 307: return "Temporary Redirect"; + case 400: return "Bad Request"; + case 401: return "Unauthorized"; + case 403: return "Forbidden"; + case 404: return "Not Found"; + case 405: return "Method Not Allowed"; + case 406: return "Not Acceptable"; + case 407: return "Proxy Authentication Required"; + case 408: return "Request Time-out"; + case 410: return "Gone"; + case 411: return "Length Required"; + case 412: return "Precondition Failed"; + case 413: return "Request Entity Too Large"; + case 414: return "Request-URI Too Large"; + case 415: return "Unsupported Media Type"; + case 451: return "Parameter Not Understood"; + case 452: return "Conference Not Found"; + case 453: return "Not Enough Bandwidth"; + case 454: return "Session Not Found"; + case 455: return "Method Not Valid in This State"; + case 456: return "Header Field Not Valid for Resource"; + case 457: return "Invalid Range"; + case 458: return "Parameter Is Read-Only"; + case 459: return "Aggregate operation not allowed"; + case 460: return "Only aggregate operation allowed"; + case 461: return "Unsupported transport"; + case 462: return "Destination unreachable"; + case 500: return "Internal Server Error"; + case 501: return "Not Implemented"; + case 502: return "Bad Gateway"; + case 503: return "Service Unavailable"; + case 504: return "Gateway Time-out"; + case 505: return "RTSP Version not supported"; + case 551: return "Option not supported"; + default: return ""; } } } diff --git a/src/zutil/net/http/page/HttpFilePage.java b/src/zutil/net/http/page/HttpFilePage.java index 276af9b..21b40ea 100755 --- a/src/zutil/net/http/page/HttpFilePage.java +++ b/src/zutil/net/http/page/HttpFilePage.java @@ -146,8 +146,10 @@ public class HttpFilePage implements HttpPage{ } } private void deliverFile(File file, HttpPrintStream out) throws IOException { - out.setHeader("Content-Type", - MimeTypeUtil.getMimeByExtension(FileUtil.getFileExtension(file)).toString()); + String fileExt = FileUtil.getFileExtension(file); + + if (MimeTypeUtil.getMimeByExtension(fileExt) != null) + out.setHeader("Content-Type", MimeTypeUtil.getMimeByExtension(fileExt).toString()); out.setHeader("Content-Length", "" + file.length()); out.flush();