Context
I am trying to use the management API with a S3 presigned URL to download and register a new model. This is the code snippet:
   def create_presigned_url(self, bucket_name, object_name, expiration=3600):
        """Generate a presigned URL to share an S3 object

        :param bucket_name: string
        :param object_name: string
        :param expiration: Time in seconds for the presigned URL to remain valid
        :return: Presigned URL as string. If error, returns None.
        """

        # Generate a presigned URL for the S3 object
        s3_client = boto3.client('s3')
        try:
            response = s3_client.generate_presigned_url('get_object',
                                                        Params={'Bucket': bucket_name,
                                                                'Key': object_name},
                                                        ExpiresIn=expiration)
        except ClientError as e:
            logging.error(e)
            return None

        # The response contains the presigned URL
        return response
presigned_uri = self.create_presigned_url(bucket_name, object_name)
response = requests.post("http://127.0.0.1:8081/models?url={}".format(presigned_uri))

Doing a normal GET on the presigned URI works but it doesn’t work when used with the model management API. I tried all the workarounds mentioned in #669 but those are not giving any results as well. Can you please recommend what to do to make it work. Listing the errors I get in various situations:
Using the raw presigned URI:
{
  "code": 400,
  "type": "DownloadArchiveException",
  "message": "Failed to download archive from: https://log-analyzer-torchserve-mar.s3.amazonaws.com/test_service/stage/uw1/21_10_22_23_25/anomaly_detection_1634945079.8530345.mar?AWSAccessKeyId=****"
}

Replacing & with %26:
{
  "code": 400,
  "type": "DownloadArchiveException",
  "message": "Failed to download archive from: https://log-analyzer-torchserve-mar.s3.amazonaws.com/test_service/stage/uw1/21_10_26_00_23/anomaly_detection_1635207765.7685282.mar?AWSAccessKeyId=****&Signature=****=&x-amz-security-token=****&Expires=1635283752"
}

Using the torchserve 0.4.2-cpu docker image.

Your Environment


Installed using source? [yes/no]: no
Are you planning to deploy it using docker container? [yes/no]: yes
Is it a CPU or GPU environment?: CPU
Using a default/custom handler? [If possible upload/share custom handler/model]: custom but unrelated to the issue.
What kind of model is it e.g. vision, text, audio?: text
Are you planning to use local models from model-store or public url being used e.g. from S3 bucket etc.?
[If public url then provide link.]: S3 bucket


Expected Behavior
It should be able to download the model from S3 and register it.

Current Behavior
Returning a 400

Steps to Reproduce



Just upload a mar file to a s3 bucket
Create the presigned uri using the given code and then call the managment API to try to register the model.
…

Reference Issue on torchserve:

  

      github.com/pytorch/serve
  

  
    
  
	  
  

  
    
      Failed to download and register model using s3 presigned v4 url
    

    
      
        opened 
        
          
        
        Sep 8, 2020
      
      

        
          closed 
        
          
        
        Sep 9, 2020
      
        

      
        
          
          vishal-wiai
        
      
    

    
        
          triaged_wait
        
    
  


  
    I'm using management API to register a model with a HTTPs URL. It is a s3 presig…ned url. Torchserve successfully downloads and registers models from s3 v2 signature URLs but fails to download for v4 signature types. Is there any bug to it?

I checked this behaviour with 3 of the models and also verified URL permissions. Using `requests.get()` I'm able to download but not on TorchServe.
  

  

  
    
    
  

  


  

      github.com/pytorch/serve
  

  
    
  
	  
  

  
    
      Model Management API doesn't work with S3 presigned URL 1
    

    
      
        opened 
        
          
        
        Oct 26, 2021
      
      


      
        
          
          Iron-Stark
        
      
    

    
    
  


  
    ## Context
I am trying to use the management API with a S3 presigned URL to dow…nload and register a new model. This is the code snippet:

```
   def create_presigned_url(self, bucket_name, object_name, expiration=3600):
        """Generate a presigned URL to share an S3 object

        :param bucket_name: string
        :param object_name: string
        :param expiration: Time in seconds for the presigned URL to remain valid
        :return: Presigned URL as string. If error, returns None.
        """

        # Generate a presigned URL for the S3 object
        s3_client = boto3.client('s3')
        try:
            response = s3_client.generate_presigned_url('get_object',
                                                        Params={'Bucket': bucket_name,
                                                                'Key': object_name},
                                                        ExpiresIn=expiration)
        except ClientError as e:
            logging.error(e)
            return None

        # The response contains the presigned URL
        return response
presigned_uri = self.create_presigned_url(bucket_name, object_name)
response = requests.post("http://127.0.0.1:8081/models?url={}".format(presigned_uri))
```

Doing a normal GET on the presigned URI works but it doesn't work when used with the model management API. I tried all the workarounds mentioned in #669 but those are not giving any results as well. Can you please recommend what to do to make it work. Listing the errors I get in various situations:

Using the raw presigned URI:

```
{
  "code": 400,
  "type": "DownloadArchiveException",
  "message": "Failed to download archive from: https://log-analyzer-torchserve-mar.s3.amazonaws.com/test_service/stage/uw1/21_10_22_23_25/anomaly_detection_1634945079.8530345.mar?AWSAccessKeyId=****"
}
```

Replacing & with %26:

```
{
  "code": 400,
  "type": "DownloadArchiveException",
  "message": "Failed to download archive from: https://log-analyzer-torchserve-mar.s3.amazonaws.com/test_service/stage/uw1/21_10_26_00_23/anomaly_detection_1635207765.7685282.mar?AWSAccessKeyId=****&Signature=****=&x-amz-security-token=****&Expires=1635283752"
}
```

Using the torchserve 0.4.2-cpu docker image.

## Your Environment

* Installed using source? [yes/no]: no
* Are you planning to deploy it using docker container? [yes/no]: yes
* Is it a CPU or GPU environment?: CPU
* Using a default/custom handler? [If possible upload/share custom handler/model]: custom but unrelated to the issue.
* What kind of model is it e.g. vision, text, audio?: text
* Are you planning to use local models from model-store or public url being used e.g. from S3 bucket etc.?
  [If public url then provide link.]: S3 bucket

## Expected Behavior
It should be able to download the model from S3 and register it.

## Current Behavior
Returning a 400

## Steps to Reproduce


1.  Just upload a mar file to a s3 bucket
2. Create the presigned uri using the given code and then call the managment API to try to register the model.
...