package com.github.hburgmeier.jerseyoauth2.rs.impl.rs2.filter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import org.apache.commons.io.IOUtils;
import com.github.hburgmeier.jerseyoauth2.api.protocol.IHttpRequest;
import com.github.hburgmeier.jerseyoauth2.rs.impl.rs2.filter.util.FormParser;
import com.github.hburgmeier.jerseyoauth2.rs.impl.rs2.filter.util.FormParserException;
public class HttpRequestAdapter implements IHttpRequest {
protected ContainerRequestContext context;
protected Map<String,String> queryParameters = new HashMap<>();
protected Form form;
public HttpRequestAdapter(ContainerRequestContext ctx) {
this.context = ctx;
MultivaluedMap<String, String> queryParams = ctx.getUriInfo().getQueryParameters();
for (Entry<String, List<String>> entry : queryParams.entrySet())
{
StringBuffer values = new StringBuffer();
for (String val : entry.getValue())
{
if (values.length()>0) {
values.append(",");
}
values.append(val);
}
this.queryParameters.put(entry.getKey(), values.toString());
}
}
@Override
public String getMethod() {
return context.getMethod();
}
@Override
public String getHeaderField(String field) {
return context.getHeaderString(field);
}
@Override
public String getQueryParameter(String queryParameter) {
return queryParameters.get(queryParameter);
}
@Override
public String getFormParameterValue(String formParameter) {
if (form==null)
form = getForm();
return form.asMap().getFirst(formParameter);
}
protected Form getForm()
{
if (MediaType.APPLICATION_FORM_URLENCODED_TYPE.equals(context.getMediaType()) && context.hasEntity())
{
try {
InputStream inputStream = context.getEntityStream();
if (inputStream.getClass() != ByteArrayInputStream.class) {
// Buffer input
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
IOUtils.copy(inputStream, byteArrayOutputStream);
} catch (IOException e) {
throw new IllegalArgumentException(e);
}
inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
context.setEntityStream(inputStream);
}
ByteArrayInputStream byteArrayInputStream = (ByteArrayInputStream) inputStream;
FormParser formParser = new FormParser();
Form f = formParser.parseForm(byteArrayInputStream);
byteArrayInputStream.reset();
return f;
} catch (FormParserException e) {
return new Form();
}
} else {
return new Form();
}
}
}