Skip to content

Commit bdee358

Browse files
committed
Add deferred-length TUS devdock proof
1 parent 61e3e28 commit bdee358

2 files changed

Lines changed: 96 additions & 0 deletions

File tree

example/build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ tasks.register('api2DevdockTusCreationWithUpload', JavaExec) {
2424
workingDir = rootProject.projectDir
2525
}
2626

27+
tasks.register('api2DevdockTusDeferredLengthUpload', JavaExec) {
28+
classpath = sourceSets.main.runtimeClasspath
29+
mainClass = 'io.tus.java.example.Api2DevdockTusDeferredLengthUpload'
30+
workingDir = rootProject.projectDir
31+
}
32+
2733
tasks.register('api2DevdockTusRetryOffsetRecovery', JavaExec) {
2834
classpath = sourceSets.main.runtimeClasspath
2935
mainClass = 'io.tus.java.example.Api2DevdockTusRetryOffsetRecovery'
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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 Api2DevdockTusDeferredLengthUpload {
14+
/**
15+
* Run the API2 devdock TUS deferred-length upload example.
16+
*
17+
* @param args ignored
18+
*/
19+
public static void main(String[] args) {
20+
try {
21+
System.setProperty("http.strictPostRedirect", "true");
22+
23+
final JSONObject scenario = Api2DevdockScenario.loadScenario();
24+
final JSONObject createResponse = Api2DevdockScenario.createResponse(scenario);
25+
final String uploadUrl = uploadWithDeferredLength(scenario, createResponse);
26+
Api2DevdockScenario.writeResult(new JSONObject().put("uploadUrl", uploadUrl));
27+
28+
System.out.println(
29+
"Java TUS SDK devdock scenario "
30+
+ scenario.getString("scenarioId")
31+
+ " uploaded with deferred length to "
32+
+ uploadUrl
33+
);
34+
} catch (Exception e) {
35+
e.printStackTrace();
36+
System.exit(1);
37+
}
38+
}
39+
40+
private static String uploadWithDeferredLength(
41+
JSONObject scenario,
42+
JSONObject createResponse
43+
) throws IOException, ProtocolException {
44+
final JSONObject uploadConfig = scenario.getJSONObject("upload");
45+
final byte[] content = Api2DevdockScenario.scenarioBytes(uploadConfig);
46+
final int chunkSize = Api2DevdockScenario.fixedChunkSizeBytes(uploadConfig);
47+
if (!uploadConfig.getBoolean("uploadLengthDeferred")) {
48+
throw new IllegalStateException(
49+
"deferred-length scenario must set uploadLengthDeferred"
50+
);
51+
}
52+
53+
final TusClient client = new TusClient();
54+
client.setUploadCreationURL(
55+
new URL(Api2DevdockScenario.tusUrl(uploadConfig, scenario, createResponse))
56+
);
57+
58+
final TusUpload upload = new TusUpload();
59+
upload.setInputStream(new ByteArrayInputStream(content));
60+
upload.setSize(content.length);
61+
upload.setFingerprint(scenario.getString("scenarioId") + "-java-deferred-length");
62+
upload.setMetadata(
63+
Api2DevdockScenario.uploadMetadata(uploadConfig, scenario, createResponse)
64+
);
65+
upload.setUploadLengthDeferred(true);
66+
67+
final TusUploader uploader = client.createUpload(upload);
68+
uploader.setChunkSize(chunkSize);
69+
int uploadedChunkSize;
70+
do {
71+
uploadedChunkSize = uploader.uploadChunk();
72+
} while (uploadedChunkSize > -1);
73+
uploader.finish();
74+
75+
if (uploader.getOffset() != content.length) {
76+
throw new IllegalStateException(
77+
"remote offset " + uploader.getOffset() + ", expected " + content.length
78+
);
79+
}
80+
if (uploader.getUploadURL() == null) {
81+
throw new IllegalStateException("deferred-length upload did not return a URL");
82+
}
83+
84+
return uploader.getUploadURL().toString();
85+
}
86+
87+
private Api2DevdockTusDeferredLengthUpload() {
88+
throw new IllegalStateException("Utility class");
89+
}
90+
}

0 commit comments

Comments
 (0)