0

Uploading an object from a .net webclient to MinIO where the object contains special characters in the name issues an HTTP 403.

This object fails: old_me_bold+19(1).jpg This object is ok: old_me_bold19.jpg

The message is: The request signature we calculated does not match the signature you provided. Check your key and signing method.

What is breaking in MinIO?

1 Answers1

0

Encoding the Url did not work either. I also tried PresignedPutObjectAsync to create a tmp Url already signed then I did a PUT using an HttpClient with the same result. To test that this way would work, I removed the special characters from the name of the file and the client was able to send the file to MinIO.

This code fails:

public async System.Threading.Tasks.Task PutAttachementAsync(
            Attachment attachment,
            string bukectName,
            string objectName,            
            string attachmentType = "application/octet-stream")
        {
            using (HttpClient client = new HttpClient())
            {
                var minioClient = GetMinioClient();
                client.BaseAddress = new Uri(Config.Instance.GetConfig("MinIOURL"));

                var tempFileName = CreateAttachmentTempFile(attachment, out bool virusScanResult);

                if (!virusScanResult)
                    return;

                using (FileStream str = new FileStream(tempFileName.FileAttachmentPath, FileMode.Open))
                {
                    try
                    {
                        String signedTMPUrl = await minioClient.PresignedPutObjectAsync(bukectName, objectName, 60 * 60 * 24);
                        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(attachmentType));
                        HttpResponseMessage response = await client.PutAsync(signedTMPUrl, new StreamContent(str));

                        if (response.IsSuccessStatusCode)
                        {
                            Log.InfoFormat("Request Message Information:- \n\n" + response.RequestMessage + "\n");
                            Log.InfoFormat("Response Message Header \n\n" + response.Content.Headers + "\n");
                        }
                        else
                        {
                            Log.InfoFormat("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
                        }
                    }
                    catch (MinioException e)
                    {
                        Log.Error("Error occurred: " + e.Message);
                    }
                }
            }
        }

That code is running from an ASP.Net application hosted in IIS. I wonder if IIS is injecting something into the header before the message goes to MinIO.

Any other file that I send to MinIO, if the name does not contain characters such as (), then the upload works always.

Jeppeto
  • 1
  • 1