Skip to content

Commit

Permalink
- Allow requests to be post processed
Browse files Browse the repository at this point in the history
- Remove all CORS stuff except for allowed methods returned by an OPTIONS query
  • Loading branch information
rchodava committed May 3, 2016
1 parent b27ef8b commit c8cdb44
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 128 deletions.
@@ -0,0 +1,10 @@
package org.chodavarapu.datamill.http;

import rx.functions.Func1;

/**
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
public interface PostProcessedRoute extends Route {
Route andFinally(Func1<Response, Response> postProcessor);
}
@@ -1,12 +1,8 @@
package org.chodavarapu.datamill.http.builder;

import org.chodavarapu.datamill.http.Method;
import org.chodavarapu.datamill.http.Response;
import org.chodavarapu.datamill.http.Route;
import org.chodavarapu.datamill.http.ServerRequest;
import org.chodavarapu.datamill.http.*;
import org.chodavarapu.datamill.reflection.Bean;
import rx.Observable;
import rx.functions.Func1;

import java.util.function.BiFunction;

Expand All @@ -21,10 +17,7 @@ public interface ElseBuilder {
ElseBuilder elseIfMatchesBeanMethod(
Bean<?> bean,
BiFunction<ServerRequest, org.chodavarapu.datamill.reflection.Method, Observable<Response>> route);
ElseBuilder elseIfMatchesBeanMethod(
Bean<?> bean,
Func1<Response, Response> postProcessor);
Route orElse(Route route);
Route orElse(Observable<Response> response);
Route orElse(Response response);
PostProcessedRoute orElse(Route route);
PostProcessedRoute orElse(Observable<Response> response);
PostProcessedRoute orElse(Response response);
}
Expand Up @@ -6,7 +6,6 @@
import org.chodavarapu.datamill.http.Route;
import org.chodavarapu.datamill.reflection.Bean;
import rx.Observable;
import rx.functions.Func1;

import java.util.function.BiFunction;

Expand All @@ -21,7 +20,4 @@ public interface RouteBuilder {
ElseBuilder ifMatchesBeanMethod(
Bean<?> bean,
BiFunction<ServerRequest, org.chodavarapu.datamill.reflection.Method, Observable<Response>> route);
ElseBuilder ifMatchesBeanMethod(
Bean<?> bean,
Func1<Response, Response> postProcessor);
}
@@ -1,26 +1,40 @@
package org.chodavarapu.datamill.http.impl;

import com.google.common.base.Joiner;
import org.chodavarapu.datamill.http.Method;
import org.chodavarapu.datamill.http.ServerRequest;
import org.chodavarapu.datamill.http.Response;
import org.chodavarapu.datamill.http.Route;
import org.chodavarapu.datamill.http.*;
import rx.Observable;
import rx.functions.Func1;

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;

/**
* @author Ravi Chodavarapu (rchodava@gmail.com)
*/
public class MatcherBasedRoute implements Route {
public class MatcherBasedRoute implements PostProcessedRoute {
private final List<Matcher> matchers;
private final List<Func1<Response, Response>> postProcessors = new ArrayList<>();

public MatcherBasedRoute(List<Matcher> matchers) {
this.matchers = matchers;
}

@Override
public Route andFinally(Func1<Response, Response> postProcessor) {
postProcessors.add(postProcessor);
return this;
}

private Response postProcess(Response response) {
for (Func1<Response, Response> postProcessor : postProcessors) {
response = postProcessor.call(response);
}

return response;
}

@Override
public Observable<Response> apply(ServerRequest request) {
if (request.method() == Method.OPTIONS) {
Expand All @@ -34,17 +48,16 @@ public Observable<Response> apply(ServerRequest request) {

if (availableMethods.size() > 0) {
return request.respond(b ->
b.header("Allow", Joiner.on(',').join(availableMethods))
.header("Access-Control-Allow-Headers", "Authorization")
.header("Access-Control-Allow-Origin", "*")
.ok());
b.header("Access-Control-Allow-Methods", Joiner.on(',').join(availableMethods))
.ok())
.map(this::postProcess);
}
}

for (Matcher matcher : matchers) {
Observable<Response> responseObservable = matcher.applyIfMatches(request);
if (responseObservable != null) {
return responseObservable;
return responseObservable.map(this::postProcess);
}
}

Expand Down
@@ -1,13 +1,9 @@
package org.chodavarapu.datamill.http.impl;

import org.chodavarapu.datamill.http.Method;
import org.chodavarapu.datamill.http.Response;
import org.chodavarapu.datamill.http.Route;
import org.chodavarapu.datamill.http.*;
import org.chodavarapu.datamill.http.builder.*;
import org.chodavarapu.datamill.http.ServerRequest;
import org.chodavarapu.datamill.reflection.Bean;
import rx.Observable;
import rx.functions.Func1;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -24,11 +20,6 @@ public ElseBuilder elseIfMatchesBeanMethod(Bean<?> bean) {
return ifMatchesBeanMethod(bean);
}

@Override
public ElseBuilder elseIfMatchesBeanMethod(Bean<?> bean, Func1<Response, Response> postProcessor) {
return ifMatchesBeanMethod(bean, postProcessor);
}

@Override
public ElseBuilder elseIfMatchesBeanMethod(Bean<?> bean, BiFunction<ServerRequest, org.chodavarapu.datamill.reflection.Method, Observable<Response>> route) {
return ifMatchesBeanMethod(bean, route);
Expand All @@ -51,7 +42,9 @@ public ElseBuilder elseIfUriMatches(String pattern, Route route) {

@Override
public ElseBuilder ifMatchesBeanMethod(Bean<?> bean) {
return ifMatchesBeanMethod(bean, r -> r);
return ifMatchesBeanMethod(bean,
(request, method) ->
bean.<Observable<Response>, ServerRequest>invoke(method, request));
}

@Override
Expand All @@ -62,14 +55,6 @@ public ElseBuilder ifMatchesBeanMethod(
return this;
}

@Override
public ElseBuilder ifMatchesBeanMethod(Bean<?> bean, Func1<Response, Response> postProcessor) {
return ifMatchesBeanMethod(bean,
(request, method) ->
bean.<Observable<Response>, ServerRequest>invoke(method, request)
.map(r -> postProcessor.call(r)));
}

@Override
public ElseBuilder ifMethodAndUriMatch(Method method, String pattern, Route route) {
matchers.add(new MethodAndUriMatcher(method, pattern, route));
Expand All @@ -89,19 +74,19 @@ public ElseBuilder ifUriMatches(String pattern, Route route) {
}

@Override
public Route orElse(Route route) {
public PostProcessedRoute orElse(Route route) {
matchers.add(new TautologyMatcher(route));
return new MatcherBasedRoute(matchers);
}

@Override
public Route orElse(Observable<Response> response) {
public PostProcessedRoute orElse(Observable<Response> response) {
matchers.add(new TautologyMatcher(response));
return new MatcherBasedRoute(matchers);
}

@Override
public Route orElse(Response response) {
public PostProcessedRoute orElse(Response response) {
matchers.add(new TautologyMatcher(response));
return new MatcherBasedRoute(matchers);
}
Expand Down
57 changes: 0 additions & 57 deletions examples/starter/pom.xml

This file was deleted.

This file was deleted.

0 comments on commit c8cdb44

Please sign in to comment.