package gcl import ( "bytes" "crypto/sha256" "encoding/hex" "encoding/json" "fmt" "io" "net/http" "strings" ) // Upload func (storage *Storage) Upload(path string, data []byte) (bool, error) { // Create HTTP Request request, err := http.NewRequest("PUT", fmt.Sprintf("https://%s/%s/%s", storage.endpoint, storage.zoneName, path), bytes.NewReader(data)) // Handle Error if err != nil { return false, err } // Hasher hasher := sha256.New() hasher.Write(data) // Add Headers request.Header.Set("AccessKey", storage.accessKey) request.Header.Set("Content-Type", "application/octet-stream") request.Header.Set("Checksum", strings.ToUpper(hex.EncodeToString(hasher.Sum(nil)))) // Do Request response, err := http.DefaultClient.Do(request) // Handle Error if err != nil { return false, err } // Close Response defer response.Body.Close() // Check Response if response.StatusCode/100 != 2 { // Read Body body, err := io.ReadAll(response.Body) // Handle Error if err != nil { return false, err } // Response Data responseData := struct { HttpCode int `json:"HttpCode"` Message string `json:"Message"` }{} // Unmarshal Body err = json.Unmarshal(body, &responseData) // Handle Error if err != nil { return false, err } return false, fmt.Errorf("%d : %s", responseData.HttpCode, responseData.Message) } // Success return true, err }