Example usage for com.squareup.okhttp MultipartBuilder addPart

List of usage examples for com.squareup.okhttp MultipartBuilder addPart

Introduction

In this page you can find the example usage for com.squareup.okhttp MultipartBuilder addPart.

Prototype

public MultipartBuilder addPart(Headers headers, RequestBody body) 

Source Link

Document

Add a part to the body.

Usage

From source file:abtlibrary.utils.as24ApiClient.ApiClient.java

License:Apache License

/**
 * Build a multipart (file uploading) request body with the given form parameters,
 * which could contain text fields and file fields.
 *
 * @param formParams Form parameters in the form of Map
 * @return RequestBody//from   w w  w  .ja  v a2  s  . c o  m
 */
public RequestBody buildRequestBodyMultipart(Map<String, Object> formParams) {
    MultipartBuilder mpBuilder = new MultipartBuilder().type(MultipartBuilder.FORM);
    for (Entry<String, Object> param : formParams.entrySet()) {
        if (param.getValue() instanceof File) {
            File file = (File) param.getValue();
            Headers partHeaders = Headers.of("Content-Disposition",
                    "form-data; name=\"" + param.getKey() + "\"; filename=\"" + file.getName() + "\"");
            MediaType mediaType = MediaType.parse(guessContentTypeFromFile(file));
            mpBuilder.addPart(partHeaders, RequestBody.create(mediaType, file));
        } else {
            Headers partHeaders = Headers.of("Content-Disposition",
                    "form-data; name=\"" + param.getKey() + "\"");
            mpBuilder.addPart(partHeaders, RequestBody.create(null, parameterToString(param.getValue())));
        }
    }
    return mpBuilder.build();
}

From source file:cn.wochu.wh.net.OkHttpClientManager.java

License:Apache License

private Request buildMultipartFormRequest(String url, File[] files, String[] fileKeys, Param[] params) {
    params = validateParam(params);/*from   w  w w .  jav  a  2s.c o m*/

    MultipartBuilder builder = new MultipartBuilder().type(MultipartBuilder.FORM);

    for (Param param : params) {
        builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + param.key + "\""),
                RequestBody.create(null, param.value));
    }
    if (files != null) {
        RequestBody fileBody = null;
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            String fileName = file.getName();
            fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
            //TODO ???contentType
            builder.addPart(
                    Headers.of("Content-Disposition",
                            "form-data; name=\"" + fileKeys[i] + "\"; filename=\"" + fileName + "\""),
                    fileBody);
        }
    }

    RequestBody requestBody = builder.build();
    return new Request.Builder().url(url).post(requestBody).build();
}

From source file:com.facebook.react.modules.network.NetworkingModule.java

License:Open Source License

private @Nullable MultipartBuilder constructMultipartBody(ReadableArray body, String contentType,
        Callback callback) {/*from   ww w  .j  a  v a 2s .c  o  m*/
    MultipartBuilder multipartBuilder = new MultipartBuilder();
    multipartBuilder.type(MediaType.parse(contentType));

    for (int i = 0, size = body.size(); i < size; i++) {
        ReadableMap bodyPart = body.getMap(i);

        // Determine part's content type.
        ReadableArray headersArray = bodyPart.getArray("headers");
        Headers headers = extractHeaders(headersArray, null);
        if (headers == null) {
            callback.invoke(0, null, "Missing or invalid header format for FormData part.");
            return null;
        }
        MediaType partContentType = null;
        String partContentTypeStr = headers.get(CONTENT_TYPE_HEADER_NAME);
        if (partContentTypeStr != null) {
            partContentType = MediaType.parse(partContentTypeStr);
            // Remove the content-type header because MultipartBuilder gets it explicitly as an
            // argument and doesn't expect it in the headers array.
            headers = headers.newBuilder().removeAll(CONTENT_TYPE_HEADER_NAME).build();
        }

        if (bodyPart.hasKey(REQUEST_BODY_KEY_STRING)) {
            String bodyValue = bodyPart.getString(REQUEST_BODY_KEY_STRING);
            multipartBuilder.addPart(headers, RequestBody.create(partContentType, bodyValue));
        } else if (bodyPart.hasKey(REQUEST_BODY_KEY_URI)) {
            if (partContentType == null) {
                callback.invoke(0, null, "Binary FormData part needs a content-type header.");
                return null;
            }
            String fileContentUriStr = bodyPart.getString(REQUEST_BODY_KEY_URI);
            InputStream fileInputStream = RequestBodyUtil.getFileInputStream(getReactApplicationContext(),
                    fileContentUriStr);
            if (fileInputStream == null) {
                callback.invoke(0, null, "Could not retrieve file for uri " + fileContentUriStr);
                return null;
            }
            multipartBuilder.addPart(headers, RequestBodyUtil.create(partContentType, fileInputStream));
        } else {
            callback.invoke(0, null, "Unrecognized FormData part.");
        }
    }
    return multipartBuilder;
}

From source file:com.facebook.react.modules.network.NetworkingModuleTest.java

License:Open Source License

@Test
public void testMultipartPostRequestBody() throws Exception {
    InputStream inputStream = mock(InputStream.class);
    PowerMockito.mockStatic(RequestBodyUtil.class);
    when(RequestBodyUtil.getFileInputStream(any(ReactContext.class), any(String.class)))
            .thenReturn(inputStream);/*from   w  ww. j av  a  2s .  co  m*/
    when(RequestBodyUtil.create(any(MediaType.class), any(InputStream.class))).thenCallRealMethod();
    when(inputStream.available()).thenReturn("imageUri".length());

    final MultipartBuilder multipartBuilder = mock(MultipartBuilder.class);
    PowerMockito.whenNew(MultipartBuilder.class).withNoArguments().thenReturn(multipartBuilder);
    when(multipartBuilder.type(any(MediaType.class))).thenAnswer(new Answer<Object>() {
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            return multipartBuilder;
        }
    });
    when(multipartBuilder.addPart(any(Headers.class), any(RequestBody.class))).thenAnswer(new Answer<Object>() {
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            return multipartBuilder;
        }
    });
    when(multipartBuilder.build()).thenAnswer(new Answer<Object>() {
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            return mock(RequestBody.class);
        }
    });

    List<JavaOnlyArray> headers = Arrays.asList(JavaOnlyArray.of("content-type", "multipart/form-data"));

    JavaOnlyMap body = new JavaOnlyMap();
    JavaOnlyArray formData = new JavaOnlyArray();
    body.putArray("formData", formData);

    JavaOnlyMap bodyPart = new JavaOnlyMap();
    bodyPart.putString("string", "locale");
    bodyPart.putArray("headers",
            JavaOnlyArray.from(Arrays.asList(JavaOnlyArray.of("content-disposition", "user"))));
    formData.pushMap(bodyPart);

    JavaOnlyMap imageBodyPart = new JavaOnlyMap();
    imageBodyPart.putString("uri", "imageUri");
    imageBodyPart.putArray("headers",
            JavaOnlyArray.from(Arrays.asList(JavaOnlyArray.of("content-type", "image/jpg"),
                    JavaOnlyArray.of("content-disposition", "filename=photo.jpg"))));
    formData.pushMap(imageBodyPart);

    OkHttpClient httpClient = mock(OkHttpClient.class);
    when(httpClient.newCall(any(Request.class))).thenAnswer(new Answer<Object>() {
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            Call callMock = mock(Call.class);
            return callMock;
        }
    });

    NetworkingModule networkingModule = new NetworkingModule(null, "", httpClient);
    networkingModule.sendRequest(mock(ExecutorToken.class), "POST", "http://someurl/uploadFoo", 0,
            JavaOnlyArray.from(headers), body, true, 0);

    // verify RequestBodyPart for image
    PowerMockito.verifyStatic(times(1));
    RequestBodyUtil.getFileInputStream(any(ReactContext.class), eq("imageUri"));
    PowerMockito.verifyStatic(times(1));
    RequestBodyUtil.create(MediaType.parse("image/jpg"), inputStream);

    // verify body
    verify(multipartBuilder).build();
    verify(multipartBuilder).type(MultipartBuilder.FORM);
    ArgumentCaptor<Headers> headersArgumentCaptor = ArgumentCaptor.forClass(Headers.class);
    ArgumentCaptor<RequestBody> bodyArgumentCaptor = ArgumentCaptor.forClass(RequestBody.class);
    verify(multipartBuilder, times(2)).addPart(headersArgumentCaptor.capture(), bodyArgumentCaptor.capture());

    List<Headers> bodyHeaders = headersArgumentCaptor.getAllValues();
    assertThat(bodyHeaders.size()).isEqualTo(2);
    List<RequestBody> bodyRequestBody = bodyArgumentCaptor.getAllValues();
    assertThat(bodyRequestBody.size()).isEqualTo(2);

    assertThat(bodyHeaders.get(0).get("content-disposition")).isEqualTo("user");
    assertThat(bodyRequestBody.get(0).contentType()).isNull();
    assertThat(bodyRequestBody.get(0).contentLength()).isEqualTo("locale".getBytes().length);
    assertThat(bodyHeaders.get(1).get("content-disposition")).isEqualTo("filename=photo.jpg");
    assertThat(bodyRequestBody.get(1).contentType()).isEqualTo(MediaType.parse("image/jpg"));
    assertThat(bodyRequestBody.get(1).contentLength()).isEqualTo("imageUri".getBytes().length);
}

From source file:com.hippo.nimingban.client.ac.ACEngine.java

License:Apache License

public static Call prepareReply(OkHttpClient okHttpClient, ACReplyStruct struct) throws Exception {
    MultipartBuilder builder = new MultipartBuilder();
    builder.type(MultipartBuilder.FORM);
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"name\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.name)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"email\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.email)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"title\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.title)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"content\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.content)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"resto\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.resto)));
    if (struct.water) {
        builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"water\""),
                RequestBody.create(null, "true"));
    }//  w w w  .j  a v  a2s  .c  o m
    InputStreamPipe isPipe = struct.image;

    if (isPipe != null) {
        String filename;
        MediaType mediaType;
        byte[] bytes;
        File file = compressBitmap(isPipe, struct.imageType);
        if (file == null) {
            String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(struct.imageType);
            if (TextUtils.isEmpty(extension)) {
                extension = "jpg";
            }
            filename = "a." + extension;

            mediaType = MediaType.parse(struct.imageType);
            if (mediaType == null) {
                mediaType = MEDIA_TYPE_IMAGE_ALL;
            }

            try {
                isPipe.obtain();
                bytes = IOUtils.getAllByte(isPipe.open());
            } finally {
                isPipe.close();
                isPipe.release();
            }
        } else {
            filename = "a.jpg";
            mediaType = MEDIA_TYPE_IMAGE_JPEG;

            InputStream is = null;
            try {
                is = new FileInputStream(file);
                bytes = IOUtils.getAllByte(is);
            } finally {
                IOUtils.closeQuietly(is);
                file.delete();
            }
        }
        builder.addPart(
                Headers.of("Content-Disposition", "form-data; name=\"image\"; filename=\"" + filename + "\""),
                RequestBody.create(mediaType, bytes));
    }

    String url = ACUrl.API_REPLY;
    Log.d(TAG, url);
    Request request = new GoodRequestBuilder(url).post(builder.build()).build();
    return okHttpClient.newCall(request);
}

From source file:com.hippo.nimingban.client.ac.ACEngine.java

License:Apache License

public static Call prepareCreatePost(OkHttpClient okHttpClient, ACPostStruct struct) throws Exception {
    MultipartBuilder builder = new MultipartBuilder();
    builder.type(MultipartBuilder.FORM);
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"name\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.name)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"email\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.email)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"title\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.title)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"content\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.content)));
    builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"fid\""),
            RequestBody.create(null, StringUtils.avoidNull(struct.fid)));
    if (struct.water) {
        builder.addPart(Headers.of("Content-Disposition", "form-data; name=\"water\""),
                RequestBody.create(null, "true"));
    }/*from w  w w .  j  a  v a  2s  .c  om*/
    InputStreamPipe isPipe = struct.image;

    if (isPipe != null) {
        String filename;
        MediaType mediaType;
        byte[] bytes;
        File file = compressBitmap(isPipe, struct.imageType);
        if (file == null) {
            String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(struct.imageType);
            if (TextUtils.isEmpty(extension)) {
                extension = "jpg";
            }
            filename = "a." + extension;

            mediaType = MediaType.parse(struct.imageType);
            if (mediaType == null) {
                mediaType = MEDIA_TYPE_IMAGE_ALL;
            }

            try {
                isPipe.obtain();
                bytes = IOUtils.getAllByte(isPipe.open());
            } finally {
                isPipe.close();
                isPipe.release();
            }
        } else {
            filename = "a.jpg";
            mediaType = MEDIA_TYPE_IMAGE_JPEG;

            InputStream is = null;
            try {
                is = new FileInputStream(file);
                bytes = IOUtils.getAllByte(is);
            } finally {
                IOUtils.closeQuietly(is);
                file.delete();
            }
        }
        builder.addPart(
                Headers.of("Content-Disposition", "form-data; name=\"image\"; filename=\"" + filename + "\""),
                RequestBody.create(mediaType, bytes));
    }

    String url = ACUrl.API_CREATE_POST;
    Log.d(TAG, url);
    Request request = new GoodRequestBuilder(url).post(builder.build()).build();
    return okHttpClient.newCall(request);
}

From source file:com.hkm.root.Tasks.upload_data.java

License:Open Source License

public void OCokHttpUpload(ArrayList<Uri> img_list, final String endpoint, final MediaType typ)
        throws IOException, Exception {
    // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
    MultipartBuilder mb = new MultipartBuilder();
    mb.type(MultipartBuilder.FORM);//from   w  w w  .java 2  s.  c o  m
    for (Uri i : img_list) {
        final File file_location = i.toString().startsWith("file:")
                ? new File(i.toString().replace("file:///", ""))
                : new File(Tool.getRealPathFromURI(ac, i));
        final RequestBody content_data = RequestBody.create(typ, file_location);
        final String disposition = String.format(Locale.getDefault(), "form-data; name=\"%s\"; filename=\"%s\"",
                "target-" + post_target, file_location.getName());
        final String disposition_alt = String.format(Locale.getDefault(), "file; filename=\"%s\"",
                file_location.getName());
        mb.addPart(Headers.of("Content-Disposition", disposition_alt, "Content-Transfer-Encoding", "binary"),
                content_data);
    }

    RequestBody requestBody = mb.build();
    Request requestBuild = new Request.Builder().url(endpoint + "?pid=" + job_id + "&target=" + post_target)
            .post(requestBody).tag("post_image").build();
    execute_upload(requestBuild);
}

From source file:org.sonarqube.ws.client.HttpConnector.java

License:Open Source License

private WsResponse post(PostRequest postRequest) {
    HttpUrl.Builder urlBuilder = prepareUrlBuilder(postRequest);
    Request.Builder okRequestBuilder = prepareOkRequestBuilder(postRequest, urlBuilder);

    Map<String, PostRequest.Part> parts = postRequest.getParts();
    if (parts.isEmpty()) {
        okRequestBuilder.post(RequestBody.create(null, ""));
    } else {//from  w  ww.ja v  a2  s . co  m
        MultipartBuilder body = new MultipartBuilder().type(MultipartBuilder.FORM);
        for (Map.Entry<String, PostRequest.Part> param : parts.entrySet()) {
            PostRequest.Part part = param.getValue();
            body.addPart(Headers.of("Content-Disposition", format("form-data; name=\"%s\"", param.getKey())),
                    RequestBody.create(MediaType.parse(part.getMediaType()), part.getFile()));
        }
        okRequestBuilder.post(body.build());
    }

    return doCall(okRequestBuilder.build());
}

From source file:org.tinymediamanager.ui.dialogs.BugReportDialog.java

License:Apache License

private void sendBugReport() throws Exception {
    OkHttpClient client = TmmHttpClient.getHttpClient();
    String url = "https://script.google.com/macros/s/AKfycbzrhTmZiHJb1bdCqyeiVOqLup8zK4Dbx6kAtHYsgzBVqHTaNJqj/exec";

    StringBuilder message = new StringBuilder("Bug report from ");
    message.append(tfName.getText());/*from w  w w  . ja v a 2  s .co  m*/
    message.append("\nEmail:");
    message.append(tfEmail.getText());
    message.append("\n");
    message.append("\nis Donator?: ");
    message.append(Globals.isDonator());
    message.append("\nVersion: ");
    message.append(ReleaseInfo.getRealVersion());
    message.append("\nBuild: ");
    message.append(ReleaseInfo.getRealBuildDate());
    message.append("\nOS: ");
    message.append(System.getProperty("os.name"));
    message.append(" ");
    message.append(System.getProperty("os.version"));
    message.append("\nJDK: ");
    message.append(System.getProperty("java.version"));
    message.append(" ");
    message.append(System.getProperty("java.vendor"));
    message.append("\nUUID: ");
    message.append(System.getProperty("tmm.uuid"));
    message.append("\n\n");
    message.append(textArea.getText());

    BugReportDialog.this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

    MultipartBuilder multipartBuilder = new MultipartBuilder();
    multipartBuilder.type(MultipartBuilder.FORM);

    multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"message\""),
            RequestBody.create(null, message.toString()));
    multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"sender\""),
            RequestBody.create(null, tfEmail.getText()));

    // attach files
    try {
        // build zip with selected files in it
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(os);

        // attach logs
        File[] logs = new File("logs").listFiles(new FilenameFilter() {
            Pattern logPattern = Pattern.compile("tmm\\.log\\.*");

            @Override
            public boolean accept(File directory, String filename) {
                Matcher matcher = logPattern.matcher(filename);
                if (matcher.find()) {
                    return true;
                }
                return false;
            }
        });
        if (logs != null) {
            for (File logFile : logs) {
                try {
                    FileInputStream in = new FileInputStream(logFile);
                    ZipEntry ze = new ZipEntry(logFile.getName());
                    zos.putNextEntry(ze);

                    IOUtils.copy(in, zos);
                    in.close();
                    zos.closeEntry();
                } catch (Exception e) {
                    LOGGER.warn("unable to attach " + logFile.getName() + ": " + e.getMessage());
                }
            }
        }

        try {
            FileInputStream in = new FileInputStream("launcher.log");
            ZipEntry ze = new ZipEntry("launcher.log");
            zos.putNextEntry(ze);

            IOUtils.copy(in, zos);
            in.close();
            zos.closeEntry();
        } catch (Exception e) {
            LOGGER.warn("unable to attach launcher.log: " + e.getMessage());
        }

        // attach config file
        try {
            ZipEntry ze = new ZipEntry("config.xml");
            zos.putNextEntry(ze);
            FileInputStream in = new FileInputStream(
                    new File(Settings.getInstance().getSettingsFolder(), "config.xml"));

            IOUtils.copy(in, zos);
            in.close();
            zos.closeEntry();
        } catch (Exception e) {
            LOGGER.warn("unable to attach config.xml: " + e.getMessage());
        }

        zos.close();

        byte[] data = os.toByteArray();
        String data_string = Base64.encodeBase64String(data);
        multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"logs\""),
                RequestBody.create(null, data_string));
    } catch (IOException ex) {
        LOGGER.warn("error adding attachments", ex);
    }
    Request request = new Request.Builder().url(url).post(multipartBuilder.build()).build();
    client.newCall(request).execute();
}

From source file:org.tinymediamanager.ui.dialogs.FeedbackDialog.java

License:Apache License

/**
 * Instantiates a new feedback dialog./*from w  w  w.j a  v a2s  .  c  o m*/
 */
public FeedbackDialog() {
    super(BUNDLE.getString("Feedback"), "feedback"); //$NON-NLS-1$
    setBounds(100, 100, 450, 320);

    getContentPane().setLayout(new FormLayout(
            new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("max(400px;min):grow"),
                    FormFactory.RELATED_GAP_COLSPEC, },
            new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC, RowSpec.decode("fill:max(250px;min):grow"),
                    FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                    FormFactory.RELATED_GAP_ROWSPEC, }));

    JPanel panelContent = new JPanel();
    getContentPane().add(panelContent, "2, 2, fill, fill");
    panelContent.setLayout(new FormLayout(
            new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC,
                    FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("default:grow"),
                    FormFactory.RELATED_GAP_COLSPEC, },
            new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                    FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                    FormFactory.PARAGRAPH_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
                    FormFactory.NARROW_LINE_GAP_ROWSPEC, RowSpec.decode("default:grow"), }));

    JLabel lblName = new JLabel(BUNDLE.getString("Feedback.name")); //$NON-NLS-1$
    panelContent.add(lblName, "2, 2, right, default");

    tfName = new JTextField();
    panelContent.add(tfName, "4, 2, fill, default");
    tfName.setColumns(10);

    JLabel lblEmailoptional = new JLabel(BUNDLE.getString("Feedback.email")); //$NON-NLS-1$
    panelContent.add(lblEmailoptional, "2, 4, right, default");

    tfEmail = new JTextField();
    panelContent.add(tfEmail, "4, 4, fill, default");
    tfEmail.setColumns(10);

    // pre-fill dialog
    if (Globals.isDonator()) {
        Properties p = License.decrypt();
        tfEmail.setText(p.getProperty("email"));
        tfName.setText(p.getProperty("user"));
    }

    JLabel lblFeedback = new JLabel(BUNDLE.getString("Feedback.message")); //$NON-NLS-1$
    panelContent.add(lblFeedback, "2, 6, 3, 1");

    JScrollPane scrollPane = new JScrollPane();
    panelContent.add(scrollPane, "2, 8, 3, 1, fill, fill");

    textArea = new JTextArea();
    scrollPane.setViewportView(textArea);
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);

    JPanel panelButtons = new JPanel();
    panelButtons.setLayout(new EqualsLayout(5));
    getContentPane().add(panelButtons, "2, 4, fill, fill");

    JButton btnSend = new JButton(BUNDLE.getString("Feedback")); //$NON-NLS-1$
    btnSend.setIcon(IconManager.APPLY);
    btnSend.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            // check if feedback is provided
            if (StringUtils.isEmpty(textArea.getText())) {
                JOptionPane.showMessageDialog(null, BUNDLE.getString("Feedback.message.empty")); //$NON-NLS-1$
                return;
            }

            // send feedback
            OkHttpClient client = TmmHttpClient.getHttpClient();
            String url = "https://script.google.com/macros/s/AKfycbxTIhI58gwy0UJ0Z1CdmZDdHlwBDU_vugBmQxcKN9aug4nfgrgZ/exec";

            try {
                StringBuilder message = new StringBuilder("Feedback from ");
                message.append(tfName.getText());
                message.append("\nEmail:");
                message.append(tfEmail.getText());
                message.append("\n");
                message.append("\nis Donator?: ");
                message.append(Globals.isDonator());
                message.append("\nVersion: ");
                message.append(ReleaseInfo.getRealVersion());
                message.append("\nBuild: ");
                message.append(ReleaseInfo.getRealBuildDate());
                message.append("\nOS: ");
                message.append(System.getProperty("os.name"));
                message.append(" ");
                message.append(System.getProperty("os.version"));
                message.append("\nJDK: ");
                message.append(System.getProperty("java.version"));
                message.append(" ");
                message.append(System.getProperty("java.vendor"));
                message.append("\nUUID: ");
                message.append(System.getProperty("tmm.uuid"));
                message.append("\n\n");
                message.append(textArea.getText());

                MultipartBuilder multipartBuilder = new MultipartBuilder();
                multipartBuilder.type(MultipartBuilder.FORM);

                multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"message\""),
                        RequestBody.create(null, message.toString()));
                multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"sender\""),
                        RequestBody.create(null, tfEmail.getText()));

                Request request = new Request.Builder().url(url).post(multipartBuilder.build()).build();
                client.newCall(request).execute();
            } catch (IOException e) {
                LOGGER.error("failed sending feedback: " + e.getMessage());
                JOptionPane.showMessageDialog(null,
                        BUNDLE.getString("Feedback.send.error") + "\n" + e.getMessage()); //$NON-NLS-1$
                return;
            }

            JOptionPane.showMessageDialog(null, BUNDLE.getString("Feedback.send.ok")); //$NON-NLS-1$
            setVisible(false);
        }
    });
    panelButtons.add(btnSend);

    JButton btnCacnel = new JButton(BUNDLE.getString("Button.cancel")); //$NON-NLS-1$
    btnCacnel.setIcon(IconManager.CANCEL);
    btnCacnel.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            setVisible(false);
        }
    });
    panelButtons.add(btnCacnel);
}