Commit 1d5a266e authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

taskRequestContextBuilder

parent 3a7563a1
package com.telephoners.krakyournet.ctf.beans.tasks;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.core.ApplicationConfiguration;
import com.telephoners.krakyournet.ctf.helpers.StreamUtils;
import org.glassfish.jersey.server.ContainerRequest;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Singleton
public class TaskRequestContextBuilder
{
private ApplicationConfiguration applicationConfiguration;
@Inject
public TaskRequestContextBuilder(ApplicationConfiguration applicationConfiguration)
{
this.applicationConfiguration = applicationConfiguration;
}
private Map<String, String> extractProxiedHeaders(MultivaluedMap<String, String> headers)
{
Set<String> proxiedHeaders = applicationConfiguration.getProxiedHeaders();
return headers.entrySet()
.stream()
.filter(header -> proxiedHeaders.contains(header.getKey()))
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().get(0) //todo: check
));
}
public TaskRequestContext from(User user, String path, ContainerRequestContext containerRequestContext) throws IOException
{
String fullPath = path;
TaskRequestContext taskRequestContext = new TaskRequestContext();
if (user != null) {
taskRequestContext.withUser(user);
}
if (path != null) {
taskRequestContext.withPath(path);
String httpMethod = containerRequestContext.getMethod();
String query = ((ContainerRequest) containerRequestContext).getRequestUri().getQuery();
if (query != null) {
fullPath += query;
}
taskRequestContext.withPath(fullPath);
if (httpMethod.equals("POST")) {
String body = StreamUtils.readStream(containerRequestContext.getEntityStream());
taskRequestContext.withBody(body);
}
Map<String, String> proxiedHeaders = extractProxiedHeaders(containerRequestContext.getHeaders());
taskRequestContext.withHeaders(proxiedHeaders);
}
return taskRequestContext;
}
}
...@@ -3,13 +3,10 @@ package com.telephoners.krakyournet.ctf.resources; ...@@ -3,13 +3,10 @@ package com.telephoners.krakyournet.ctf.resources;
import com.telephoners.krakyournet.ctf.beans.User; import com.telephoners.krakyournet.ctf.beans.User;
import com.telephoners.krakyournet.ctf.beans.tasks.Task; import com.telephoners.krakyournet.ctf.beans.tasks.Task;
import com.telephoners.krakyournet.ctf.beans.tasks.TaskRequestContext; import com.telephoners.krakyournet.ctf.beans.tasks.TaskRequestContext;
import com.telephoners.krakyournet.ctf.beans.tasks.TaskRequestContextBuilder;
import com.telephoners.krakyournet.ctf.beans.tasks.TaskResponse; import com.telephoners.krakyournet.ctf.beans.tasks.TaskResponse;
import com.telephoners.krakyournet.ctf.core.ApplicationConfiguration;
import com.telephoners.krakyournet.ctf.helpers.StreamUtils;
import com.telephoners.krakyournet.ctf.repositories.TasksRepository; import com.telephoners.krakyournet.ctf.repositories.TasksRepository;
import io.dropwizard.auth.Auth; import io.dropwizard.auth.Auth;
import org.eclipse.jetty.http.HttpMethod;
import org.glassfish.jersey.server.ContainerRequest;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
...@@ -19,36 +16,44 @@ import javax.ws.rs.Path; ...@@ -19,36 +16,44 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Context; import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.io.IOException; import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@Singleton @Singleton
@Path(value = "/task") @Path(value = "/task")
public class TaskResource public class TaskResource
{ {
private final ApplicationConfiguration applicationConfiguration;
private final TasksRepository tasksRepository; private final TasksRepository tasksRepository;
private final TaskRequestContextBuilder taskRequestContextBuilder;
@Inject @Inject
public TaskResource(ApplicationConfiguration applicationConfiguration, TasksRepository tasksRepository) public TaskResource(TasksRepository tasksRepository, TaskRequestContextBuilder taskRequestContextBuilder)
{ {
this.applicationConfiguration = applicationConfiguration;
this.tasksRepository = tasksRepository; this.tasksRepository = tasksRepository;
this.taskRequestContextBuilder = taskRequestContextBuilder;
} }
private Map<String, String> extractProxiedHeaders(MultivaluedMap<String, String> headers) { private Response buildResponse(TaskResponse taskResponse)
Set<String> proxiedHeaders = applicationConfiguration.getProxiedHeaders(); {
return headers.entrySet() Response.ResponseBuilder responseBuilder = Response.ok();
responseBuilder.entity(taskResponse.getText());
taskResponse.getHeaders()
.entrySet()
.stream() .stream()
.filter(header -> proxiedHeaders.contains(header.getKey())) .forEach(headerEntry -> {
.collect(Collectors.toMap( responseBuilder.header(headerEntry.getKey(), headerEntry.getValue());
Map.Entry::getKey, });
entry -> entry.getValue().get(0) //todo: check return responseBuilder.build();
)); }
private Response handleRequest(User user,
int taskLevel,
String path,
ContainerRequestContext containerRequestContext) throws IOException
{
Task task = tasksRepository.getByLevel(taskLevel);
TaskRequestContext taskRequestContext = taskRequestContextBuilder.from(user, path, containerRequestContext);
return buildResponse(task.getTaskResponse(taskRequestContext));
} }
@Path("{task_level}/{path: .*}") @Path("{task_level}/{path: .*}")
...@@ -58,29 +63,9 @@ public class TaskResource ...@@ -58,29 +63,9 @@ public class TaskResource
final @PathParam("path") String path, final @PathParam("path") String path,
@Context ContainerRequestContext containerRequestContext) throws IOException @Context ContainerRequestContext containerRequestContext) throws IOException
{ {
Task task = tasksRepository.getByLevel(taskLevel); return handleRequest(user, taskLevel, path, containerRequestContext);
String fullPath = path;
String query = ((ContainerRequest)containerRequestContext).getRequestUri().getQuery();
if(query != null) {
fullPath += query;
} }
Map<String, String> headers = extractProxiedHeaders(containerRequestContext.getHeaders());//todo: inline
TaskRequestContext taskRequestContext = new TaskRequestContext()
.withHttpMethod(HttpMethod.GET)
.withUser(user)
.withPath(fullPath)
.withHeaders(headers);
TaskResponse taskResponse = task.getTaskResponse(taskRequestContext);
Response.ResponseBuilder responseBuilder = Response.ok()
.entity(taskResponse.getText());
taskResponse.getHeaders().entrySet()
.stream()
.forEach(headerEntry -> responseBuilder.header(headerEntry.getKey(), headerEntry.getValue()));
return responseBuilder.build();
}
@Path("{task_level}/{path: .*}") @Path("{task_level}/{path: .*}")
@POST @POST
...@@ -89,33 +74,6 @@ public class TaskResource ...@@ -89,33 +74,6 @@ public class TaskResource
final @PathParam("path") String path, final @PathParam("path") String path,
@Context ContainerRequestContext containerRequestContext) throws IOException @Context ContainerRequestContext containerRequestContext) throws IOException
{ {
Task task = tasksRepository.getByLevel(taskLevel); return handleRequest(user, taskLevel, path, containerRequestContext);
String fullPath = path;
String query = ((ContainerRequest)containerRequestContext).getRequestUri().getQuery();
if(query != null) {
fullPath += query;
}
String body = StreamUtils.readStream(containerRequestContext.getEntityStream());
//todo: TaskContextFrom
Map<String, String> headers = extractProxiedHeaders(containerRequestContext.getHeaders());//todo: inline
TaskRequestContext taskRequestContext = new TaskRequestContext()
.withHttpMethod(HttpMethod.POST)
.withUser(user)
.withPath(fullPath)
.withBody(body)
.withHeaders(headers);
TaskResponse taskResponse = task.getTaskResponse(taskRequestContext);
Response.ResponseBuilder responseBuilder = Response.ok()
.entity(taskResponse.getText());
taskResponse.getHeaders().entrySet()
.stream()
.forEach(headerEntry -> responseBuilder.header(headerEntry.getKey(), headerEntry.getValue()));
return responseBuilder.build();
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment