package org.webpieces.httpcommon;
import static org.webpieces.httpparser.api.dto.HttpRequest.HttpScheme.HTTP;
import static org.webpieces.httpparser.api.dto.HttpRequest.HttpScheme.HTTPS;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import org.webpieces.data.api.DataWrapper;
import org.webpieces.data.api.DataWrapperGenerator;
import org.webpieces.data.api.DataWrapperGeneratorFactory;
import org.webpieces.httpparser.api.common.Header;
import org.webpieces.httpparser.api.common.KnownHeaderName;
import org.webpieces.httpparser.api.dto.HttpRequest;
import org.webpieces.httpparser.api.dto.HttpRequestLine;
import org.webpieces.httpparser.api.dto.HttpUri;
import org.webpieces.httpparser.api.dto.KnownHttpMethod;
import org.webpieces.util.net.URLEncoder;
public class Requests {
private static DataWrapperGenerator gen = DataWrapperGeneratorFactory.createDataWrapperGenerator();
public static HttpRequest createRequest(KnownHttpMethod method, String url, boolean isHttps) {
return createRequest(method, url, isHttps, null);
}
public static HttpRequest createRequest(KnownHttpMethod method, String url, boolean isHttps, Integer port) {
HttpUri httpUri = new HttpUri(url);
HttpRequestLine requestLine = new HttpRequestLine();
requestLine.setMethod(method);
requestLine.setUri(httpUri);
HttpRequest req = new HttpRequest();
req.setRequestLine(requestLine);
if(isHttps)
req.setHttpScheme(HTTPS);
else
req.setHttpScheme(HTTP);
if(port == null)
req.addHeader(new Header(KnownHeaderName.HOST, "myhost.com"));
else
req.addHeader(new Header(KnownHeaderName.HOST, "myhost.com:"+port));
return req;
}
public static HttpRequest createGetRequest(String domain, String url, boolean isHttps) {
HttpUri httpUri = new HttpUri(url);
HttpRequestLine requestLine = new HttpRequestLine();
requestLine.setMethod(KnownHttpMethod.GET);
requestLine.setUri(httpUri);
HttpRequest req = new HttpRequest();
req.setRequestLine(requestLine);
if(isHttps)
req.setHttpScheme(HTTPS);
else
req.setHttpScheme(HTTP);
req.addHeader(new Header(KnownHeaderName.HOST, domain));
return req;
}
public static HttpRequest createRequest(KnownHttpMethod method, String url) {
return createRequest(method, url, false);
}
public static HttpRequest createPostRequest(String url, String ... argTuples) {
try {
return createPostRequestImpl(url, argTuples);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
private static HttpRequest createPostRequestImpl(String url, String ... argTuples) throws UnsupportedEncodingException {
if(argTuples.length % 2 != 0)
throw new IllegalArgumentException("argTuples.length must be of even size (key/value)");
HttpUri httpUri = new HttpUri(url);
HttpRequestLine requestLine = new HttpRequestLine();
requestLine.setMethod(KnownHttpMethod.POST);
requestLine.setUri(httpUri);
HttpRequest req = new HttpRequest();
req.setRequestLine(requestLine);
req.addHeader(new Header(KnownHeaderName.HOST, "myhost.com"));
String encodedParams = "";
for(int i = 0; i < argTuples.length; i+=2) {
String key = URLEncoder.encode(argTuples[i], StandardCharsets.UTF_8);
String value = URLEncoder.encode(argTuples[i+1], StandardCharsets.UTF_8);
if(!"".equals(encodedParams))
encodedParams += "&";
encodedParams += key+"="+value;
}
byte[] bytes = encodedParams.getBytes(StandardCharsets.UTF_8);
DataWrapper body = gen.wrapByteArray(bytes);
req.setBody(body);
req.addHeader(new Header(KnownHeaderName.CONTENT_LENGTH, ""+body.getReadableSize()));
req.addHeader(new Header(KnownHeaderName.CONTENT_TYPE, "application/x-www-form-urlencoded"));
return req;
}
public static HttpRequest createJsonRequest(KnownHttpMethod method, String url) {
HttpRequest request = createRequest(method, url);
String json = "{ `query`: `cats and dogs`, `meta`: { `numResults`: 4 } }".replace("`", "\"");
DataWrapper body = gen.wrapByteArray(json.getBytes());
request.setBody(body);
return request;
}
public static HttpRequest createBadJsonRequest(KnownHttpMethod method, String url) {
HttpRequest request = createRequest(method, url);
String json = "{ `query `cats and dogs`, `meta`: { `numResults`: 4 } }".replace("`", "\"");
DataWrapper body = gen.wrapByteArray(json.getBytes());
request.setBody(body);
return request;
}
}