protected void doPost()

in s3-artifact-storage-server/src/main/java/jetbrains/buildServer/artifacts/s3/web/S3SettingsController.java [70:156]


  protected void doPost(@NotNull final HttpServletRequest request,
                        @NotNull final HttpServletResponse response,
                        @NotNull final Element xmlResponse) {
    final ActionErrors errors = new ActionErrors();

    final String resource = request.getParameter("resource");
    if (resource == null) {
      errors.addError("resource", "Invalid request: resource parameter was not set");

    } else {
      final S3ClientResourceFetcher<?> handler = myHandlers.get(resource);
      if (handler == null) {
        errors.addError("resource", "Invalid request: unsupported resource " + resource);
      } else {
        try {
          final SProject project = getProject(request);

          final SUser user = SessionUser.getUser(request);
          final boolean canEditProject = AuthUtil.hasPermissionToManageProject(user, project.getProjectId());

          if (canEditProject && !project.isReadOnly()) {
            final Map<String, String> properties = ParamUtil.putSslValues(myServerPaths, getProperties(request));
            xmlResponse.addContent(IOGuard.allowNetworkCall(() -> handler.fetchAsElement(properties, project.getProjectId())));
          } else {
            final String settingsId = request.getParameter(ArtifactsConstants.EXTERNAL_ARTIFACTS_STORAGE_SETTINGS_ID_KEY);
            final SProjectFeatureDescriptor storageFeature = project.findFeatureById(settingsId);
            if (storageFeature != null) {
              final Map<String, String> properties = storageFeature.getParameters();
              xmlResponse.addContent(IOGuard.allowNetworkCall(() -> handler.fetchCurrentValueAsElement(properties, project.getProjectId())));
            } else {
              errors.addError(resource, "Failed to find storage with id: " + settingsId);
            }
          }
        } catch (ConnectionCredentialsException e) {
          LOG.warn("Failed to get content", e);
          String errorMessage = getUiFriendlyErrorMessage(e);

          switch (resource) {
            case "buckets":
              errors.addError(resource, "Failed to list buckets: " + errorMessage);
              break;
            case "distributions":
              errors.addError(resource, "Failed to list distributions: " + errorMessage);
              break;
            case "publicKeys":
              errors.addError(resource, "Failed to list public keys: " + errorMessage);
              break;
            case "bucketLocation":
              errors.addError(resource, "Failed to get bucket location: " + errorMessage);
              break;
            case "validateCfKeys":
              errors.addError(resource, "CloudFront keys validation failed: " + errorMessage);
              break;
            case "s3TransferAccelerationAvailability":
              errors.addError(resource, "Failed to check S3 Transfer Acceleration availability: " + errorMessage);
              break;
            default:
              errors.addError(PROJECT_ID_PARAM, "Failed to fetch resource: " + errorMessage);
          }
        } catch (InvalidSettingsException e) {
          final String message = String.format(FAILED_TO_PROCESS_REQUEST_FORMAT, resource);
          if (LOG.isDebugEnabled()) {
            LOG.debug(message, e);
          } else {
            LOG.info(message + e.getMessage());
          }
          e.getInvalids().forEach(errors::addError);
        } catch (IllegalArgumentException e) {
          final String message = String.format(FAILED_TO_PROCESS_REQUEST_FORMAT, resource);
          if (LOG.isDebugEnabled()) {
            LOG.debug(message, e);
          } else {
            LOG.info(message + e.getMessage());
          }
          errors.addError(resource, message);
        } catch (Throwable e) {
          LOG.infoAndDebugDetails(e.getMessage(), e);
          final String message = constructMessageForUI(e, resource);
          errors.addError(resource, message);
        }
      }
    }

    if (errors.hasErrors()) {
      errors.serialize(xmlResponse);
    }
  }