• 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

77.14
/src/main/java/me/desair/tus/server/rufh/handler/RufhErrorHandler.java
1
package me.desair.tus.server.rufh.handler;
2

3
import java.io.IOException;
4
import me.desair.tus.server.HttpHeader;
5
import me.desair.tus.server.HttpMethod;
6
import me.desair.tus.server.exception.TusException;
7
import me.desair.tus.server.rufh.HttpProblemDetails;
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
 * Error request handler that processes validation and processing failures for RUFH requests.
18
 *
19
 * <p>Formats offset mismatch errors (HTTP 409 Conflict), completed upload errors (HTTP 400 Bad
20
 * Request), and inconsistent upload length errors (HTTP 400 Bad Request) as RFC 7807 Problem
21
 * Details JSON.
22
 *
23
 * <p>Reference: Section 7 (Problem Types) of draft-ietf-httpbis-resumable-upload-11:
24
 *
25
 * <ul>
26
 *   <li>Section 7.1: Mismatching Offset (409 Conflict)
27
 *   <li>Section 7.2: Completed Upload (400 Bad Request)
28
 *   <li>Section 7.3: Inconsistent Length (400 Bad Request)
29
 * </ul>
30
 */
31
public class RufhErrorHandler extends AbstractRequestHandler {
6✔
32

33
  @Override
34
  public boolean supports(HttpMethod method) {
35
    return true;
4✔
36
  }
37

38
  @Override
39
  public boolean isErrorHandler() {
40
    return true;
2✔
41
  }
42

43
  @Override
44
  public void process(
45
      HttpMethod method,
46
      TusServletRequest servletRequest,
47
      TusServletResponse servletResponse,
48
      UploadStorageService uploadStorageService,
49
      String ownerKey)
50
      throws IOException, TusException {
NEW
51
    process(method, servletRequest, servletResponse, uploadStorageService, null, ownerKey);
×
NEW
52
  }
×
53

54
  @Override
55
  public void process(
56
      HttpMethod method,
57
      TusServletRequest servletRequest,
58
      TusServletResponse servletResponse,
59
      UploadStorageService uploadStorageService,
60
      UploadLockingService uploadLockingService,
61
      String ownerKey)
62
      throws IOException, TusException {
63

64
    int status = servletResponse.getStatus();
6✔
65
    if (status == 409) {
6✔
66
      // Section 7.1: Mismatching Offset
67
      UploadInfo uploadInfo =
2✔
68
          uploadStorageService.getUploadInfo(servletRequest.getRequestURI(), ownerKey);
4✔
69
      long expectedOffset =
70
          (uploadInfo != null && uploadInfo.getOffset() != null) ? uploadInfo.getOffset() : 0L;
10!
71
      Long providedOffset =
2✔
72
          StructuredHeaderUtil.parseInteger(servletRequest.getHeader(HttpHeader.UPLOAD_OFFSET));
3✔
73
      long provided = providedOffset != null ? providedOffset : 0L;
6!
74

75
      HttpProblemDetails.forOffsetMismatch(expectedOffset, provided).writeTo(servletResponse);
6✔
76

77
    } else if (status == 400) {
7✔
78
      UploadInfo uploadInfo =
2✔
79
          uploadStorageService.getUploadInfo(servletRequest.getRequestURI(), ownerKey);
4✔
80
      if (uploadInfo != null && !uploadInfo.isUploadInProgress()) {
5!
81
        // Section 7.2: Completed Upload
82
        HttpProblemDetails.forCompletedUpload(400).writeTo(servletResponse);
5✔
83
      } else {
84
        // Section 7.3: Inconsistent Length
NEW
85
        HttpProblemDetails.forInconsistentLength().writeTo(servletResponse);
×
86
      }
87
    }
88
  }
2✔
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