🌐 HTTP 下载
pkg/composerutils/http.go 提供带代理与超时控制的文件下载函数,常用于下载 Composer phar 包、包索引等。
DownloadConfig
go
type DownloadConfig struct {
UseProxy bool
ProxyURL string
TimeoutSeconds int
}| 字段 | 类型 | 说明 |
|---|---|---|
UseProxy | bool | 是否启用代理 |
ProxyURL | string | 代理地址(仅 UseProxy=true 时生效) |
TimeoutSeconds | int | 超时秒数,默认 60 |
DownloadFile
从 URL 下载文件到本地路径,支持 HTTP/HTTPS、代理、超时。目标文件已存在会被覆盖。
go
func DownloadFile(sourceURL, destPath string, config DownloadConfig) error| 参数 | 类型 | 说明 |
|---|---|---|
sourceURL | string | 下载源 URL |
destPath | string | 本地存储路径 |
config | DownloadConfig | 下载配置 |
可能错误(均包装为 ErrDownloadFailed):
- URL 格式无效
- 网络连接失败
- HTTP 状态码非 200
- 本地文件创建/写入失败
- 超时
go
var ErrDownloadFailed = errors.New("下载失败")示例
go
package main
import (
"fmt"
"github.com/scagogogo/composer-skills/pkg/composerutils"
)
func main() {
// 直连下载
config := composerutils.DownloadConfig{UseProxy: false}
err := composerutils.DownloadFile(
"https://getcomposer.org/composer.phar",
"/tmp/composer.phar",
config,
)
if err != nil {
fmt.Printf("下载失败: %v\n", err)
}
// 使用代理下载大文件
proxyConfig := composerutils.DownloadConfig{
UseProxy: true,
ProxyURL: "http://proxy.example.com:8080",
TimeoutSeconds: 120,
}
_ = composerutils.DownloadFile(
"https://example.com/large-file.tar.gz",
"/downloads/file.tar.gz",
proxyConfig,
)
}实现要点
- 基于
net/http标准客户端,跨平台。 - 代理通过
http.ProxyURL注入到http.Transport。 - 超时通过
http.Client.Timeout控制,默认 60 秒。
与 pkg/repository 的区别
repository.DownloadIndex 专用于下载 Packagist 包索引;composerutils.DownloadFile 是通用的 HTTP 下载工具,可下载任意 URL。pkg/installer 内部下载 composer phar 时即依赖此能力。