@Override
  public UrlSigningService getUrlSigningService() {

    String uploadEndpoint, downloadEndpoint;
    // Assume urlSignerEndpoints has only POST/GET, nothing nested
    try {
      JSONObject root = new JSONObject(config.urlSignerEndpoints);
      uploadEndpoint = root.getString(RestMethod.POST.name());
      downloadEndpoint = root.getString(RestMethod.GET.name());
    } catch (JSONException ex) {
      throw new IllegalStateException("Invalid config value: " + config.urlSignerEndpoints, ex);
    }

    return new AmbryUrlSigningService(uploadEndpoint, downloadEndpoint, config.urlSignerDefaultUrlTtlSecs,
        config.urlSignerDefaultMaxUploadSizeBytes, config.urlSignerMaxUrlTtlSecs,
        config.chunkUploadInitialChunkTtlSecs, chunkUploadMaxChunkSize, SystemTime.getInstance(), clusterMap,
        clusterMapConfig, routerConfig);
  }
Default implementation of {@link UrlSigningServiceFactory} for Ambry
<p/>
Returns a new instance of {@link UrlSigningService} on {@link #getUrlSigningService()} call.
ambry-frontend/src/main/java/com/github/ambry/frontend/AmbryUrlSigningServiceFactory.java