MultipartRequest.java

97 lines | 3.655 kB Blame History Raw Download
/*
 * 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.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;

/**
 *
 * @author romulo
 */
public class MultipartRequest extends Request {

    private final String forms;

    protected MultipartRequest(RequestPlan requestPlan, Session session, String URL, String forms) {
        super(requestPlan, session, URL);
        this.forms = forms;
    }

    protected MultipartRequest(RequestPlan requestPlan, Session session, String URL, String headers, String forms) {
        super(requestPlan, session, URL, headers);
        this.forms = forms;
    }

    protected String getForms() {
        return this.forms;
    }

    public void forEachForm(BiConsumer<? super String, ? super String> forEach) {
        Map<String, String> forms = new HashMap<>();
        if (this.forms != null) {
            String[] formsPairs = this.forms.split("; ");
            for (String formPair : formsPairs) {
                String[] pair = formPair.split(": ");
                forms.put(pair[0], pair[1]);
            }
        }
        forms.forEach(forEach);
    }

    @Override
    public void fire() {
        try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
            HttpPost httpPost = new HttpPost(getURL());
            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
            forEachForm((key, value) -> {
                if (key.equals("file")) {
                    File file = new File(value);
                    multipartEntityBuilder.addBinaryBody(key, file);
                } else {
                    multipartEntityBuilder.addTextBody(key, value);
                }
            });
            HttpEntity httpEntity = multipartEntityBuilder.build();
            httpPost.setEntity(httpEntity);
            forEachHeader((key, value) -> {
                value = fillPropertyVariable(value);
                httpPost.setHeader(key, value);
            });
            try (CloseableHttpResponse closeableHttpResponse = httpClient.execute(httpPost)) {
                int responseCode = closeableHttpResponse.getStatusLine().getStatusCode();
                if (responseCode < 400) {
                    Logger.getGlobal().log(Level.INFO, "{0} {1}", new Object[]{getMethod(), getURL()});
                    try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(closeableHttpResponse.getEntity().getContent()))) {
                        String response = bufferedReader.lines().collect(Collectors.joining());
                        processResponse(response);
                    }
                } else {
                    Logger.getGlobal().log(Level.SEVERE, "error {0} on {1} {2}", new Object[]{responseCode, getMethod(), getURL()});
                }
            }
        } catch (IOException e) {
            Logger.getGlobal().log(Level.SEVERE, "IOException");
        }
    }

}