/// <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); }
public EmptyBucketOperation(string message, ResponseResult serverResponse) : base(message, serverResponse) { }
public EmptyBucketOperation(ResponseResult serverResponse) : base(serverResponse) { }
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 }; }
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; }