diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java
index ecad084..182221b 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/LogReader.java
@@ -9,6 +9,7 @@ import br.ufrgs.inf.prosoft.requestssimulator.requests.DeleteRequest;
import br.ufrgs.inf.prosoft.requestssimulator.requests.GetRequest;
import br.ufrgs.inf.prosoft.requestssimulator.requests.PostRequest;
import br.ufrgs.inf.prosoft.requestssimulator.requests.MultipartRequest;
+import br.ufrgs.inf.prosoft.requestssimulator.requests.PutRequest;
import br.ufrgs.inf.prosoft.requestssimulator.requests.Request;
import br.ufrgs.inf.prosoft.requestssimulator.requests.RequestPlan;
import com.google.gson.Gson;
@@ -66,6 +67,8 @@ public class LogReader {
request = gson.fromJson(jsonObject, GetRequest.class);
} else if (requestPlan.getMethod().equals("DELETE")) {
request = gson.fromJson(jsonObject, DeleteRequest.class);
+ } else if (requestPlan.getMethod().equals("PUT")) {
+ request = gson.fromJson(jsonObject, PutRequest.class);
} else {
JsonElement headers = jsonObject.get("headers");
if (headers != null && headers.getAsString().contains("multipart")) {
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PutRequest.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PutRequest.java
new file mode 100644
index 0000000..ee25a69
--- /dev/null
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PutRequest.java
@@ -0,0 +1,96 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package br.ufrgs.inf.prosoft.requestssimulator.requests;
+
+import br.ufrgs.inf.prosoft.requestssimulator.Session;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author romulo
+ */
+public class PutRequest extends Request {
+
+ private final String data;
+
+ protected PutRequest(RequestPlan requestPlan, Session session, String URL, String data) {
+ super(requestPlan, session, URL);
+ this.data = data;
+ }
+
+ protected PutRequest(RequestPlan requestPlan, Session session, String URL, String data, String headers) {
+ super(requestPlan, session, URL, headers);
+ this.data = data;
+ }
+
+ protected PutRequest(RequestPlan requestPlan, Session session, String URL, String data, String headers, Collection<String> storeFields) {
+ super(requestPlan, session, URL, headers, storeFields);
+ this.data = data;
+ }
+
+ protected String getData() {
+ return this.data;
+ }
+
+ @Override
+ protected void fireRequest() {
+ HttpURLConnection httpURLConnection = null;
+ try {
+ String stringURL = fillPropertyVariable(getURL());
+ URL url = new URL(stringURL);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ httpURLConnection = connection;
+ connection.setRequestMethod("PUT");
+ headers().forEach(entry -> {
+ String value = fillPropertyVariable(entry.getValue());
+ connection.setRequestProperty(entry.getKey(), value);
+ });
+ if (this.data != null) {
+ connection.setDoOutput(true);
+ try ( OutputStream outputStream = connection.getOutputStream()) {
+ String data = fillPropertyVariable(this.data);
+ outputStream.write(data.getBytes());
+ }
+ } else {
+ connection.setDoOutput(false);
+ }
+ int responseCode = connection.getResponseCode();
+ if (responseCode < 400) {
+ Logger.getGlobal().log(Level.INFO, "{0} on {1} {2}", new Object[]{responseCode, getMethod(), stringURL});
+ List<String> setCookies = connection.getHeaderFields().get("Set-Cookie");
+ storeCookies(setCookies);
+ try ( BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
+ String response = bufferedReader.lines().collect(Collectors.joining());
+ processResponse(response);
+ }
+ } else {
+ Logger.getGlobal().log(Level.SEVERE, "error {0} on {1} {2}", new Object[]{responseCode, getMethod(), stringURL});
+ }
+ log(responseCode);
+ } catch (MalformedURLException ex) {
+ Logger.getGlobal().log(Level.SEVERE, "Malormed URL");
+ } catch (IOException ex) {
+ Logger.getGlobal().log(Level.SEVERE, "IOException");
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ } finally {
+ if (httpURLConnection != null) {
+ httpURLConnection.disconnect();
+ }
+ }
+ }
+}
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
index 733c97f..14fa202 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/RequestPlan.java
@@ -36,18 +36,6 @@ public class RequestPlan {
private String headers;
private String forms;
- private RequestPlan(String URL) {
- this.method = "GET";
- this.URL = URL;
- this.data = null;
- }
-
- private RequestPlan(String URL, String data) {
- this.method = "POST";
- this.URL = URL;
- this.data = data;
- }
-
private RequestPlan(String method, String URL, String data) {
this.method = method;
this.URL = URL;
@@ -55,17 +43,29 @@ public class RequestPlan {
}
public static RequestPlan get(String URL) {
- return new RequestPlan(URL);
+ return new RequestPlan("GET", URL, null);
}
public static RequestPlan post(String URL, String data) {
- return new RequestPlan(URL, data);
+ return new RequestPlan("POST", URL, data);
+ }
+
+ public static RequestPlan put(String URL, String data) {
+ return new RequestPlan("PUT", URL, data);
+ }
+
+ public static RequestPlan put(String URL) {
+ return put(URL, null);
}
public static RequestPlan delete(String URL, String data) {
return new RequestPlan("DELETE", URL, data);
}
+ public static RequestPlan delete(String URL) {
+ return delete(URL, null);
+ }
+
public String getMethod() {
return this.method;
}
@@ -170,7 +170,7 @@ public class RequestPlan {
}
return this.storeFields.stream();
}
-
+
protected Stream<String> storeCookies() {
if (this.storeCookies == null || this.storeCookies.isEmpty()) {
return Stream.empty();
@@ -207,14 +207,6 @@ public class RequestPlan {
String URL = replaceOptionals(this.URL);
HashMap<String, Integer> map = new HashMap<>();
URL = replaceRandoms(URL, map);
- Pattern pattern = Pattern.compile("#\\{(.*?)\\[(.*?)\\](.*?)\\}");
- Matcher originalMatcher = pattern.matcher(this.URL);
- Matcher randomMatcher = pattern.matcher(URL);
- while (originalMatcher.find() & randomMatcher.find()) {
- String originalFound = originalMatcher.group();
- String randomFound = randomMatcher.group();
- URL = URL.replace(randomFound, originalFound);
- }
Collection<String> storeFields = storeFields()
.map(storeField -> replaceRandoms(storeField, map))
.collect(Collectors.toList());
@@ -233,7 +225,13 @@ public class RequestPlan {
if (this.method.equals("GET")) {
return new GetRequest(this, session, URL, headers, storeFields);
}
- String data = replaceOptionals(this.data);
+ String data = null;
+ if (this.data != null) {
+ data = replaceOptionals(this.data);
+ }
+ if (this.method.equals("PUT")) {
+ return new PutRequest(this, session, URL, data, headers, storeFields);
+ }
data = replaceRandoms(data, map);
return new PostRequest(this, session, URL, data, headers, storeFields);
}
@@ -268,7 +266,12 @@ public class RequestPlan {
randomInt = random.nextInt() & Integer.MAX_VALUE;
map.put("$", randomInt);
}
- data = data.replace("$", String.valueOf(randomInt));
+ pattern = Pattern.compile("#\\{(.*?)\\}");
+ String[] split = pattern.split(data);
+ for (String around : split) {
+ String newAround = around.replace("$", String.valueOf(randomInt));
+ data = data.replace(around, newAround);
+ }
return data;
}
@@ -300,6 +303,10 @@ public class RequestPlan {
PostRequest postRequest = (PostRequest) request;
return new PostRequest(this, session, postRequest.getURL(), postRequest.getData(), postRequest.getHeaders(), postRequest.getStoreFields());
}
+ if (request instanceof PutRequest) {
+ PutRequest putRequest = (PutRequest) request;
+ return new PutRequest(this, session, putRequest.getURL(), putRequest.getData(), putRequest.getHeaders(), putRequest.getStoreFields());
+ }
MultipartRequest multipartRequest = (MultipartRequest) request;
return new MultipartRequest(this, session, multipartRequest.getURL(), multipartRequest.getHeaders(), multipartRequest.getForms(), multipartRequest.getStoreFields());
}