Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

411/412 error while using tus-java-client #124

Open
trilochanmukkala opened this issue Jan 6, 2025 · 3 comments
Open

411/412 error while using tus-java-client #124

trilochanmukkala opened this issue Jan 6, 2025 · 3 comments
Labels

Comments

@trilochanmukkala
Copy link

Question
We have a tusdotnet server and tus-js which is working perfectly fine. We are planning to add a tus-java-client as well for our product and have developed a simple java application to test the tus-java-client but, I'm consistently receiving 411 error. after looking at this article and followed the instructions and now I'm receiving 412 error. I'm not sure what headers I'm missing because I'm using the same headers from tus-js. Any help is appreciated
Thanks

Setup details
Please provide following details, if applicable to your situation:

  • Runtime environment: [OpenJDK 23.0.1]
  • Used tus-java-client version: [0.5.0]
  • Used tus server software: [tusdotnet]
package com.example;

import io.tus.java.client.TusClient;
import io.tus.java.client.TusUpload;
import io.tus.java.client.TusUploader;
import org.apache.log4j.Logger;

import java.io.File;
import java.net.URL;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class App {
    static final Logger logger = Logger.getLogger(App.class);

    public static void main(String[] args) {
        try {
            System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

            // File path and server URL
            String filePath = "C:\\myfile\\path.jpg";
            URL uploadURL = new URL("MyURL");

            // Initialize the TUS client
            TusClient client = new TusClient();
            client.setUploadCreationURL(uploadURL);

            // Prepare the file
            File file = new File(filePath);
            if (!file.exists()) {
                logger.error("File not found: " + filePath);
                return;
            }

            long fileSize = file.length();

            // Set headers
            Map<String, String> headers = new HashMap<>();
            headers.put("Tus-Resumable", "1.0.0");
            headers.put("Upload-Length", String.valueOf(fileSize));
            headers.put("X-Token", "<Your-Actual-Token>");
            
            logger.debug("Headers set: " + headers);
            client.setHeaders(headers);

            // Create the upload
            TusUpload upload = new TusUpload(file);
            upload.setSize(fileSize);

            // Set metadata
            Map<String, String> metadata = new HashMap<>();
            metadata.put("filename", file.getName());
            metadata.put("filetype", "image/jpeg");
            // Set additional metadata as observed
            //Metadata added here
            // Encode metadata
            StringBuilder encodedMetadata = new StringBuilder();
            for (Map.Entry<String, String> entry : metadata.entrySet()) {
                if (encodedMetadata.length() > 0) {
                    encodedMetadata.append(",");
                }
                String encodedValue = Base64.getEncoder().encodeToString(entry.getValue().getBytes("UTF-8"));
                encodedMetadata.append(entry.getKey()).append(" ").append(encodedValue);
            }
            headers.put("Upload-Metadata", encodedMetadata.toString());

            // Create and start the upload process
            TusUploader uploader = client.createUpload(upload);
            uploader.setChunkSize(1024 * 1024); // 1MB chunk size

            logger.info("Starting upload process.");
            while (uploader.uploadChunk() > -1) {
                long uploadedBytes = uploader.getOffset();
                logger.info(String.format("Uploaded %d of %d bytes", uploadedBytes, fileSize));
            }

            uploader.finish();
            logger.info("Upload completed successfully!");

        } catch (Exception e) {
            logger.error("Failed to complete upload", e);
        }
    }
}

This is my Error

ERROR App:101 - Failed to complete upload
io.tus.java.client.ProtocolException: unexpected status code (412) while creating upload
        at io.tus.java.client.TusClient.createUpload(TusClient.java:211)
        at com.example.App.main(App.java:88)
        at org.codehaus.mojo.exec.ExecJavaMojo.doMain(ExecJavaMojo.java:375)
        at org.codehaus.mojo.exec.ExecJavaMojo.doExec(ExecJavaMojo.java:364)
        at org.codehaus.mojo.exec.ExecJavaMojo.lambda$execute$0(ExecJavaMojo.java:286)
        at java.base/java.lang.Thread.run(Thread.java:1575)
@Acconut
Copy link
Member

Acconut commented Jan 7, 2025

headers.put("Tus-Resumable", "1.0.0");
headers.put("Upload-Length", String.valueOf(fileSize));

Don't set tus-related headers on your own. tus-java-client already sets these and it's possible that your custom values are combined with the values from tus-java-client resulting in a value that is rejected by the tus server with a 412 status code. Try removing these two lines and see if it works better. In general, you should not set any Tus-* or Upload-* headers on your own.

By the way, I am curious to understand why you set these headers in the first place. Was there some documentation or example that did this? If so, it should be updated.

@trilochanmukkala
Copy link
Author

@Acconut

Don't set tus-related headers on your own. tus-java-client already sets these and it's possible that your custom values are combined with the values from tus-java-client resulting in a value that is rejected by the tus server with a 412 status code. Try removing these two lines and see if it works better. In general, you should not set any Tus-* or Upload-* headers on your own.

Thanks. made some progress to 502 error now

By the way, I am curious to understand why you set these headers in the first place. Was there some documentation or example that did this? If so, it should be updated.

I put these headers because we have used these headers for tus-js-client so I assumed we needed the same headers for tus-java-
client

@Acconut
Copy link
Member

Acconut commented Jan 8, 2025

Thanks. made some progress to 502 error now

502 is an error from the proxy. You have to configure your reverse proxy to properly play with the tus server. Without more details, it's hard to know what's causing this, but here are two resources to learn more about this:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants