This commit was merged in pull request #1.
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
||||
|
||||
"github.com/h2non/filetype"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/metric"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
"golang.org/x/sys/unix"
|
||||
|
||||
@@ -27,11 +28,15 @@ import (
|
||||
type image struct {
|
||||
store string
|
||||
maxSize int64
|
||||
|
||||
m_image_get metric.Int64Counter
|
||||
m_image_post metric.Int64Counter
|
||||
m_image_error metric.Int64Counter
|
||||
}
|
||||
|
||||
const DefaultMaxSize = 500 * 1024 * 1024
|
||||
|
||||
func New(store string, maxSize int64) (a *image, err error) {
|
||||
func New(ctx context.Context, store string, maxSize int64) (a *image, err error) {
|
||||
a = &image{
|
||||
store: store,
|
||||
maxSize: DefaultMaxSize,
|
||||
@@ -45,13 +50,31 @@ func New(store string, maxSize int64) (a *image, err error) {
|
||||
return nil, fmt.Errorf("image Store location [%s] does not exist or is not writable", a.store)
|
||||
}
|
||||
|
||||
return a, nil
|
||||
m := lg.Meter(ctx)
|
||||
|
||||
var merr error
|
||||
a.m_image_get, merr = m.Int64Counter("m_image_get",
|
||||
metric.WithDescription("retrieve image from store"),
|
||||
)
|
||||
err = errors.Join(err, merr)
|
||||
|
||||
a.m_image_post, merr = m.Int64Counter("m_image_post",
|
||||
metric.WithDescription("save image to store"),
|
||||
)
|
||||
err = errors.Join(err, merr)
|
||||
|
||||
a.m_image_error, merr = m.Int64Counter("m_image_error",
|
||||
metric.WithDescription("image api error"),
|
||||
)
|
||||
err = errors.Join(err, merr)
|
||||
|
||||
|
||||
return a, err
|
||||
}
|
||||
func (a *image) RegisterHTTP(mux *http.ServeMux) {
|
||||
mux.Handle("/i", http.StripPrefix("/i", a))
|
||||
mux.Handle("/i/", http.StripPrefix("/i/", a))
|
||||
mux.Handle("/3/upload", a)
|
||||
|
||||
}
|
||||
func (a *image) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
@@ -60,10 +83,13 @@ func (a *image) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
switch r.Method {
|
||||
case http.MethodGet, http.MethodHead:
|
||||
a.m_image_get.Add(ctx, 1)
|
||||
|
||||
name := strings.TrimPrefix(r.URL.Path, "/")
|
||||
if name != "" {
|
||||
rdr, head, err := a.loadFile(ctx, name)
|
||||
if err != nil {
|
||||
a.m_image_error.Add(ctx, 1)
|
||||
writeError(w, err)
|
||||
span.RecordError(err)
|
||||
return
|
||||
@@ -88,6 +114,8 @@ func (a *image) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
case http.MethodPost:
|
||||
a.m_image_post.Add(ctx, 1)
|
||||
|
||||
var err error
|
||||
defer r.Body.Close()
|
||||
|
||||
@@ -121,6 +149,7 @@ func (a *image) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
id, err := a.put(ctx, fd, length)
|
||||
if err != nil {
|
||||
a.m_image_error.Add(ctx, 1)
|
||||
writeError(w, err)
|
||||
span.RecordError(err)
|
||||
return
|
||||
@@ -183,7 +212,7 @@ func (a *image) loadFile(ctx context.Context, name string) (io.ReadSeekCloser, *
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
f.Seek(0,0)
|
||||
f.Seek(0, 0)
|
||||
|
||||
return f,
|
||||
&Header{Mime: mime, Modified: stat.ModTime(), ETag: name},
|
||||
|
||||
@@ -2,6 +2,7 @@ package image_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"mime/multipart"
|
||||
@@ -21,10 +22,12 @@ var testImage = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z/C
|
||||
func TestPostImgur(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
dir, err := os.MkdirTemp("", "image")
|
||||
is.NoErr(err)
|
||||
|
||||
im, err := image.New(dir, 0)
|
||||
im, err := image.New(ctx, dir, 0)
|
||||
is.NoErr(err)
|
||||
|
||||
{
|
||||
@@ -78,11 +81,12 @@ func TestPostImgur(t *testing.T) {
|
||||
func TestPost(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
ctx := context.Background()
|
||||
|
||||
dir, err := os.MkdirTemp("", "image")
|
||||
is.NoErr(err)
|
||||
|
||||
im, err := image.New(dir, 0)
|
||||
im, err := image.New(ctx, dir, 0)
|
||||
is.NoErr(err)
|
||||
|
||||
{
|
||||
@@ -107,7 +111,6 @@ func TestPost(t *testing.T) {
|
||||
|
||||
s := base64.StdEncoding.EncodeToString(res.Body.Bytes())
|
||||
is.Equal(s, testImage)
|
||||
|
||||
}
|
||||
|
||||
err = os.RemoveAll(dir)
|
||||
|
||||
Reference in New Issue
Block a user