banner
RustyNail

RustyNail

coder. 【blog】https://rustynail.me 【nostr】wss://ts.relays.world/ wss://relays.world/nostr

Go浪文件下载代理

直接代碼

package main

import (
	"bytes"
	"fmt"
	"io"
	"log"
	"net"
	"net/url"
	"strings"
)

func App() {
	listener, err := net.Listen("tcp", ":9999")
	if err != nil {
		println("啟動失敗, ", err.Error())
	}
	for {
		client, err := listener.Accept()
		println("新客戶端……")
		if err != nil {
			println("接受失敗, ", err.Error())
		}
		// 處理客戶端請求
		go func() {
			var b [1024]byte
			n, err := client.Read(b[:])
			if err != nil {
				println("讀取標頭失敗,", err.Error())
			}
			var method, host, address string
			println(string(b[:]))
			fmt.Sscanf(string(b[:bytes.IndexByte(b[:], '\n')]), "%s%s", &method, &host)
			hostPortURL, err := url.Parse(host)
			if err != nil {
				log.Println(err)
				return
			}
			if hostPortURL.Opaque == "443" { //https訪問
				address = hostPortURL.Scheme + ":443"
			} else {                                            //http訪問
				if strings.Index(hostPortURL.Host, ":") == -1 { //host不帶端口, 默認80
					address = hostPortURL.Host + ":80"
				} else {
					address = hostPortURL.Host
				}
			}
			server, err := net.Dial("tcp", address)
			if err != nil {
				log.Println(err)
				return
			}
			if method == "CONNECT" {
				fmt.Fprint(client, "HTTP/1.1 200 Connection established\r\n\r\n")
			} else {
				server.Write(b[:n])
			}
			//進行轉發
			go io.Copy(server, client)
			io.Copy(client, server)
		}()
	}
}

func main() {
	App()
}

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。