Skip to content

Commit 005bbd3

Browse files
committed
Add override PATCH conformance proof
1 parent f23b8cf commit 005bbd3

3 files changed

Lines changed: 119 additions & 5 deletions

File tree

example/build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,9 @@ tasks.register('api2DevdockTusRelativeLocationResolution', JavaExec) {
7777
mainClass = 'io.tus.java.example.Api2DevdockTusRelativeLocationResolution'
7878
workingDir = rootProject.projectDir
7979
}
80+
81+
tasks.register('api2DevdockTusOverridePatchMethod', JavaExec) {
82+
classpath = sourceSets.main.runtimeClasspath
83+
mainClass = 'io.tus.java.example.Api2DevdockTusOverridePatchMethod'
84+
workingDir = rootProject.projectDir
85+
}

example/src/main/java/io/tus/java/example/Api2DevdockTusConformanceServer.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ final class Api2DevdockTusConformanceServer implements AutoCloseable {
2222
private final List<JSONObject> requests;
2323
private final HttpServer server;
2424
private final List<String> errors;
25+
private final List<JSONObject> requestHeaders;
2526
private final List<String> requestMethods;
2627
private final List<String> requestUrls;
2728
private int nextRequestIndex;
@@ -35,6 +36,7 @@ final class Api2DevdockTusConformanceServer implements AutoCloseable {
3536
requests.add(requestArray.getJSONObject(index));
3637
}
3738
this.errors = new ArrayList<String>();
39+
this.requestHeaders = new ArrayList<JSONObject>();
3840
this.requestMethods = new ArrayList<String>();
3941
this.requestUrls = new ArrayList<String>();
4042
this.server = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0);
@@ -51,6 +53,10 @@ URL endpointUrl() throws IOException {
5153
return localUrl(endpointOrigin.toString());
5254
}
5355

56+
URL localUrlFor(String canonicalUrl) throws IOException {
57+
return localUrl(canonicalUrl);
58+
}
59+
5460
void assertExhausted() {
5561
assertNoErrors();
5662
if (nextRequestIndex == requests.size()) {
@@ -87,6 +93,7 @@ String errorSummary() {
8793

8894
JSONObject result() {
8995
return new JSONObject()
96+
.put("requestHeaders", new JSONArray(requestHeaders))
9097
.put("requestMethods", new JSONArray(requestMethods))
9198
.put("requestUrls", new JSONArray(requestUrls));
9299
}
@@ -156,14 +163,12 @@ private int observeRequest(HttpExchange exchange, byte[] body) throws IOExceptio
156163
+ body.length
157164
);
158165
}
159-
assertHeaders(
160-
requestIndex,
161-
requestPlan.getJSONObject("effectiveHeaders"),
162-
exchange.getRequestHeaders()
163-
);
166+
final JSONObject expectedHeaders = requestPlan.getJSONObject("effectiveHeaders");
167+
assertHeaders(requestIndex, expectedHeaders, exchange.getRequestHeaders());
164168

165169
requestMethods.add(exchange.getRequestMethod());
166170
requestUrls.add(actualUrl);
171+
requestHeaders.add(capturedHeaders(expectedHeaders, exchange.getRequestHeaders()));
167172
nextRequestIndex += 1;
168173

169174
return requestIndex;
@@ -190,6 +195,18 @@ private void assertHeaders(int requestIndex, JSONObject expectedHeaders, Headers
190195
}
191196
}
192197

198+
private JSONObject capturedHeaders(JSONObject expectedHeaders, Headers actualHeaders) {
199+
final JSONObject result = new JSONObject();
200+
for (String name : expectedHeaders.keySet()) {
201+
final String value = actualHeaders.getFirst(name);
202+
if (value != null) {
203+
result.put(name, value);
204+
}
205+
}
206+
207+
return result;
208+
}
209+
193210
private void writeResponse(HttpExchange exchange, JSONObject requestPlan) throws IOException {
194211
final JSONObject responsePlan = requestPlan.getJSONObject("response");
195212
final Headers headers = exchange.getResponseHeaders();
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package io.tus.java.example;
2+
3+
import io.tus.java.client.ProtocolException;
4+
import io.tus.java.client.TusClient;
5+
import io.tus.java.client.TusUpload;
6+
import io.tus.java.client.TusUploader;
7+
import org.json.JSONObject;
8+
9+
import java.io.ByteArrayInputStream;
10+
import java.io.IOException;
11+
import java.net.URL;
12+
13+
public final class Api2DevdockTusOverridePatchMethod {
14+
/**
15+
* Run the API2 devdock TUS PATCH method override example.
16+
*
17+
* @param args ignored
18+
*/
19+
public static void main(String[] args) {
20+
try {
21+
final JSONObject scenario = Api2DevdockScenario.loadScenario();
22+
final JSONObject conformanceScenario = Api2DevdockScenario.conformanceScenario(scenario);
23+
final JSONObject result = uploadWithMethodOverride(conformanceScenario);
24+
Api2DevdockScenario.writeResult(result);
25+
26+
System.out.println(
27+
"Java TUS SDK devdock scenario "
28+
+ scenario.getString("scenarioId")
29+
+ " uploaded to "
30+
+ result.getString("uploadUrl")
31+
);
32+
} catch (Exception e) {
33+
e.printStackTrace();
34+
System.exit(1);
35+
}
36+
}
37+
38+
private static JSONObject uploadWithMethodOverride(JSONObject conformanceScenario)
39+
throws IOException, ProtocolException {
40+
final byte[] content = Api2DevdockScenario.conformanceInputSourceBytes(conformanceScenario);
41+
final URL endpointUrl = new URL(
42+
Api2DevdockScenario.conformanceInputStringOption(
43+
conformanceScenario,
44+
"endpointUrl"
45+
)
46+
);
47+
final String uploadUrl = Api2DevdockScenario.conformanceInputStringOption(
48+
conformanceScenario,
49+
"uploadUrl"
50+
);
51+
52+
try (Api2DevdockTusConformanceServer conformanceServer =
53+
new Api2DevdockTusConformanceServer(conformanceScenario, endpointUrl)) {
54+
final TusClient client = new TusClient();
55+
56+
final TusUpload upload = new TusUpload();
57+
upload.setInputStream(new ByteArrayInputStream(content));
58+
upload.setSize(content.length);
59+
60+
final TusUploader uploader = client.beginOrResumeUploadFromURL(
61+
upload,
62+
conformanceServer.localUrlFor(uploadUrl)
63+
);
64+
uploader.setChunkSize(content.length);
65+
try {
66+
int uploadedChunkSize;
67+
do {
68+
uploadedChunkSize = uploader.uploadChunk();
69+
} while (uploadedChunkSize > -1);
70+
uploader.finish();
71+
} catch (IOException | ProtocolException error) {
72+
throw new IOException(
73+
"PATCH method override conformance failed: "
74+
+ conformanceServer.errorSummary(),
75+
error
76+
);
77+
}
78+
79+
conformanceServer.assertExhausted();
80+
return conformanceServer.result()
81+
.put(
82+
"uploadUrl",
83+
conformanceServer.canonicalUrl(uploader.getUploadURL().toString())
84+
);
85+
}
86+
}
87+
88+
private Api2DevdockTusOverridePatchMethod() {
89+
throw new IllegalStateException("Utility class");
90+
}
91+
}

0 commit comments

Comments
 (0)