• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tomdesair / tus-java-server / 28704942481

04 Jul 2026 11:35AM UTC coverage: 92.355%. First build
28704942481

Pull #105

github

web-flow
Merge 94b11f46d into e8bbe6ae5
Pull Request #105: feat: Implement IETF Resumable Uploads for HTTP (RUFH) Protocol

866 of 1022 branches covered (84.74%)

Branch coverage included in aggregate %.

443 of 496 new or added lines in 24 files covered. (89.31%)

2263 of 2366 relevant lines covered (95.65%)

6.24 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

80.95
/src/main/java/me/desair/tus/server/rufh/handler/RufhHeadRequestHandler.java
1
package me.desair.tus.server.rufh.handler;
2

3
import java.io.IOException;
4
import java.util.LinkedHashMap;
5
import java.util.Map;
6
import me.desair.tus.server.HttpHeader;
7
import me.desair.tus.server.HttpMethod;
8
import me.desair.tus.server.upload.UploadInfo;
9
import me.desair.tus.server.upload.UploadLockingService;
10
import me.desair.tus.server.upload.UploadStorageService;
11
import me.desair.tus.server.util.AbstractRequestHandler;
12
import me.desair.tus.server.util.StructuredHeaderUtil;
13
import me.desair.tus.server.util.TusServletRequest;
14
import me.desair.tus.server.util.TusServletResponse;
15

16
/**
17
 * Request handler for HTTP HEAD status retrieval requests.
18
 *
19
 * <p>Sets Upload-Offset, Upload-Complete, Upload-Length, Upload-Limit, Upload-Draft, and
20
 * Cache-Control headers on the response.
21
 *
22
 * <p>Reference: Section 4.3 (Offset Retrieval) & Appendix B (Draft Version Identification) of
23
 * draft-ietf-httpbis-resumable-upload-11.
24
 */
25
public class RufhHeadRequestHandler extends AbstractRequestHandler {
6✔
26

27
  @Override
28
  public boolean supports(HttpMethod method) {
29
    return HttpMethod.HEAD.equals(method);
8✔
30
  }
31

32
  @Override
33
  public void process(
34
      HttpMethod method,
35
      TusServletRequest servletRequest,
36
      TusServletResponse servletResponse,
37
      UploadStorageService uploadStorageService,
38
      String ownerKey)
39
      throws IOException {
NEW
40
    process(method, servletRequest, servletResponse, uploadStorageService, null, ownerKey);
×
NEW
41
  }
×
42

43
  @Override
44
  public void process(
45
      HttpMethod method,
46
      TusServletRequest servletRequest,
47
      TusServletResponse servletResponse,
48
      UploadStorageService uploadStorageService,
49
      UploadLockingService uploadLockingService,
50
      String ownerKey)
51
      throws IOException {
52

53
    String requestUri = servletRequest.getRequestURI();
3✔
54
    UploadInfo uploadInfo = uploadStorageService.getUploadInfo(requestUri, ownerKey);
5✔
55

56
    servletResponse.setStatus(204);
3✔
57
    servletResponse.setHeader(HttpHeader.UPLOAD_DRAFT, "11");
4✔
58
    servletResponse.setHeader(HttpHeader.UPLOAD_OFFSET, String.valueOf(uploadInfo.getOffset()));
6✔
59
    servletResponse.setHeader(
4✔
60
        HttpHeader.UPLOAD_COMPLETE,
61
        StructuredHeaderUtil.formatBoolean(!uploadInfo.isUploadInProgress()));
6✔
62

63
    if (uploadInfo.hasLength()) {
3!
64
      servletResponse.setHeader(HttpHeader.UPLOAD_LENGTH, String.valueOf(uploadInfo.getLength()));
6✔
65
    }
66

67
    addUploadLimitHeader(servletResponse, uploadStorageService);
4✔
68
    servletResponse.setHeader(HttpHeader.CACHE_CONTROL, "no-store");
4✔
69
  }
1✔
70

71
  private void addUploadLimitHeader(
72
      TusServletResponse response, UploadStorageService uploadStorageService) {
73
    if (uploadStorageService == null) {
2!
NEW
74
      return;
×
75
    }
76
    Map<String, Object> limits = new LinkedHashMap<>();
4✔
77
    long maxSize = uploadStorageService.getMaxUploadSize();
3✔
78
    if (maxSize > 0) {
4✔
79
      limits.put("max-size", maxSize);
6✔
80
    }
81
    Long maxAppendSize = uploadStorageService.getMaxAppendSize();
3✔
82
    if (maxAppendSize != null && maxAppendSize > 0) {
7!
NEW
83
      limits.put("max-append-size", maxAppendSize);
×
84
    }
85
    if (!limits.isEmpty()) {
3✔
86
      response.setHeader(HttpHeader.UPLOAD_LIMIT, StructuredHeaderUtil.formatDictionary(limits));
5✔
87
    }
88
  }
1✔
89
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc