docs: @Override
      public Object convertRequest(ServiceRequestContext ctx, AggregatedHttpMessage request,
                                   Class<?> expectedResultType) throws Exception {
          final String ifNoneMatch = request.headers().get(HttpHeaderNames.IF_NONE_MATCH);
          if (!isNullOrEmpty(ifNoneMatch)) {
              final Revision lastKnownRevision = new Revision(ifNoneMatch);
              final String prefer = request.headers().get(HttpHeaderNames.PREFER);
              final long timeoutMillis;
              if (!isNullOrEmpty(prefer)) {
                  timeoutMillis = getTimeoutMillis(prefer);
              } else {
                  timeoutMillis = DEFAULT_TIMEOUT_MILLIS;
              }
              // Update timeout according to the watch API specifications.
              ctx.setRequestTimeoutMillis(
                      WatchTimeout.makeReasonable(timeoutMillis, ctx.requestTimeoutMillis()));
              return Optional.of(new WatchRequest(lastKnownRevision, timeoutMillis));
          }
          return Optional.empty();
      }