• 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

74.19
/src/main/java/me/desair/tus/server/rufh/handler/RufhOptionsRequestHandler.java
1
package me.desair.tus.server.rufh.handler;
2

3
import jakarta.servlet.http.HttpServletResponse;
4
import java.io.IOException;
5
import java.util.LinkedHashMap;
6
import java.util.Map;
7
import me.desair.tus.server.HttpHeader;
8
import me.desair.tus.server.HttpMethod;
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 OPTIONS feature discovery requests.
18
 *
19
 * <p>Sets Accept-Patch, Upload-Draft, and Upload-Limit headers on the response.
20
 *
21
 * <p>Reference: Section 4.1.4 (Limits) & Appendix B (Draft Version Identification) of
22
 * draft-ietf-httpbis-resumable-upload-11.
23
 */
24
public class RufhOptionsRequestHandler extends AbstractRequestHandler {
6✔
25

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

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

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

52
    servletResponse.setHeader(
8✔
53
        HttpHeader.ACCEPT_PATCH,
54
        HttpHeader.CONTENT_TYPE_PARTIAL_UPLOAD + ", application/offset+octet-stream");
55
    servletResponse.setHeader(HttpHeader.UPLOAD_DRAFT, "11");
8✔
56

57
    addUploadLimitHeader(servletResponse, uploadStorageService);
8✔
58
    servletResponse.setStatus(HttpServletResponse.SC_NO_CONTENT);
6✔
59
  }
2✔
60

61
  private void addUploadLimitHeader(
62
      TusServletResponse response, UploadStorageService uploadStorageService) {
63
    if (uploadStorageService == null) {
4!
NEW
64
      return;
×
65
    }
66
    Map<String, Object> limits = new LinkedHashMap<>();
8✔
67
    long maxSize = uploadStorageService.getMaxUploadSize();
6✔
68
    if (maxSize > 0) {
8!
69
      limits.put("max-size", maxSize);
12✔
70
    }
71
    Long maxAppendSize = uploadStorageService.getMaxAppendSize();
6✔
72
    if (maxAppendSize != null && maxAppendSize > 0) {
14!
73
      limits.put("max-append-size", maxAppendSize);
10✔
74
    }
75
    if (!limits.isEmpty()) {
6!
76
      response.setHeader(HttpHeader.UPLOAD_LIMIT, StructuredHeaderUtil.formatDictionary(limits));
10✔
77
    }
78
  }
2✔
79
}
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