package openuri
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// Client type
|
|
type Client struct {
|
|
httpClient *http.Client
|
|
}
|
|
|
|
// ClientOption type
|
|
type ClientOption func(*Client) error
|
|
|
|
// New returns a Client struct
|
|
func New(options ...ClientOption) (*Client, error) {
|
|
c := &Client{httpClient: http.DefaultClient}
|
|
for _, option := range options {
|
|
if err := option(c); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return c, nil
|
|
}
|
|
|
|
// Open an io.ReadCloser from a local file or URL
|
|
func Open(name string, options ...ClientOption) (io.ReadCloser, error) {
|
|
c, err := New(options...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return c.Open(name)
|
|
}
|
|
|
|
func WithHTTPClient(v *http.Client) ClientOption {
|
|
return func(c *Client) error {
|
|
c.httpClient = v
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func (c *Client) Open(name string) (io.ReadCloser, error) {
|
|
if strings.HasPrefix(name, "http://") || strings.HasPrefix(name, "https://") {
|
|
resp, err := c.httpClient.Get(name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return resp.Body, nil
|
|
}
|
|
return os.Open(name)
|
|
}
|