package com.github.hburgmeier.jerseyoauth2.authsrv.impl.protocol.response;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.hburgmeier.jerseyoauth2.api.protocol.ResponseBuilderException;
import com.github.hburgmeier.jerseyoauth2.authsrv.api.protocol.IHttpContext;
import com.github.hburgmeier.jerseyoauth2.authsrv.api.protocol.IOAuth2Response;
import com.github.hburgmeier.jerseyoauth2.protocol.impl.HttpHeaders;
import com.github.hburgmeier.jerseyoauth2.protocol.impl.utils.UrlBuilder;
import com.github.hburgmeier.jerseyoauth2.protocol.impl.utils.UrlBuilderException;
public abstract class AbstractOAuth2Response implements IOAuth2Response {
protected final int statusCode;
protected final ResponseFormat responseFormat;
private Map<String, String> headerFields = new HashMap<>();
public AbstractOAuth2Response(int statusCode, ResponseFormat responseFormat)
{
this.statusCode = statusCode;
this.responseFormat = responseFormat;
headerFields.put(HttpHeaders.CACHE_CONTROL,"no-store");
headerFields.put(HttpHeaders.PRAGMA,"no-cache");
}
@Override
public void render(IHttpContext context) throws ResponseBuilderException {
context.setStatus(statusCode);
if (responseFormat == ResponseFormat.JSON) {
context.setContentType("application/json;charset=UTF-8");
}
for (Map.Entry<String, String> header : headerFields.entrySet())
{
context.setHeader(header.getKey(), header.getValue());
}
}
protected void setHeader(String header, String value)
{
headerFields.put(header, value);
}
protected void renderJson(Map<String, Object> entity, IHttpContext context) throws ResponseBuilderException
{
try {
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(context.getResponseOutputStream(), entity);
} catch (IOException e) {
throw new ResponseBuilderException(e);
}
}
protected void renderRedirect(Map<String, Object> entity, URI redirectUrl, IHttpContext context) throws ResponseBuilderException
{
try {
UrlBuilder urlBuilder = new UrlBuilder();
URI modifiedUrl = urlBuilder.addQueryParameters(entity, redirectUrl);
context.setStatus(HttpServletResponse.SC_FOUND);
context.setHeader(HttpHeaders.LOCATION, modifiedUrl.toString());
} catch (UrlBuilderException e) {
throw new ResponseBuilderException(e);
}
}
protected void renderRedirectWithFragment(Map<String, Object> entity, URI redirectUrl, IHttpContext context) throws ResponseBuilderException
{
try {
UrlBuilder urlBuilder = new UrlBuilder();
String newFragment = urlBuilder.addQueryParameters(null, entity);
URI modifiedUrl = urlBuilder.setFragment(redirectUrl, newFragment);
context.setStatus(HttpServletResponse.SC_FOUND);
context.setHeader(HttpHeaders.LOCATION, modifiedUrl.toString());
} catch (UrlBuilderException e) {
throw new ResponseBuilderException(e);
}
}
}