1.1.0
このコミットが含まれているのは:
コミット
a1be1d7224
|
@ -0,0 +1,5 @@
|
|||
# 1.1.0
|
||||
* 変な画像があればも、止まらない様にした
|
||||
|
||||
# 1.0.0
|
||||
* 最初リリース
|
7
Makefile
7
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
|
||||
|
|
|
@ -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
|
||||
```
|
115
main.go
115
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,
|
||||
`<style>body { background: #1b0326; color: #f545f5; } a { color: #ff88ff; }</style><p style="text-align: center;"><a href="https://technicalsuwako.moe/blog/%s-%s">%s-%s</a> | <a href="https://gitler.moe/suwako/%s">Git</a> | <a href="https://076.moe/">076</a></p>`,
|
||||
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)
|
||||
}
|
||||
|
|
読み込み中…
新しいイシューから参照