(ctx context.Context, httpClient httpDoer, uploadURL string, asset AssetForUpload)
| 159 | } |
| 160 | |
| 161 | func uploadAsset(ctx context.Context, httpClient httpDoer, uploadURL string, asset AssetForUpload) (*ReleaseAsset, error) { |
| 162 | u, err := url.Parse(uploadURL) |
| 163 | if err != nil { |
| 164 | return nil, err |
| 165 | } |
| 166 | params := u.Query() |
| 167 | params.Set("name", asset.Name) |
| 168 | params.Set("label", asset.Label) |
| 169 | u.RawQuery = params.Encode() |
| 170 | |
| 171 | f, err := asset.Open() |
| 172 | if err != nil { |
| 173 | return nil, err |
| 174 | } |
| 175 | defer f.Close() |
| 176 | |
| 177 | req, err := http.NewRequestWithContext(ctx, "POST", u.String(), f) |
| 178 | if err != nil { |
| 179 | return nil, err |
| 180 | } |
| 181 | req.ContentLength = asset.Size |
| 182 | req.Header.Set("Content-Type", asset.MIMEType) |
| 183 | req.GetBody = asset.Open |
| 184 | |
| 185 | resp, err := httpClient.Do(req) |
| 186 | if err != nil { |
| 187 | return nil, errNetwork{err} |
| 188 | } |
| 189 | defer resp.Body.Close() |
| 190 | |
| 191 | success := resp.StatusCode >= 200 && resp.StatusCode < 300 |
| 192 | if !success { |
| 193 | return nil, api.HandleHTTPError(resp) |
| 194 | } |
| 195 | |
| 196 | var newAsset ReleaseAsset |
| 197 | dec := json.NewDecoder(resp.Body) |
| 198 | if err := dec.Decode(&newAsset); err != nil { |
| 199 | return nil, err |
| 200 | } |
| 201 | |
| 202 | return &newAsset, nil |
| 203 | } |
| 204 | |
| 205 | func deleteAsset(ctx context.Context, httpClient httpDoer, assetURL string) error { |
| 206 | req, err := http.NewRequestWithContext(ctx, "DELETE", assetURL, nil) |
no test coverage detected