Open
Description
Bug report
Describe the bug
CreateSignedUrl fails with body must be object
when target object content-type is different from "application/json"
To Reproduce
// Upload file and return signed url
func uploadFile() (string, error) {
path := "data/file.txt"
content := "Hello, I'm a file"
// Upload OK
fileRes, _ := supaStorage.UploadFile(SUPA_BUCKET_NAME, path, strings.NewReader(content), supa_storage.FileOptions{
Upsert: makePointer(true),
ContentType: makePointer("text/plain"), // <-- This line causes the error on the next method call
})
urlRes, err := supaStorage.CreateSignedUrl(SUPA_BUCKET_NAME, path, 60 * 30)
if err != nil {
log.Default().Println(err) // "body must be object" when setting content type
return "", err
}
return urlRes.SignedURL, nil
}
If you do not set ContentType
, or set it to the default "application/json" it works.
fileRes, _ := supaStorage.UploadFile(SUPA_BUCKET_NAME, path, strings.NewReader(content), supa_storage.FileOptions{
Upsert: makePointer(true),
// ContentType: makePointer("text/plain")
})
urlRes, err := supaStorage.CreateSignedUrl(SUPA_BUCKET_NAME, path, 60 * 30)
// No error
if err != nil {
log.Default().Println(err)
return "", err
}
Expected behavior
Method should return the signed url regardless of content type
System information
- github.com/supabase-community/storage-go v0.7.0
Additional context
After some digging, the error seems to be coming from the execution of the request at storage.go@CreateSignedUrl
// storage.go
// CreateSignedUrl create a signed URL. Use a signed URL to share a file for a fixed amount of time.
// bucketId string The bucket id
// filePath path The file path, including the file name. Should be of the format `folder/subfolder/filename.png`
// expiresIn int The number of seconds before the signed URL expires. Defaults to 60 seconds.
func (c *Client) CreateSignedUrl(bucketId string, filePath string, expiresIn int) (SignedUrlResponse, error) {
signedURL := c.clientTransport.baseUrl.String() + "/object/sign/" + bucketId + "/" + filePath
jsonBody := map[string]interface{}{
"expiresIn": expiresIn,
}
req, err := c.NewRequest(http.MethodPost, signedURL, &jsonBody)
if err != nil {
return SignedUrlResponse{}, err
}
var response SignedUrlResponse
_, err = c.Do(req, &response)
if err != nil { // <---- This is the error being triggered
return SignedUrlResponse{}, err
}
response.SignedURL = c.clientTransport.baseUrl.String() + response.SignedURL
return response, nil
}
However, I'm really new to Golang and don't really know what could be causing this. Maybe there's an option to parse non-JSON bodies differently?
Also, this is not on Supabase's side, as the NodeJS client seems to do this just fine