requests-simulator

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java
index ff4163b..ce1a787 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/GetRequest.java
@@ -32,9 +32,11 @@ public class GetRequest extends Request {
 
     @Override
     public void fire() {
+        HttpURLConnection httpURLConnection = null;
         try {
             URL url = new URL(getURL());
             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            httpURLConnection = connection;
             connection.setRequestMethod("GET");
             forEachHeader((key, value) -> {
                 value = fillPropertyVariable(value);
@@ -50,11 +52,16 @@ public class GetRequest extends Request {
             } else {
                 Logger.getGlobal().log(Level.SEVERE, "error {0} on {1} {2}", new Object[]{responseCode, getMethod(), getURL()});
             }
-            connection.disconnect();
         } 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/MultipartRequest.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/MultipartRequest.java
index 907d7ad..0118c71 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/MultipartRequest.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/MultipartRequest.java
@@ -90,6 +90,8 @@ public class MultipartRequest extends Request {
             }
         } catch (IOException e) {
             Logger.getGlobal().log(Level.SEVERE, "IOException");
+        } catch (Exception ex) {
+            ex.printStackTrace();
         }
     }
 }
diff --git a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PostRequest.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PostRequest.java
index d3c1f4a..2af7b03 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PostRequest.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/PostRequest.java
@@ -30,7 +30,7 @@ public class PostRequest extends Request {
         this.data = data;
     }
 
-    protected PostRequest(RequestPlan requestPlan, Session session, String URL, String headers, String data) {
+    protected PostRequest(RequestPlan requestPlan, Session session, String URL, String data, String headers) {
         super(requestPlan, session, URL, headers);
         this.data = data;
     }
@@ -41,18 +41,20 @@ public class PostRequest extends Request {
 
     @Override
     public void fire() {
+        HttpURLConnection httpURLConnection = null;
         try {
             URL url = new URL(getURL());
             HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            httpURLConnection = connection;
             connection.setRequestMethod("POST");
-            connection.setDoOutput(true);
-            try (OutputStream outputStream = connection.getOutputStream()) {
-                outputStream.write(this.data.getBytes());
-            }
             forEachHeader((key, value) -> {
                 value = fillPropertyVariable(value);
                 connection.setRequestProperty(key, value);
             });
+            connection.setDoOutput(true);
+            try (OutputStream outputStream = connection.getOutputStream()) {
+                outputStream.write(this.data.getBytes());
+            }
             int responseCode = connection.getResponseCode();
             if (responseCode < 400) {
                 Logger.getGlobal().log(Level.INFO, "{0} {1}", new Object[]{getMethod(), getURL()});
@@ -63,11 +65,16 @@ public class PostRequest extends Request {
             } else {
                 Logger.getGlobal().log(Level.SEVERE, "error {0} on {1} {2}", new Object[]{responseCode, getMethod(), getURL()});
             }
-            connection.disconnect();
         } 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/Request.java b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
index 7e32525..38ba8ec 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/requestssimulator/requests/Request.java
@@ -6,6 +6,7 @@
 package br.ufrgs.inf.prosoft.requestssimulator.requests;
 
 import br.ufrgs.inf.prosoft.requestssimulator.Session;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import java.util.HashMap;
@@ -54,11 +55,15 @@ public abstract class Request {
 
     public void forEachHeader(BiConsumer<? super String, ? super String> forEach) {
         Map<String, String> headers = new HashMap<>();
-        if (this.headers != null) {
+        if (this.headers != null && !this.headers.isEmpty()) {
             String[] headerPairs = this.headers.split("; ");
             for (String headerPair : headerPairs) {
                 String[] pair = headerPair.split(": ");
-                headers.put(pair[0], pair[1]);
+                if (pair.length > 1) {
+                    headers.put(pair[0], pair[1]);
+                } else {
+                    Logger.getGlobal().log(Level.SEVERE, "invalid header pair {0}", headerPair);
+                }
             }
         }
         headers.forEach(forEach);
@@ -69,6 +74,13 @@ public abstract class Request {
     }
 
     protected void processResponse(String response) {
+        if (response == null || response.isEmpty()) {
+            Logger.getGlobal().log(Level.SEVERE, "empty response");
+            return;
+        }
+        if (!this.requestPlan.storeFields()) {
+            return;
+        }
         this.requestPlan.forEachStoreField(new Consumer<String>() {
 
             private final JsonParser jsonParser;
@@ -76,12 +88,17 @@ public abstract class Request {
 
             {
                 this.jsonParser = new JsonParser();
-                this.jsonObject = jsonParser.parse(response).getAsJsonObject();
+                this.jsonObject = this.jsonParser.parse(response).getAsJsonObject();
             }
 
             @Override
             public void accept(String storeField) {
-                String storedValue = jsonObject.get(storeField).getAsString();
+                JsonElement jsonElement = this.jsonObject.get(storeField);
+                if (jsonElement == null) {
+                    Logger.getGlobal().log(Level.SEVERE, "field {0} not present", storeField);
+                    return;
+                }
+                String storedValue = jsonElement.getAsString();
                 storeValue(storeField, storedValue);
             }
         });
@@ -111,7 +128,6 @@ public abstract class Request {
     public final JsonObject toJsonObject() {
         JsonObject jsonObject = new JsonObject();
         jsonObject.addProperty("reference", this.requestPlan.getReference());
-        jsonObject.addProperty("method", getMethod());
         jsonObject.addProperty("URL", getURL());
         jsonObject.addProperty("headers", getHeaders());
         if (this instanceof PostRequest) {
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 8609d59..2b37d44 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
@@ -119,6 +119,10 @@ public class RequestPlan {
         return this;
     }
 
+    protected boolean storeFields() {
+        return this.storeFields != null && !this.storeFields.isEmpty();
+    }
+
     protected void forEachStoreField(Consumer<? super String> forEach) {
         this.storeFields.forEach(forEach);
     }
@@ -169,11 +173,11 @@ public class RequestPlan {
 
     public Request bind(Request request, Session session) {
         if (request instanceof GetRequest) {
-            return new GetRequest(this, session, request.getURL());
+            return new GetRequest(this, session, request.getURL(), request.getHeaders());
         }
         if (request instanceof PostRequest) {
             PostRequest postRequest = (PostRequest) request;
-            return new PostRequest(this, session, postRequest.getURL(), postRequest.getHeaders(), postRequest.getData());
+            return new PostRequest(this, session, postRequest.getURL(), postRequest.getData(), postRequest.getHeaders());
         }
         MultipartRequest multipartRequest = (MultipartRequest) request;
         return new MultipartRequest(this, session, multipartRequest.getURL(), multipartRequest.getHeaders(), multipartRequest.getForms());