Skip to content

Commit

Permalink
feat: support http proxy (#119)
Browse files Browse the repository at this point in the history
  • Loading branch information
missuo authored Jun 17, 2024
1 parent 8bf6d05 commit f78de58
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 20 deletions.
10 changes: 9 additions & 1 deletion config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* @Author: Vincent Yang
* @Date: 2024-04-23 00:39:03
* @LastEditors: Vincent Yang
* @LastEditTime: 2024-04-23 00:43:43
* @LastEditTime: 2024-06-18 02:40:52
* @FilePath: /DeepLX/config.go
* @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo
Expand Down Expand Up @@ -50,6 +50,14 @@ func initConfig() *Config {
}
}

// HTTP Proxy flag
flag.StringVar(&cfg.Proxy, "proxy", "", "set the proxy URL for HTTP requests")
if cfg.Proxy == "" {
if proxy, ok := os.LookupEnv("PROXY"); ok {
cfg.Proxy = proxy
}
}

flag.Parse()
return cfg
}
29 changes: 24 additions & 5 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/*
* @Author: Vincent Yang
* @Date: 2023-07-01 21:45:34
* @LastEditors: Vincent Young
* @LastEditTime: 2024-04-23 14:49:35
* @LastEditors: Vincent Yang
* @LastEditTime: 2024-06-18 02:41:55
* @FilePath: /DeepLX/main.go
* @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo
Expand All @@ -15,6 +15,7 @@ import (
"fmt"
"log"
"net/http"
"net/url"
"os"
"strings"

Expand Down Expand Up @@ -62,6 +63,21 @@ func main() {
fmt.Printf("DeepL X has been successfully launched! Listening on 0.0.0.0:%v\n", cfg.Port)
fmt.Println("Developed by sjlleo <[email protected]> and missuo <[email protected]>.")

// Set Proxy
proxyURL := os.Getenv("PROXY")
if proxyURL == "" {
proxyURL = cfg.Proxy
}
if proxyURL != "" {
proxy, err := url.Parse(proxyURL)
if err != nil {
log.Fatalf("Failed to parse proxy URL: %v", err)
}
http.DefaultTransport = &http.Transport{
Proxy: http.ProxyURL(proxy),
}
}

if cfg.Token != "" {
fmt.Println("Access token is set.")
}
Expand Down Expand Up @@ -91,8 +107,9 @@ func main() {
targetLang := req.TargetLang
translateText := req.TransText
authKey := cfg.AuthKey
proxyURL := cfg.Proxy

result, err := translateByDeepLX(sourceLang, targetLang, translateText, authKey)
result, err := translateByDeepLX(sourceLang, targetLang, translateText, authKey, proxyURL)
if err != nil {
log.Fatalf("Translation failed: %s", err)
}
Expand Down Expand Up @@ -124,6 +141,7 @@ func main() {
sourceLang := req.SourceLang
targetLang := req.TargetLang
translateText := req.TransText
proxyURL := cfg.Proxy

dlSession := cfg.DlSession

Expand All @@ -146,7 +164,7 @@ func main() {
return
}

result, err := translateByDeepLXPro(sourceLang, targetLang, translateText, dlSession)
result, err := translateByDeepLXPro(sourceLang, targetLang, translateText, dlSession, proxyURL)
if err != nil {
log.Fatalf("Translation failed: %s", err)
}
Expand Down Expand Up @@ -174,6 +192,7 @@ func main() {
r.POST("/v2/translate", authMiddleware(cfg), func(c *gin.Context) {
authorizationHeader := c.GetHeader("Authorization")
var authKey string
proxyURL := cfg.Proxy

if strings.HasPrefix(authorizationHeader, "DeepL-Auth-Key") {
parts := strings.Split(authorizationHeader, " ")
Expand Down Expand Up @@ -206,7 +225,7 @@ func main() {
targetLang = jsonData.TargetLang
}

result, err := translateByDeepLX("", targetLang, translateText, authKey)
result, err := translateByDeepLX("", targetLang, translateText, authKey, proxyURL)
if err != nil {
log.Fatalf("Translation failed: %s", err)
}
Expand Down
71 changes: 58 additions & 13 deletions translate.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"io"
"log"
"net/http"
"net/url"
"strings"

"github.com/abadojack/whatlanggo"
Expand Down Expand Up @@ -46,8 +47,8 @@ func initDeepLXData(sourceLang string, targetLang string) *PostData {
}
}

func translateByOfficialAPI(text string, sourceLang string, targetLang string, authKey string) (string, error) {
url := "https://api-free.deepl.com/v2/translate"
func translateByOfficialAPI(text string, sourceLang string, targetLang string, authKey string, proxyURL string) (string, error) {
freeURL := "https://api-free.deepl.com/v2/translate"
textArray := strings.Split(text, "\n")

payload := PayloadAPI{
Expand All @@ -61,15 +62,28 @@ func translateByOfficialAPI(text string, sourceLang string, targetLang string, a
return "", err
}

req, err := http.NewRequest("POST", url, bytes.NewBuffer(payloadBytes))
req, err := http.NewRequest("POST", freeURL, bytes.NewBuffer(payloadBytes))
if err != nil {
return "", err
}

req.Header.Set("Authorization", "DeepL-Auth-Key "+authKey)
req.Header.Set("Content-Type", "application/json")

client := &http.Client{}
var client *http.Client
if proxyURL != "" {
proxy, err := url.Parse(proxyURL)
if err != nil {
return "", err
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxy),
}
client = &http.Client{Transport: transport}
} else {
client = &http.Client{}
}

resp, err := client.Do(req)
if err != nil {
return "", err
Expand Down Expand Up @@ -97,7 +111,7 @@ func translateByOfficialAPI(text string, sourceLang string, targetLang string, a
return sb.String(), nil
}

func translateByDeepLX(sourceLang string, targetLang string, translateText string, authKey string) (DeepLXTranslationResult, error) {
func translateByDeepLX(sourceLang string, targetLang string, translateText string, authKey string, proxyURL string) (DeepLXTranslationResult, error) {
id := getRandomNumber()
if sourceLang == "" {
lang := whatlanggo.DetectLang(translateText)
Expand All @@ -117,7 +131,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
}

// Preparing the request data for the DeepL API
url := "https://www2.deepl.com/jsonrpc"
www2URL := "https://www2.deepl.com/jsonrpc"
id = id + 1
postData := initDeepLXData(sourceLang, targetLang)
text := Text{
Expand All @@ -142,7 +156,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
// Creating a new HTTP POST request with the JSON data as the body
post_byte = []byte(postStr)
reader := bytes.NewReader(post_byte)
request, err := http.NewRequest("POST", url, reader)
request, err := http.NewRequest("POST", www2URL, reader)

if err != nil {
log.Println(err)
Expand All @@ -166,7 +180,23 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
request.Header.Set("Connection", "keep-alive")

// Making the HTTP request to the DeepL API
client := &http.Client{}
var client *http.Client
if proxyURL != "" {
proxy, err := url.Parse(proxyURL)
if err != nil {
return DeepLXTranslationResult{
Code: http.StatusServiceUnavailable,
Message: "Uknown error",
}, nil
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxy),
}
client = &http.Client{Transport: transport}
} else {
client = &http.Client{}
}

resp, err := client.Do(request)
if err != nil {
log.Println(err)
Expand Down Expand Up @@ -208,7 +238,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
continue
} else {
if validity {
translatedText, err := translateByOfficialAPI(translateText, sourceLang, targetLang, authKey)
translatedText, err := translateByOfficialAPI(translateText, sourceLang, targetLang, authKey, proxyURL)
if err != nil {
return DeepLXTranslationResult{
Code: http.StatusTooManyRequests,
Expand Down Expand Up @@ -258,7 +288,7 @@ func translateByDeepLX(sourceLang string, targetLang string, translateText strin
}, nil
}

func translateByDeepLXPro(sourceLang string, targetLang string, translateText string, dlSession string) (DeepLXTranslationResult, error) {
func translateByDeepLXPro(sourceLang string, targetLang string, translateText string, dlSession string, proxyURL string) (DeepLXTranslationResult, error) {
id := getRandomNumber()
if sourceLang == "" {
lang := whatlanggo.DetectLang(translateText)
Expand All @@ -278,7 +308,7 @@ func translateByDeepLXPro(sourceLang string, targetLang string, translateText st
}

// Preparing the request data for the DeepL API
url := "https://api.deepl.com/jsonrpc"
proURL := "https://api.deepl.com/jsonrpc"
id = id + 1
postData := initDeepLXData(sourceLang, targetLang)
text := Text{
Expand All @@ -303,7 +333,7 @@ func translateByDeepLXPro(sourceLang string, targetLang string, translateText st
// Creating a new HTTP POST request with the JSON data as the body
post_byte = []byte(postStr)
reader := bytes.NewReader(post_byte)
request, err := http.NewRequest("POST", url, reader)
request, err := http.NewRequest("POST", proURL, reader)

if err != nil {
log.Println(err)
Expand All @@ -324,7 +354,22 @@ func translateByDeepLXPro(sourceLang string, targetLang string, translateText st
request.Header.Set("Cookie", "dl_session="+dlSession)

// Making the HTTP request to the DeepL API
client := &http.Client{}
var client *http.Client
if proxyURL != "" {
proxy, err := url.Parse(proxyURL)
if err != nil {
return DeepLXTranslationResult{
Code: http.StatusServiceUnavailable,
Message: "DeepL API request failed",
}, nil
}
transport := &http.Transport{
Proxy: http.ProxyURL(proxy),
}
client = &http.Client{Transport: transport}
} else {
client = &http.Client{}
}
resp, err := client.Do(request)
if err != nil {
log.Println(err)
Expand Down
3 changes: 2 additions & 1 deletion types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* @Author: Vincent Yang
* @Date: 2024-03-20 15:43:57
* @LastEditors: Vincent Yang
* @LastEditTime: 2024-04-23 00:37:39
* @LastEditTime: 2024-06-18 02:38:48
* @FilePath: /DeepLX/types.go
* @Telegram: https://t.me/missuo
* @GitHub: https://github.com/missuo
Expand All @@ -16,6 +16,7 @@ type Config struct {
Token string
AuthKey string
DlSession string
Proxy string
}

type Lang struct {
Expand Down

0 comments on commit f78de58

Please sign in to comment.