mirror of
				https://github.com/therootcompany/telebit.git
				synced 2025-10-31 21:32:45 +00:00 
			
		
		
		
	add missing http01proxy file
This commit is contained in:
		
							parent
							
								
									e63b99d49b
								
							
						
					
					
						commit
						7dff34e6e3
					
				
							
								
								
									
										83
									
								
								internal/http01proxy/proxy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								internal/http01proxy/proxy.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | ||||
| package http01proxy | ||||
| 
 | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"net/http/httputil" | ||||
| 	"net/url" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
| 
 | ||||
| // ListenAndServe will start the HTTP-01 proxy | ||||
| func ListenAndServe(target string, timeout time.Duration) error { | ||||
| 	target = strings.TrimSuffix(target, "/") | ||||
| 
 | ||||
| 	// TODO accept listener? | ||||
| 	targetURL, err := url.Parse(target) | ||||
| 	if nil != err { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	//proxyHandler := httputil.NewSingleHostReverseProxy(targetURL) | ||||
| 	proxyHandler := &httputil.ReverseProxy{ | ||||
| 		Director: func(req *http.Request) { | ||||
| 			req.Header.Del("X-Forwarded-For") | ||||
| 			req.Header.Del("X-Forwarded-Proto") | ||||
| 			req.Header.Del("X-Forwarded-Port") | ||||
| 
 | ||||
| 			targetQuery := targetURL.RawQuery | ||||
| 			req.URL.Scheme = targetURL.Scheme | ||||
| 			req.URL.Host = targetURL.Host | ||||
| 			req.Host = targetURL.Host | ||||
| 			//req.Header.Set("Host", targetURL.Host) | ||||
| 			req.URL.Path, req.URL.RawPath = joinURLPath(targetURL, req.URL) | ||||
| 
 | ||||
| 			if targetQuery == "" || req.URL.RawQuery == "" { | ||||
| 				req.URL.RawQuery = targetQuery + req.URL.RawQuery | ||||
| 			} else { | ||||
| 				req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery | ||||
| 			} | ||||
| 
 | ||||
| 			if _, ok := req.Header["User-Agent"]; !ok { | ||||
| 				// explicitly disable User-Agent so it's not set to default value | ||||
| 				req.Header.Set("User-Agent", "") | ||||
| 			} | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	return http.ListenAndServe(":80", proxyHandler) | ||||
| } | ||||
| 
 | ||||
| // Taken from https://golang.org/src/net/http/httputil/reverseproxy.go | ||||
| func joinURLPath(a, b *url.URL) (path, rawpath string) { | ||||
| 	if a.RawPath == "" && b.RawPath == "" { | ||||
| 		return singleJoiningSlash(a.Path, b.Path), "" | ||||
| 	} | ||||
| 	// Same as singleJoiningSlash, but uses EscapedPath to determine | ||||
| 	// whether a slash should be added | ||||
| 	apath := a.EscapedPath() | ||||
| 	bpath := b.EscapedPath() | ||||
| 
 | ||||
| 	aslash := strings.HasSuffix(apath, "/") | ||||
| 	bslash := strings.HasPrefix(bpath, "/") | ||||
| 
 | ||||
| 	switch { | ||||
| 	case aslash && bslash: | ||||
| 		return a.Path + b.Path[1:], apath + bpath[1:] | ||||
| 	case !aslash && !bslash: | ||||
| 		return a.Path + "/" + b.Path, apath + "/" + bpath | ||||
| 	} | ||||
| 	return a.Path + b.Path, apath + bpath | ||||
| } | ||||
| 
 | ||||
| func singleJoiningSlash(a, b string) string { | ||||
| 	aslash := strings.HasSuffix(a, "/") | ||||
| 	bslash := strings.HasPrefix(b, "/") | ||||
| 	switch { | ||||
| 	case aslash && bslash: | ||||
| 		return a + b[1:] | ||||
| 	case !aslash && !bslash: | ||||
| 		return a + "/" + b | ||||
| 	} | ||||
| 	return a + b | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user