Skip to content

Commit

Permalink
Update doPUT to add boundary to multi-part + add doPatch (#363)
Browse files Browse the repository at this point in the history
* changes v1

* Add boundary to buildParts, update PUT, add PATCH

* formatting

---------

Co-authored-by: zkofiro <[email protected]>
  • Loading branch information
Zakaria-Kofiro and zkofiro authored Jan 16, 2025
1 parent 6bdf6d6 commit f903e1e
Show file tree
Hide file tree
Showing 8 changed files with 133 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,16 @@ public void doPost(BaseResponse response) {

}

/**
* Execute the PATCH.
*/
public void doPatch(BaseResponse response) {
this.response = response;
requestUrl = TankHttpUtil.buildUrl(protocol, host, port, path, urlVariables).toString();
httpclient.doPatch(this);

}

/**
* Set as value in the request
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ public interface TankHttpClient {
*/
public void doPost(BaseRequest request);

/**
* Execute the PATCH.
*
* @param request
*/
public void doPatch(BaseRequest request);

/**
* Adds the authentication
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public void doPost(BaseRequest request) {

}

@Override
public void doPatch(BaseRequest request) {

}

@Override
public void addAuth(AuthCredentials creds) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,8 @@ public String execute() {
baseRequest.doPost(baseResponse);
} else if (method.equalsIgnoreCase("PUT")) {
baseRequest.doPut(baseResponse);
} else if (method.equalsIgnoreCase("PATCH")) {
baseRequest.doPatch(baseResponse);
} else if (method.equalsIgnoreCase("DELETE")) {
baseRequest.doDelete(baseResponse);
} else if (method.equalsIgnoreCase("OPTIONS")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@ public void doOptions(BaseRequest request) {
public void doPost(BaseRequest request) {
}

/* (non-Javadoc)
* @see com.intuit.tank.http.TankHttpClient#doPatch(com.intuit.tank.http.BaseRequest)
*/
@Override
public void doPatch(BaseRequest request) {
}

/* (non-Javadoc)
* @see com.intuit.tank.http.TankHttpClient#addAuth(com.intuit.tank.http.AuthCredentials)
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.*;
Expand Down Expand Up @@ -110,17 +111,28 @@ public void doGet(BaseRequest request) {
public void doPut(BaseRequest request) {
try {
PutMethod httpput = new PutMethod(request.getRequestUrl());
// Multiple calls can be expensive, so get it once
String requestBody = request.getBody();
StringRequestEntity entity = new StringRequestEntity(requestBody, request.getContentType(), request.getContentTypeCharSet());
httpput.addRequestHeader(HttpHeaders.CONTENT_TYPE, request.getContentType());
RequestEntity entity;
if (request.getContentType().toLowerCase().startsWith(BaseRequest.CONTENT_TYPE_MULTIPART)) {
List<Part> parts = buildParts(request);
String boundary = generateBoundary();
entity = new MultipartRequestEntity(parts.toArray(new Part[0]), httpput.getParams());
httpput.addRequestHeader(HttpHeaders.CONTENT_TYPE, "multipart/form-data; boundary=" + boundary);
} else {
entity = new StringRequestEntity(requestBody, request.getContentType(), request.getContentTypeCharSet());
httpput.addRequestHeader(HttpHeaders.CONTENT_TYPE, request.getContentType());
}
httpput.setRequestEntity(entity);
sendRequest(request, httpput, requestBody);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}

private String generateBoundary() {
return "----WebKitFormBoundary" + new BigInteger(128, new Random()).toString(16);
}

/**
*
*/
Expand Down Expand Up @@ -182,11 +194,12 @@ public void doPost(BaseRequest request) {
try {
PostMethod httppost = new PostMethod(request.getRequestUrl());
String requestBody = request.getBody();
RequestEntity entity = null;
RequestEntity entity;
if (request.getContentType().toLowerCase().startsWith(BaseRequest.CONTENT_TYPE_MULTIPART)) {
List<Part> parts = buildParts(request);

String boundary = generateBoundary();
entity = new MultipartRequestEntity(parts.toArray(new Part[0]), httppost.getParams());
httppost.addRequestHeader(HttpHeaders.CONTENT_TYPE, "multipart/form-data; boundary=" + boundary);
} else {
entity = new StringRequestEntity(requestBody, request.getContentType(), request.getContentTypeCharSet());
httppost.addRequestHeader(HttpHeaders.CONTENT_TYPE, request.getContentType());
Expand All @@ -198,6 +211,18 @@ public void doPost(BaseRequest request) {
}
}

/*
* (non-Javadoc)
*
* @see
* com.intuit.tank.httpclient3.TankHttpClient#doPatch(com.intuit.tank.http.
* BaseRequest)
*/
@Override
public void doPatch(BaseRequest request) {
doGet(request);
}

/*
* (non-Javadoc)
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,7 @@
import org.apache.http.client.UserTokenHandler;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpOptions;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.*;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.cookie.ClientCookie;
Expand Down Expand Up @@ -148,10 +142,14 @@ public void doGet(BaseRequest request) {
@Override
public void doPut(BaseRequest request) {
HttpPut httpput = new HttpPut(request.getRequestUrl());
// Multiple calls can be expensive, so get it once
String requestBody = request.getBody();
HttpEntity entity = new StringEntity(requestBody, ContentType.create(request.getContentType(), request.getContentTypeCharSet()));
httpput.setHeader(HttpHeaders.CONTENT_TYPE, request.getContentType());
HttpEntity entity = null;
if (request.getContentType().toLowerCase().startsWith(BaseRequest.CONTENT_TYPE_MULTIPART)) {
entity = buildParts(request);
} else {
entity = new StringEntity(requestBody, ContentType.create(request.getContentType(), request.getContentTypeCharSet()));
httpput.setHeader(HttpHeaders.CONTENT_TYPE, request.getContentType());
}
httpput.setEntity(entity);
sendRequest(request, httpput, requestBody);
}
Expand Down Expand Up @@ -216,6 +214,28 @@ public void doPost(BaseRequest request) {
sendRequest(request, httppost, requestBody);
}

/*
* (non-Javadoc)
*
* @see
* com.intuit.tank.httpclient3.TankHttpClient#doPatch(com.intuit.tank.http.
* BaseRequest)
*/
@Override
public void doPatch(BaseRequest request) {
HttpPatch httpPatch = new HttpPatch(request.getRequestUrl());
String requestBody = request.getBody();
HttpEntity entity = null;
if (request.getContentType().toLowerCase().startsWith(BaseRequest.CONTENT_TYPE_MULTIPART)) {
entity = buildParts(request);
} else {
entity = new StringEntity(requestBody, ContentType.create(request.getContentType(), request.getContentTypeCharSet()));
httpPatch.setHeader(HttpHeaders.CONTENT_TYPE, request.getContentType());
}
httpPatch.setEntity(entity);
sendRequest(request, httpPatch, requestBody);
}

/*
* (non-Javadoc)
*
Expand Down Expand Up @@ -433,19 +453,19 @@ private void setHeaders(BaseRequest request, HttpRequestBase method, HashMap<Str

private HttpEntity buildParts(BaseRequest request) {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
String contentType = request.getContentType();
String boundary = contentType.substring(contentType.indexOf("boundary=") + 9);
builder.setBoundary(boundary);

for (PartHolder h : TankHttpUtil.getPartsFromBody(request)) {
ContentType partContentType = h.isContentTypeSet()
? ContentType.create(h.getContentType())
: ContentType.DEFAULT_BINARY;

if (h.getFileName() == null) {
if (h.isContentTypeSet()) {
builder.addTextBody(h.getPartName(), h.getBodyAsString(), ContentType.create(h.getContentType()));
} else {
builder.addTextBody(h.getPartName(), h.getBodyAsString());
}
builder.addTextBody(h.getPartName(), h.getBodyAsString(), partContentType);
} else {
if (h.isContentTypeSet()) {
builder.addBinaryBody(h.getPartName(), h.getBody(), ContentType.create(h.getContentType()), h.getFileName());
} else {
builder.addBinaryBody(h.getFileName(), h.getBody());
}
builder.addBinaryBody(h.getPartName(), h.getBody(), partContentType, h.getFileName());
}
}
return builder.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,15 @@ public void doGet(BaseRequest request) {
@Override
public void doPut(BaseRequest request) {
String requestBody = request.getBody();
HttpRequest.Builder httpput = HttpRequest.newBuilder(URI.create(request.getRequestUrl()))
.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.header("Content-Type", request.getContentType());
HttpRequest.Builder httpput = HttpRequest.newBuilder(URI.create(request.getRequestUrl()));
if (request.getContentType().toLowerCase().startsWith(BaseRequest.CONTENT_TYPE_MULTIPART)) {
String boundary = new BigInteger(256, new Random()).toString();
httpput.PUT(ofMimeMultipartData(request, boundary))
.header("Content-Type", "multipart/form-data;boundary=" + boundary);
} else {
httpput.PUT(HttpRequest.BodyPublishers.ofString(requestBody))
.header("Content-Type", request.getContentType());
}
request.getHeaderInformation().forEach(httpput::header);
sendRequest(request, httpput.build(), requestBody);
}
Expand Down Expand Up @@ -159,6 +165,29 @@ public void doPost(BaseRequest request) {
sendRequest(request, httppost.build(), requestBody);
}

/*
* (non-Javadoc)
*
* @see
* com.intuit.tank.httpclient3.TankHttpClient#doPatch(com.intuit.tank.http.
* BaseRequest)
*/
@Override
public void doPatch(BaseRequest request) {
String requestBody = request.getBody();
HttpRequest.Builder httpPatch = HttpRequest.newBuilder(URI.create(request.getRequestUrl()));
if (request.getContentType().toLowerCase().startsWith(BaseRequest.CONTENT_TYPE_MULTIPART)) {
String boundary = new BigInteger(256, new Random()).toString();
httpPatch.method("PATCH", ofMimeMultipartData(request, boundary))
.header("Content-Type", "multipart/form-data;boundary=" + boundary);
} else {
httpPatch.method("PATCH", HttpRequest.BodyPublishers.ofString(requestBody))
.header("Content-Type", request.getContentType());
}
request.getHeaderInformation().forEach(httpPatch::header);
sendRequest(request, httpPatch.build(), requestBody);
}

/*
* (non-Javadoc)
*
Expand Down

0 comments on commit f903e1e

Please sign in to comment.