Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 4 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,8 @@
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.44.v20210927</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-server</artifactId>
<version>9.4.43.v20210629</version>
<version>11.0.7</version>
<!-- <optional>true</optional> -->
</dependency>
<dependency>
<groupId>org.reflections</groupId>
Expand All @@ -70,12 +66,12 @@
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version>
<version>5.8.2</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.1</version>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Expand Down
105 changes: 39 additions & 66 deletions src/main/java/org/javawebstack/httpserver/Exchange.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package org.javawebstack.httpserver;

import org.javawebstack.abstractdata.*;
import org.javawebstack.httpserver.helper.HttpMethod;
import org.javawebstack.httpserver.helper.MimeType;
import org.javawebstack.httpserver.adapter.IHTTPSocket;
import org.javawebstack.httpserver.util.MimeType;
import org.javawebstack.validator.ValidationContext;
import org.javawebstack.validator.ValidationException;
import org.javawebstack.validator.ValidationResult;
import org.javawebstack.validator.Validator;

import javax.servlet.MultipartConfigElement;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Exchange {

Expand All @@ -26,22 +25,18 @@ public static Exchange current() {
}

private final HTTPServer server;
private final HttpMethod method;
private final String path;
private final HTTPMethod method;
private byte[] body = null;
private final Map<String, Object> pathVariables = new HashMap<>();
private final AbstractObject queryParameters;
private final HttpServletRequest request;
private final HttpServletResponse response;
private final IHTTPSocket socket;
private final Map<String, Object> attributes = new HashMap<>();

public Exchange(HTTPServer server, HttpServletRequest request, HttpServletResponse response) {
public Exchange(HTTPServer server, IHTTPSocket socket) {
this.server = server;
this.request = request;
this.response = response;
this.path = request.getPathInfo();
this.method = "websocket".equalsIgnoreCase(request.getHeader("Upgrade")) ? HttpMethod.WEBSOCKET : HttpMethod.valueOf(request.getMethod());
this.queryParameters = AbstractElement.fromFormData(request.getQueryString()).object();
this.socket = socket;
this.method = "websocket".equalsIgnoreCase(socket.getRequestHeader("upgrade")) ? HTTPMethod.WEBSOCKET : socket.getRequestMethod();
this.queryParameters = AbstractElement.fromFormData(socket.getRequestQuery()).object();
}

public <T> T body(Class<T> clazz) {
Expand Down Expand Up @@ -91,22 +86,23 @@ public HTTPServer getServer() {
return server;
}

public HttpMethod getMethod() {
public HTTPMethod getMethod() {
return method;
}

public String getPath() {
return path;
return socket.getRequestPath();
}

public String getContentType() {
return request.getContentType() != null ? request.getContentType() : "";
String contentType = socket.getRequestHeader("content-type");
return contentType != null ? contentType : "";
}

public byte[] read() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
InputStream is = request.getInputStream();
InputStream is = socket.getInputStream();
byte[] data = new byte[1024];
int r;
while (is.available() > 0) {
Expand All @@ -126,17 +122,17 @@ public Exchange write(String data) {

public Exchange write(byte[] bytes) {
try {
response.getOutputStream().write(bytes);
response.getOutputStream().flush();
socket.getOutputStream().write(bytes);
socket.getOutputStream().flush();
} catch (IOException ignored) {
}
return this;
}

public Exchange write(byte[] bytes, int offset, int length) {
try {
response.getOutputStream().write(bytes, offset, length);
response.getOutputStream().flush();
socket.getOutputStream().write(bytes, offset, length);
socket.getOutputStream().flush();
} catch (IOException ignored) {
}
return this;
Expand All @@ -153,49 +149,50 @@ public Exchange write(InputStream stream) throws IOException {

public Exchange close() {
try {
response.getOutputStream().close();
socket.close();
} catch (IOException ignored) {
}
return this;
}

public Exchange header(String header, String value) {
if (header.equalsIgnoreCase("content-type")) {
response.setContentType(value);
return this;
}
response.setHeader(header, value);
socket.setResponseHeader(header, value);
return this;
}

public Exchange status(int code) {
response.setStatus(code);
socket.setResponseStatus(code);
return this;
}

public String header(String header) {
return request.getHeader(header);
return socket.getRequestHeader(header);
}

public Exchange redirect(String url) {
response.setStatus(302);
socket.setResponseStatus(302);
socket.setResponseHeader("location", url);
try {
response.sendRedirect(url);
} catch (IOException ex) {
throw new RuntimeException(ex);
socket.writeHeaders();
} catch (IOException e) {
e.printStackTrace();
}
return this;
}

public List<Locale> locales() {
return Collections.list(request.getLocales());
String locale = socket.getRequestHeader("accept-language");
if(locale == null)
return new ArrayList<>();
return Stream.of(locale.split(" ?,")).map(s -> s.split(";")[0]).map(Locale::forLanguageTag).collect(Collectors.toList());
}

public Locale locale(Locale... possible) {
List<Locale> requested = locales();
if (possible.length == 0)
return request.getLocale();
return requested.size() > 0 ? requested.get(0) : null;
List<Locale> possibleList = Arrays.asList(possible);
for (Locale l : locales()) {
for (Locale l : requested) {
if (possibleList.contains(l))
return l;
}
Expand All @@ -209,15 +206,11 @@ public Exchange contentType(MimeType type) {
public Exchange contentType(String contentType) {
if (contentType == null || contentType.equals(""))
return contentType("text/plain");
return header("Content-Type", contentType);
}

public HttpServletRequest rawRequest() {
return request;
return header("content-type", contentType);
}

public HttpServletResponse rawResponse() {
return response;
public IHTTPSocket socket() {
return socket;
}

public <T> T attrib(String key) {
Expand Down Expand Up @@ -255,7 +248,7 @@ public <T> T query(String name, Class<T> type, T defaultValue) {
}

public String remoteAddr() {
return request.getRemoteAddr();
return socket.getRemoteAddress();
}

public Map<String, Object> getPathVariables() {
Expand Down Expand Up @@ -299,24 +292,4 @@ protected static AbstractElement getPathElement(AbstractElement source, String p
return getPathElement(getPathElement(source, spl[0]), path.substring(spl[0].length() + 1));
}

public Exchange enableMultipart() {
enableMultipart(System.getProperty("java.io.tmpdir"));
return this;
}

public Exchange enableMultipart(String location) {
enableMultipart(location, -1L);
return this;
}

public Exchange enableMultipart(String location, long maxFileSize) {
enableMultipart(location, maxFileSize, 1_048_576);
return this;
}


public Exchange enableMultipart(String location, long maxFileSize, int fileSizeThreshold) {
request.setAttribute("org.eclipse.jetty.multipartConfig", new MultipartConfigElement(location, maxFileSize, -1L, fileSizeThreshold));
return this;
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package org.javawebstack.httpserver.helper;
package org.javawebstack.httpserver;

public enum HTTPMethod {

public enum HttpMethod {
GET,
POST,
PUT,
PATCH,
DELETE,
HEAD,
OPTIONS,
CONNECT,
MOVE,
TRACE,
CONNECT,
WEBSOCKET

}
Loading