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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user