@ -5,64 +5,17 @@ import (
"compress/gzip"
"errors"
"fmt"
"image"
"image/jpeg"
"image/png"
"io"
"io/fs"
"net/http"
"path/filepath"
"strings"
"time"
"github.com/mediocregopher/blog.mediocregopher.com/srv/http/apiutil"
"github.com/mediocregopher/blog.mediocregopher.com/srv/post"
"github.com/mediocregopher/blog.mediocregopher.com/srv/post/asset "
"github.com/omeid/go-tarfs"
"golang.org/x/image/draw"
)
func isImgResizable ( path string ) bool {
switch strings . ToLower ( filepath . Ext ( path ) ) {
case ".jpg" , ".jpeg" , ".png" :
return true
default :
return false
}
}
func resizeImage ( out io . Writer , in io . Reader , maxWidth float64 ) error {
img , format , err := image . Decode ( in )
if err != nil {
return fmt . Errorf ( "decoding image: %w" , err )
}
imgRect := img . Bounds ( )
imgW , imgH := float64 ( imgRect . Dx ( ) ) , float64 ( imgRect . Dy ( ) )
if imgW > maxWidth {
newH := imgH * maxWidth / imgW
newImg := image . NewRGBA ( image . Rect ( 0 , 0 , int ( maxWidth ) , int ( newH ) ) )
// Resize
draw . BiLinear . Scale (
newImg , newImg . Bounds ( ) , img , img . Bounds ( ) , draw . Over , nil ,
)
img = newImg
}
switch format {
case "jpeg" :
return jpeg . Encode ( out , img , nil )
case "png" :
return png . Encode ( out , img )
default :
return fmt . Errorf ( "unknown image format %q" , format )
}
}
func ( a * api ) managePostAssetsHandler ( ) http . Handler {
tpl := a . mustParseBasedTpl ( "post-assets-manage.html" )
@ -88,38 +41,6 @@ func (a *api) managePostAssetsHandler() http.Handler {
} )
}
type postAssetArchiveInfo struct {
path string
id string
subPath string
isGzipped bool
}
func extractPostAssetArchiveInfo ( path string ) ( postAssetArchiveInfo , bool ) {
var info postAssetArchiveInfo
info . path = strings . TrimPrefix ( path , "/" )
info . id , info . subPath , _ = strings . Cut ( info . path , "/" )
switch {
case strings . HasSuffix ( info . id , ".tar.gz" ) ,
strings . HasSuffix ( info . id , ".tgz" ) :
info . isGzipped = true
case strings . HasSuffix ( info . id , ".tar" ) :
// ok
default :
// unsupported
return postAssetArchiveInfo { } , false
}
return info , true
}
func ( a * api ) writePostAsset (
rw http . ResponseWriter ,
r * http . Request ,
@ -170,7 +91,7 @@ func (a *api) handleGetPostAssetArchive(
err := a . params . PostAssetStore . Get ( info . id , buf )
if errors . Is ( err , pos t. ErrAsset NotFound ) {
if errors . Is ( err , asse t. ErrNotFound ) {
http . Error ( rw , "asset not found" , 404 )
return
} else if err != nil {
@ -194,6 +115,8 @@ func (a *api) handleGetPostAssetArchive(
}
}
// TODO everything from here down needs to be moved to the archive loader
tarFS , err := tarfs . New ( from )
if err != nil {
@ -244,7 +167,7 @@ func (a *api) getPostAssetHandler() http.Handler {
err := a . params . PostAssetStore . Get ( id , buf )
if errors . Is ( err , pos t. ErrAsset NotFound ) {
if errors . Is ( err , asse t. ErrNotFound ) {
http . Error ( rw , "Asset not found" , 404 )
return
} else if err != nil {
@ -297,7 +220,7 @@ func (a *api) deletePostAssetHandler() http.Handler {
err := a . params . PostAssetStore . Delete ( id )
if errors . Is ( err , pos t. ErrAsset NotFound ) {
if errors . Is ( err , asse t. ErrNotFound ) {
http . Error ( rw , "Asset not found" , 404 )
return
} else if err != nil {