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

tomdesair / tus-java-server / 28705391850

04 Jul 2026 11:54AM UTC coverage: 95.994%. First build
28705391850

Pull #105

github

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

927 of 1010 branches covered (91.78%)

Branch coverage included in aggregate %.

488 of 490 new or added lines in 24 files covered. (99.59%)

2308 of 2360 relevant lines covered (97.8%)

6.33 hits per line

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

94.74
/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
    Map<String, Object> limits = new LinkedHashMap<>();
4✔
74
    long maxSize = uploadStorageService.getMaxUploadSize();
3✔
75
    if (maxSize > 0) {
4✔
76
      limits.put("max-size", maxSize);
6✔
77
    }
78
    Long maxAppendSize = uploadStorageService.getMaxAppendSize();
3✔
79
    if (maxAppendSize != null && maxAppendSize > 0) {
7✔
80
      limits.put("max-append-size", maxAppendSize);
5✔
81
    }
82
    if (!limits.isEmpty()) {
3✔
83
      response.setHeader(HttpHeader.UPLOAD_LIMIT, StructuredHeaderUtil.formatDictionary(limits));
5✔
84
    }
85
  }
1✔
86
}
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