| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package files
-
- import (
- "context"
- "fmt"
- "io"
- "net/http"
- "net/url"
- )
-
- type httpFile struct {
- http *http.Client
- url string
- }
-
- func (h httpFile) Open(ctx context.Context) (io.ReadCloser, error) {
- request, err := http.NewRequestWithContext(ctx, http.MethodGet, h.url, nil)
- if err != nil {
- panic(err)
- }
-
- response, err := h.http.Do(request)
- if err != nil {
- if response != nil {
- io.Copy(io.Discard, response.Body)
- response.Body.Close()
- }
-
- return nil, fmt.Errorf("cannot get url %s: %w", h.url, err)
- }
-
- if response.StatusCode >= http.StatusBadRequest {
- return nil, fmt.Errorf("unexpected status code %d", response.StatusCode)
- }
-
- return response.Body, nil
- }
-
- func NewHTTP(client *http.Client, endpoint string) (File, error) {
- if client == nil {
- return nil, ErrBadHTTPClient
- }
-
- parsed, err := url.Parse(endpoint)
- if err != nil {
- return nil, fmt.Errorf("incorrect url %s: %w", endpoint, err)
- }
-
- switch parsed.Scheme {
- case "http", "https":
- default:
- return nil, fmt.Errorf("unsupported url %s", endpoint)
- }
-
- return httpFile{
- http: client,
- url: endpoint,
- }, nil
- }
|