Files
ProjectOctopus/agent-common/utils/DownloadUtils.go
2024-06-14 10:37:40 +08:00

113 lines
2.8 KiB
Go
Executable File

package utils
import (
"fmt"
"golang.org/x/net/proxy"
"io"
"net/http"
"net/url"
"os"
)
func DownloadFile(downloadUrl, desFile string) (downloadOk bool, resultLog []string) {
log.InfoF("Downloading file: %s", downloadUrl)
resp, err := http.Get(downloadUrl)
if err != nil {
return false, []string{fmt.Sprintf("Error downloading file: %v", err)}
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return false, []string{fmt.Sprintf("Unexpected status code: %d", resp.StatusCode)}
}
body, err := io.ReadAll(resp.Body)
if err != nil {
return false, []string{fmt.Sprintf("Error reading response body: %v", err)}
}
err = os.WriteFile(desFile, body, 0644)
if err != nil {
return false, []string{fmt.Sprintf("Error writing file to disk: %v", err)}
}
log.InfoF("Downloading complete: %s", downloadUrl)
return true, []string{}
}
func DownloadFileBySocks5(downloadUrl string, socksProxyUrl string, proxyUser string, proxyPass string, desFile string) (downloadOk bool, resultLog []string) {
// 解析下载URL
_, err := url.Parse(downloadUrl)
if err != nil {
resultLog = append(resultLog, "Error parsing download URL: "+err.Error())
return false, resultLog
}
// 创建文件
out, err := os.Create(desFile)
if err != nil {
resultLog = append(resultLog, "Error creating file: "+err.Error())
return false, resultLog
}
defer out.Close()
// 创建HTTP客户端
client := &http.Client{}
// 如果提供了代理URL
if socksProxyUrl != "" {
// 解析代理URL
parsedProxyUrl, err := url.Parse(socksProxyUrl)
if err != nil {
resultLog = append(resultLog, "Error parsing proxy URL: "+err.Error())
return false, resultLog
}
// 使用SOCKS5代理
auth := &proxy.Auth{User: proxyUser, Password: proxyPass}
dialer, err := proxy.SOCKS5("tcp", parsedProxyUrl.Host, auth, proxy.Direct)
if err != nil {
resultLog = append(resultLog, "Error creating SOCKS5 dialer: "+err.Error())
return false, resultLog
}
// 设置HTTP和HTTPS代理
httpTransport := &http.Transport{
Dial: dialer.Dial,
}
client.Transport = httpTransport
}
// 发送HTTP GET请求
resp, err := client.Get(downloadUrl)
if err != nil {
resultLog = append(resultLog, "Error making GET request: "+err.Error())
return false, resultLog
}
defer resp.Body.Close()
// 检查HTTP响应状态码
if resp.StatusCode != http.StatusOK {
resultLog = append(resultLog, "Server returned HTTP status "+resp.Status)
return false, resultLog
}
// 将HTTP响应内容写入文件
_, err = io.Copy(out, resp.Body)
if err != nil {
resultLog = append(resultLog, "Error writing to file: "+err.Error())
return false, resultLog
}
// check file exists
existAndNotNull := FileExistAndNotNull(desFile)
if !existAndNotNull {
return false, []string{
"[DownloadFileBySocks5] - file not exist download error!",
}
}
return true, resultLog
}