proxied fetch support
This commit is contained in:
parent
c2799c9494
commit
08bc342fd6
@ -7,7 +7,11 @@ import (
|
||||
"context"
|
||||
"errors"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/http/httputil"
|
||||
"net/url"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
@ -27,6 +31,7 @@ type App struct {
|
||||
HasConfigData bool
|
||||
ConfigData map[string]any
|
||||
Dev bool
|
||||
proxyPort int
|
||||
exDir string
|
||||
cmdPrefix string
|
||||
}
|
||||
@ -36,6 +41,57 @@ func NewApp() *App {
|
||||
return &App{}
|
||||
}
|
||||
|
||||
func (a *App) newFetchProxy() {
|
||||
go func() {
|
||||
handler := func(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method == "OPTIONS" {
|
||||
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
|
||||
w.Header().Set("Access-Control-Allow-Headers", "*")
|
||||
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
return
|
||||
}
|
||||
proxy := &httputil.ReverseProxy{
|
||||
ModifyResponse: func(res *http.Response) error {
|
||||
res.Header.Set("Access-Control-Allow-Origin", "*")
|
||||
return nil
|
||||
},
|
||||
Director: func(req *http.Request) {
|
||||
realTarget := req.Header.Get("Real-Target")
|
||||
if realTarget != "" {
|
||||
target, err := url.Parse(realTarget)
|
||||
if err != nil {
|
||||
log.Printf("Error parsing target URL: %v\n", err)
|
||||
return
|
||||
}
|
||||
req.Header.Set("Accept", "*/*")
|
||||
req.Header.Del("Origin")
|
||||
req.Header.Del("Referer")
|
||||
req.Header.Del("Real-Target")
|
||||
req.Header.Del("Sec-Fetch-Dest")
|
||||
req.Header.Del("Sec-Fetch-Mode")
|
||||
req.Header.Del("Sec-Fetch-Site")
|
||||
req.URL.Scheme = target.Scheme
|
||||
req.URL.Host = target.Host
|
||||
req.URL.Path = target.Path
|
||||
log.Println("Proxying to", realTarget)
|
||||
} else {
|
||||
log.Println("Real-Target header is missing")
|
||||
}
|
||||
},
|
||||
}
|
||||
proxy.ServeHTTP(w, r)
|
||||
}
|
||||
http.HandleFunc("/", handler)
|
||||
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
a.proxyPort = listener.Addr().(*net.TCPAddr).Port
|
||||
|
||||
http.Serve(listener, nil)
|
||||
}()
|
||||
}
|
||||
|
||||
// startup is called when the app starts. The context is saved
|
||||
// so we can call the runtime methods
|
||||
func (a *App) OnStartup(ctx context.Context) {
|
||||
@ -76,6 +132,7 @@ func (a *App) OnStartup(ctx context.Context) {
|
||||
a.midiLoop()
|
||||
a.watchFs()
|
||||
a.monitorHardware()
|
||||
a.newFetchProxy()
|
||||
}
|
||||
|
||||
func (a *App) OnBeforeClose(ctx context.Context) bool {
|
||||
@ -239,3 +296,7 @@ func (a *App) RestartApp() error {
|
||||
func (a *App) GetPlatform() string {
|
||||
return runtime.GOOS
|
||||
}
|
||||
|
||||
func (a *App) GetProxyPort() int {
|
||||
return a.proxyPort
|
||||
}
|
||||
|
@ -63,6 +63,7 @@ class CommonStore {
|
||||
monitorData: MonitorData | null = null;
|
||||
depComplete: boolean = false;
|
||||
platform: Platform = 'windows';
|
||||
proxyPort: number = 0;
|
||||
lastModelName: string = '';
|
||||
// presets manager
|
||||
editingPreset: Preset | null = null;
|
||||
@ -323,6 +324,10 @@ class CommonStore {
|
||||
this.platform = value;
|
||||
}
|
||||
|
||||
setProxyPort(value: number) {
|
||||
this.proxyPort = value;
|
||||
}
|
||||
|
||||
setCurrentInput(value: string) {
|
||||
this.currentInput = value;
|
||||
}
|
||||
|
@ -310,6 +310,24 @@ export function bytesToReadable(size: number) {
|
||||
else return bytesToGb(size) + ' GB';
|
||||
}
|
||||
|
||||
export async function getReqUrl(port: number, path: string, isCore: boolean = false): Promise<{
|
||||
url: string,
|
||||
headers: { [key: string]: string }
|
||||
}> {
|
||||
const realUrl = getServerRoot(port, isCore) + path;
|
||||
if (commonStore.platform === 'web')
|
||||
return {
|
||||
url: realUrl,
|
||||
headers: {}
|
||||
};
|
||||
if (!commonStore.proxyPort)
|
||||
await GetProxyPort().then(p => commonStore.setProxyPort(p));
|
||||
return {
|
||||
url: `http://127.0.0.1:${commonStore.proxyPort}`,
|
||||
headers: { 'Real-Target': realUrl }
|
||||
};
|
||||
}
|
||||
|
||||
export function getServerRoot(defaultLocalPort: number, isCore: boolean = false) {
|
||||
const coreCustomApiUrl = commonStore.settings.coreApiUrl.trim().replace(/\/$/, '');
|
||||
if (isCore && coreCustomApiUrl)
|
||||
|
@ -115,6 +115,12 @@ if (!window.go) {
|
||||
defineApp('ListDirFiles', async () => {
|
||||
return []
|
||||
})
|
||||
defineApp('GetAbsPath', async (path) => {
|
||||
return path
|
||||
})
|
||||
defineApp('GetProxyPort', async () => {
|
||||
return 0
|
||||
})
|
||||
defineApp('OpenOpenFileDialog', webOpenOpenFileDialog)
|
||||
defineApp('OpenSaveFileDialog', async (filterPattern, defaultFileName, savedContent) => {
|
||||
const saver = await import('file-saver')
|
||||
|
2
frontend/wailsjs/go/backend_golang/App.d.ts
generated
vendored
2
frontend/wailsjs/go/backend_golang/App.d.ts
generated
vendored
@ -32,6 +32,8 @@ export function GetAbsPath(arg1:string):Promise<string>;
|
||||
|
||||
export function GetPlatform():Promise<string>;
|
||||
|
||||
export function GetProxyPort():Promise<number>;
|
||||
|
||||
export function GetPyError():Promise<string>;
|
||||
|
||||
export function InstallPyDep(arg1:string,arg2:boolean):Promise<string>;
|
||||
|
4
frontend/wailsjs/go/backend_golang/App.js
generated
4
frontend/wailsjs/go/backend_golang/App.js
generated
@ -62,6 +62,10 @@ export function GetPlatform() {
|
||||
return window['go']['backend_golang']['App']['GetPlatform']();
|
||||
}
|
||||
|
||||
export function GetProxyPort() {
|
||||
return window['go']['backend_golang']['App']['GetProxyPort']();
|
||||
}
|
||||
|
||||
export function GetPyError() {
|
||||
return window['go']['backend_golang']['App']['GetPyError']();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user