From a1be1d7224a3d6fa0b0f388b24ab5265755ea21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Thu, 9 Nov 2023 13:39:46 +0900 Subject: [PATCH] 1.1.0 --- CHANGELOG.md | 5 +++ Makefile | 7 +--- README.md | 24 +++++++++++ main.go | 115 ++++++++++++++++++++++++++++++++++----------------- 4 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 README.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..dcad44c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# 1.1.0 +* 変な画像があればも、止まらない様にした + +# 1.0.0 +* 最初リリース diff --git a/Makefile b/Makefile index bdfbe01..6e42ab9 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,6 @@ NAME=imgproxy VERSION := $(shell cat main.go | grep "var version" | awk '{print $$4}' | sed "s/\"//g") -# Linux、Illumos -PREFIX=/usr -# FreeBSDとOpenBSD -#PREFIX=/usr/local -# NetBSD -#PREFIX=/usr/pkg +PREFIX=/usr/local CC=CGO_ENABLED=0 go build # リリース。なし=デバッグ。 RELEASE=-ldflags="-s -w" -buildvcs=false diff --git a/README.md b/README.md new file mode 100644 index 0000000..4f93e4b --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# imgproxy + +## 設置方法 + +### Linux、Haiku、Illumos + +```sh +make +doas make install PREFIX=/usr +``` + +### FreeBSD、OpenBSD、Dragonfly BSD + +```sh +gmake +doas gmake install +``` + +### NetBSD + +```sh +gmake +doas gmake install PREFIX=/usr/pkg +``` diff --git a/main.go b/main.go index 84095e7..a71f4dd 100644 --- a/main.go +++ b/main.go @@ -2,62 +2,103 @@ package main import ( "fmt" - "net/http" "io" "log" - "net/url" + "net/http" + "strings" + "time" ) -var version = "1.0.0" -var client = http.Client{} +var sofname = "imgproxy" +var version = "1.1.0" +var client = http.Client{ + Timeout: time.Second * 30, +} -func imgproxy (w http.ResponseWriter, r *http.Request) { - // URLを確認 - uri, err := url.Parse("https:/" + r.URL.Path) +func fetchImage(curl string, nurl string) (*http.Response, error) { + req, err := http.NewRequest("GET", curl, nil) if err != nil { - fmt.Println(err) - return + return nil, err } - // HTTPリク - req, err := http.NewRequest("GET", "https:/" + r.URL.Path, nil) + resp, err := client.Do(req) if err != nil { - fmt.Println(err) - return - } - - // Pixivかどうかの確認 - if uri.Host == "i.pximg.net" || uri.Host == "s.pximg.net" { - req.Header.Set("Referer", "https://www.pixiv.net/") - } - - // r.URL.Pathは「/」で始まるから、「https://」じゃなくて、「https:/」となります。 - img, err := client.Do(req) - if err != nil { - fmt.Fprintf(w, "Error %d", err) - return + return nil, err } // 画像だけをプロクシーする様に - ctype := img.Header.Get("Content-Type") + ctype := resp.Header.Get("Content-Type") if ctype != "image/jpeg" && ctype != "image/png" && ctype != "image/gif" && ctype != "image/tga" && ctype != "image/targa" && ctype != "image/webp" { + return nil, fmt.Errorf("画像ではありません: %s", ctype) + } + + return resp, nil +} + +func serveImage(w http.ResponseWriter, img *http.Response) { + w.Header().Set("Content-Type", img.Header.Get("Content-Type")) + w.Header().Set("Content-Length", fmt.Sprint(img.ContentLength)) + if _, err := io.Copy(w, img.Body); err != nil { + log.Printf("画像を出力に失敗: %v", err) + } +} + +func pixivImg(w http.ResponseWriter, req *http.Request) { + resp, err := client.Do(req) + if err != nil { + log.Printf("Pixivから画像を受取に失敗: %v", err) + http.Error(w, "Pixivから画像を受取に失敗。", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + serveImage(w, resp) +} + +func imgproxy(w http.ResponseWriter, r *http.Request) { + // URLを修正 + nurl := r.URL.Path[1:] + if nurl == "" { + fmt.Fprintf( + w, + `

%s-%s | Git | 076

`, + sofname, + strings.ReplaceAll(version, ".", ""), + sofname, + version, + sofname, + ) return } - // ヘッダー - w.Header().Set("Content-Length", fmt.Sprint(img.ContentLength)) - w.Header().Set("Content-Type", img.Header.Get("Content-Type")) - - // 表示 - if _, err = io.Copy(w, img.Body); err != nil { - log.Fatalf("ioエラー:%v", err) + // Pixivの場合 + if strings.Contains(nurl, "s.pximg.net") || strings.Contains(nurl, "i.pximg.net") { + req, _ := http.NewRequest("GET", "https://" + nurl, nil) + req.Header.Set("Referer", "https://www.pixiv.net/") + pixivImg(w, req) + return } - // もう要らない - img.Body.Close() + var img *http.Response + var err error + + // HTTPリク + img, err = fetchImage("https://" + nurl, nurl) + if err != nil { + img, err = fetchImage("http://" + nurl, nurl) + } + + if err != nil { + log.Printf("画像を受け取りに失敗: %v", err) + http.Error(w, "画像を受け取りに失敗。", http.StatusInternalServerError) + return + } + + defer img.Body.Close() + serveImage(w, img) } -func main () { +func main() { http.HandleFunc("/", imgproxy) - http.ListenAndServe(":9810", nil) + fmt.Println("http://0.0.0.0:9810 でサーバーを実行中。終了するには、CTRL+Cを押して下さい。") + http.ListenAndServe("0.0.0.0:9810", nil) }