golang代码
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
// 代理服务器地址
const proxyAddress = "0.0.0.0:8080"
// 文件下载目录
const downloadDir = "./downloads"
// 要下载的文件类型
var fileTypes = []string{"image/jpeg", "image/png", "application/pdf"}
func main() {
http.HandleFunc("/", handleRequestAndRedirect)
fmt.Printf("Starting proxy server on %s\n", proxyAddress)
if err := http.ListenAndServe(proxyAddress, nil); err != nil {
fmt.Printf("Failed to start server: %v\n", err)
}
}
func handleRequestAndRedirect(w http.ResponseWriter, req *http.Request) {
client := &http.Client{}
// 创建新的请求
newReq, err := http.NewRequest(req.Method, req.URL.String(), req.Body)
if err != nil {
http.Error(w, "Failed to create request", http.StatusInternalServerError)
return
}
// 复制请求头
for key, values := range req.Header {
for _, value := range values {
newReq.Header.Add(key, value)
}
}
// 发送请求
resp, err := client.Do(newReq)
if err != nil {
http.Error(w, "Failed to get response", http.StatusInternalServerError)
return
}
defer resp.Body.Close()
// 复制响应头
for key, values := range resp.Header {
for _, value := range values {
w.Header().Add(key, value)
}
}
// 检查响应内容类型
contentType := resp.Header.Get("Content-Type")
if shouldDownloadFile(contentType) {
// 创建一个新的读取器来读取响应体
bodyCopy := io.TeeReader(resp.Body, w)
err := downloadFile(bodyCopy, contentType)
if err != nil {
fmt.Printf("Failed to download file: %v\n", err)
}
} else {
// 将响应内容复制到客户端
w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
}
}
func shouldDownloadFile(contentType string) bool {
for _, fileType := range fileTypes {
if strings.Contains(contentType, fileType) {
return true
}
}
return false
}
func downloadFile(body io.Reader, contentType string) error {
// 创建下载目录
err := os.MkdirAll(downloadDir, os.ModePerm)
if err != nil {
return err
}
// 创建文件
fileName := fmt.Sprintf("%s/%s", downloadDir, generateFileName(contentType))
file, err := os.Create(fileName)
if err != nil {
return err
}
defer file.Close()
// 将内容写入文件
_, err = io.Copy(file, body)
return err
}
func generateFileName(contentType string) string {
ext := ""
switch contentType {
case "image/jpeg":
ext = "jpg"
case "image/png":
ext = "png"
case "application/pdf":
ext = "pdf"
default:
ext = "bin"
}
return fmt.Sprintf("%d.%s", os.Getpid(), ext)
}测试代码
<?php
// 要访问的URL
$url = "http://repo.bfw.wiki/bfwrepo/image/5d6539385ad28.png";
// 代理服务器地址和端口
$proxy = "http://golang的代理服务:8080";
// 代理服务器用户名和密码(如果需要)
$proxy_user = "username";
$proxy_password = "password";
// 初始化cURL会话
$ch = curl_init();
// 设置cURL选项
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 设置代理
curl_setopt($ch, CURLOPT_PROXY, $proxy);
// 如果代理服务器需要身份验证,设置代理用户名和密码
//curl_setopt($ch, CURLOPT_PROXYUSERPWD, "$proxy_user:$proxy_password");
// 发送请求并获取响应
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
} else {
// 输出响应
echo $response;
}
// 关闭cURL会话
curl_close($ch);
?> 网友回复


