Пример #1
0
        /// <summary>
        /// Delegate errors to handlers
        /// </summary>
        /// <param name="response"></param>
        /// <param name="handlers"></param>
        /// <param name="startTime"></param>
        private void HandleIfErrorResponse(ResponseResult response, IEnumerable <ApiResponseErrorHandlingDelegate> handlers, DateTime startTime)
        {
            // Logs Response if HTTP tracing is enabled
            if (this.trace)
            {
                DateTime now = DateTime.Now;
                LogRequest(response.Request, response, (now - startTime).TotalMilliseconds);
            }

            if (handlers == null)
            {
                throw new ArgumentNullException(nameof(handlers));
            }

            // Run through handlers passed to take up error handling
            foreach (var handler in handlers)
            {
                handler(response);
            }

            // Fall back default error handler
            _defaultErrorHandlingDelegate(response);
        }
Пример #2
0
 public EmptyBucketOperation(string message, ResponseResult serverResponse) : base(message, serverResponse)
 {
 }
Пример #3
0
 public EmptyBucketOperation(ResponseResult serverResponse) : base(serverResponse)
 {
 }
Пример #4
0
        private static void ParseErrorFromContent(ResponseResult response)
        {
            if (response.StatusCode.Equals(HttpStatusCode.NotFound) &&
                response.Request.RequestUri.PathAndQuery.EndsWith("?location") &&
                response.Request.Method.Equals(HttpMethod.Get))
            {
                var bucketName = response.Request.RequestUri.PathAndQuery.Split('?')[0];
                BucketRegionCache.Instance.Remove(bucketName);
                throw new BucketNotFoundException(bucketName, "Not found.");
            }

            var           contentBytes = System.Text.Encoding.UTF8.GetBytes(response.Content);
            var           stream       = new MemoryStream(contentBytes);
            ErrorResponse errResponse  = (ErrorResponse) new XmlSerializer(typeof(ErrorResponse)).Deserialize(stream);

            if (response.StatusCode.Equals(HttpStatusCode.Forbidden) &&
                (errResponse.Code.Equals("SignatureDoesNotMatch") || errResponse.Code.Equals("InvalidAccessKeyId")))
            {
                throw new AuthorizationException(errResponse.Resource, errResponse.BucketName, errResponse.Message);
            }

            // Handle XML response for Bucket Policy not found case
            if (response.StatusCode.Equals(HttpStatusCode.NotFound) &&
                response.Request.RequestUri.PathAndQuery.EndsWith("?policy") &&
                response.Request.Method.Equals(HttpMethod.Get) &&
                errResponse.Code == "NoSuchBucketPolicy")
            {
                throw new ErrorResponseException(errResponse, response)
                      {
                          XmlError = response.Content
                      };
            }

            if (response.StatusCode.Equals(HttpStatusCode.NotFound) &&
                errResponse.Code == "NoSuchBucket")
            {
                throw new BucketNotFoundException(errResponse.BucketName, "Not found.");
            }

            if (response.StatusCode.Equals(HttpStatusCode.BadRequest) &&
                errResponse.Code.Equals("MalformedXML"))
            {
                throw new MalFormedXMLException(errResponse.Resource, errResponse.BucketName, errResponse.Message, errResponse.Key);
            }

            if (response.StatusCode.Equals(HttpStatusCode.NotImplemented) &&
                errResponse.Code.Equals("NotImplemented"))
            {
                throw new NotImplementedException(errResponse.Message);
            }

            if (response.StatusCode.Equals(HttpStatusCode.BadRequest) &&
                errResponse.Code.Equals("InvalidRequest"))
            {
                var legalHold = new Dictionary <string, string>()
                {
                    { "legal-hold", "" }
                };
                if (response.Request.RequestUri.Query.Contains("legalHold"))
                {
                    throw new MissingObjectLockConfigurationException(errResponse.BucketName, errResponse.Message);
                }
            }

            if (response.StatusCode.Equals(HttpStatusCode.NotFound) &&
                errResponse.Code.Equals("ObjectLockConfigurationNotFoundError"))
            {
                throw new MissingObjectLockConfigurationException(errResponse.BucketName, errResponse.Message);
            }

            if (response.StatusCode.Equals(HttpStatusCode.NotFound) &&
                errResponse.Code.Equals("ReplicationConfigurationNotFoundError"))
            {
                throw new MissingBucketReplicationConfigurationException(errResponse.BucketName, errResponse.Message);
            }

            if (response.StatusCode.Equals(HttpStatusCode.Conflict) &&
                errResponse.Code.Equals("BucketAlreadyOwnedByYou"))
            {
                throw new Exception("Bucket already owned by you: " + errResponse.BucketName);
            }

            throw new UnexpectedMinioException(errResponse.Message)
                  {
                      Response = errResponse,
                      XmlError = response.Content
                  };
        }
Пример #5
0
        private static void ParseWellKnownErrorNoContent(ResponseResult response)
        {
            MinioException error         = null;
            ErrorResponse  errorResponse = new ErrorResponse();

            foreach (var parameter in response.Headers)
            {
                if (parameter.Key.Equals("x-amz-id-2", StringComparison.CurrentCultureIgnoreCase))
                {
                    errorResponse.HostId = parameter.Value.ToString();
                }

                if (parameter.Key.Equals("x-amz-request-id", StringComparison.CurrentCultureIgnoreCase))
                {
                    errorResponse.RequestId = parameter.Value.ToString();
                }

                if (parameter.Key.Equals("x-amz-bucket-region", StringComparison.CurrentCultureIgnoreCase))
                {
                    errorResponse.BucketRegion = parameter.Value.ToString();
                }
            }

            var pathAndQuery = response.Request.RequestUri.PathAndQuery;
            var host         = response.Request.RequestUri.Host;

            errorResponse.Resource = pathAndQuery;

            // zero, one or two segments
            var resourceSplits = pathAndQuery.Split(new[] { '/' }, 2, StringSplitOptions.RemoveEmptyEntries);

            if (HttpStatusCode.NotFound.Equals(response.StatusCode))
            {
                int pathLength = resourceSplits.Length;
                // bool isAWS = host.EndsWith("s3.amazonaws.com"); PR#442
                // bool isVirtual = isAWS && !host.StartsWith("s3.amazonaws.com");
                bool isAWS     = host.EndsWith("s3.amazonaws.com");
                bool isVirtual = isAWS && !host.StartsWith("s3.amazonaws.com");

                if (pathLength > 1)
                {
                    var objectName = resourceSplits[1];
                    errorResponse.Code = "NoSuchKey";
                    error = new ObjectNotFoundException(objectName, "Not found.");
                }
                else if (pathLength == 1)
                {
                    var resource = resourceSplits[0];

                    if (isAWS && isVirtual && pathAndQuery != string.Empty)
                    {
                        errorResponse.Code = "NoSuchKey";
                        error = new ObjectNotFoundException(resource, "Not found.");
                    }
                    else
                    {
                        errorResponse.Code = "NoSuchBucket";
                        BucketRegionCache.Instance.Remove(resource);
                        error = new BucketNotFoundException(resource, "Not found.");
                    }
                }
                else
                {
                    error = new InternalClientException("404 without body resulted in path with less than two components", response);
                }
            }
            else if (HttpStatusCode.BadRequest.Equals(response.StatusCode))
            {
                int pathLength = resourceSplits.Length;

                if (pathLength > 1)
                {
                    var objectName = resourceSplits[1];
                    errorResponse.Code = "InvalidObjectName";
                    error = new InvalidObjectNameException(objectName, "Invalid object name.");
                }
                else
                {
                    error = new InternalClientException("400 without body resulted in path with less than two components", response);
                }
            }
            else if (HttpStatusCode.Forbidden.Equals(response.StatusCode))
            {
                errorResponse.Code = "Forbidden";
                error = new AccessDeniedException("Access denied on the resource: " + pathAndQuery);
            }

            error.Response = errorResponse;
            throw error;
        }