Commit 5326152a authored by Grzegorz Pietrusza's avatar Grzegorz Pietrusza

headers handling

parent 4c82e88b
...@@ -2,12 +2,15 @@ package com.telephoners.krakyournet.ctf.beans.tasks; ...@@ -2,12 +2,15 @@ package com.telephoners.krakyournet.ctf.beans.tasks;
import com.telephoners.krakyournet.ctf.beans.User; import com.telephoners.krakyournet.ctf.beans.User;
import java.util.Map;
public class TaskRequestContext public class TaskRequestContext
{ {
private String httpMethod; //todo: use class private String httpMethod; //todo: use class
private User user; private User user;
private String path; private String path;
private String body; private String body;
private Map<String, String> headers;
public TaskRequestContext withHttpMethod(String httpMethod) public TaskRequestContext withHttpMethod(String httpMethod)
{ {
...@@ -32,6 +35,11 @@ public class TaskRequestContext ...@@ -32,6 +35,11 @@ public class TaskRequestContext
return this; return this;
} }
public TaskRequestContext withHeaders(Map<String, String> headers) {
this.headers = headers;
return this;
}
public String getHttpMethod() public String getHttpMethod()
{ {
return httpMethod; return httpMethod;
...@@ -51,4 +59,9 @@ public class TaskRequestContext ...@@ -51,4 +59,9 @@ public class TaskRequestContext
{ {
return body; return body;
} }
public Map<String, String> getHeaders()
{
return headers;
}
} }
package com.telephoners.krakyournet.ctf.beans.tasks; package com.telephoners.krakyournet.ctf.beans.tasks;
import java.util.Map;
public class TaskResponse public class TaskResponse
{ {
private String text; private String text;
private String kynHeader; private Map<String, String> headers;
public TaskResponse(String text, String kynHeader) public TaskResponse(String text, Map<String,String> headers)
{ {
this.text = text; this.text = text;
this.kynHeader = kynHeader; this.headers = headers;
} }
public String getText() public String getText()
{ {
return text; return text;
} }
public String getKynHeader() public Map<String, String> getHeaders()
{ {
return kynHeader; return headers;
} }
} }
\ No newline at end of file
package com.telephoners.krakyournet.ctf.resources; package com.telephoners.krakyournet.ctf.resources;
import com.google.common.collect.Sets;
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;
...@@ -17,15 +18,20 @@ import javax.ws.rs.Path; ...@@ -17,15 +18,20 @@ 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.function.Consumer;
import java.util.stream.Collectors;
@Singleton @Singleton
@Path(value = "/task") @Path(value = "/task")
public class TaskResource public class TaskResource
{ {
private final TasksRepository tasksRepository; private final TasksRepository tasksRepository;
private static final String KYN_HEADER_NAME = "KYN_2016"; //todo, move to configuration private static final Set<String> PROXIED_HEADERS = Sets.newHashSet("KYN_2016", "EY_HEADER", "Content-Type"); //todo: move to conf
@Inject @Inject
public TaskResource(TasksRepository tasksRepository) public TaskResource(TasksRepository tasksRepository)
...@@ -55,6 +61,16 @@ public class TaskResource ...@@ -55,6 +61,16 @@ public class TaskResource
} }
*/ */
private Map<String, String> extractProxiedHeaders(MultivaluedMap<String, String> headers) {
return headers.entrySet()
.stream()
.filter(header -> PROXIED_HEADERS.contains(header.getKey()))
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().get(0) //todo: check
));
}
@Path("{task_level}/{path: .*}") @Path("{task_level}/{path: .*}")
@GET @GET
public Response getTaskGet(@Auth User user, public Response getTaskGet(@Auth User user,
...@@ -67,15 +83,23 @@ public class TaskResource ...@@ -67,15 +83,23 @@ public class TaskResource
if(query != null) { if(query != null) {
fullPath += query; fullPath += query;
} }
Map<String, String> headers = extractProxiedHeaders(containerRequestContext.getHeaders());//todo: inline
TaskRequestContext taskRequestContext = new TaskRequestContext() TaskRequestContext taskRequestContext = new TaskRequestContext()
.withHttpMethod("POST") .withHttpMethod("POST")
.withUser(user) .withUser(user)
.withPath(fullPath); .withPath(fullPath)
.withHeaders(headers);
TaskResponse taskResponse = getTaskResponse(taskLevel, taskRequestContext); TaskResponse taskResponse = getTaskResponse(taskLevel, taskRequestContext);
//todo: headers
return Response.ok().entity(taskResponse.getText()).build();
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: .*}")
...@@ -92,13 +116,25 @@ public class TaskResource ...@@ -92,13 +116,25 @@ public class TaskResource
} }
String body = StreamUtils.readStream(containerRequestContext.getEntityStream()); String body = StreamUtils.readStream(containerRequestContext.getEntityStream());
//todo: TaskContextFrom //todo: TaskContextFrom
Map<String, String> headers = extractProxiedHeaders(containerRequestContext.getHeaders());//todo: inline
TaskRequestContext taskRequestContext = new TaskRequestContext() TaskRequestContext taskRequestContext = new TaskRequestContext()
.withHttpMethod("POST") .withHttpMethod("POST")
.withUser(user) .withUser(user)
.withPath(fullPath) .withPath(fullPath)
.withBody(body); .withBody(body)
.withHeaders(headers);
TaskResponse taskResponse = getTaskResponse(taskLevel, taskRequestContext); TaskResponse taskResponse = getTaskResponse(taskLevel, taskRequestContext);
//todo: hedaers
return Response.ok().entity(taskResponse.getText()).build(); 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