docs: public String signRequestV2(String urlString, String method, byte[] body, String contentType) {
          URI uri = URI.create(urlString);
  
          Mac mac = createMac();
          StringBuilder sb = new StringBuilder();
  
          sb.append(String.format("%s %s", method, uri.getPath()));
          if (uri.getQuery() != null) {
              sb.append(String.format("?%s", uri.getQuery()));
          }
  
          sb.append(String.format("\nHost: %s", uri.getHost()));
          if (uri.getPort() > 0) {
              sb.append(String.format(":%d", uri.getPort()));
          }
  
          if (contentType != null) {
              sb.append(String.format("\nContent-Type: %s", contentType));
          }
  
          // body
          sb.append("\n\n");
          if (body != null && body.length > 0 && !StringUtils.isNullOrEmpty(contentType)) {
              if (contentType.equals(Client.FormMime)
                      || contentType.equals(Client.JsonMime)) {
                  sb.append(new String(body));
              }
          }
  
          mac.update(StringUtils.utf8Bytes(sb.toString()));
  
          String digest = UrlSafeBase64.encodeToString(mac.doFinal());
          return this.accessKey + ":" + digest;
      }