Skip to content

🌐 HTTP 下载

pkg/composerutils/http.go 提供带代理与超时控制的文件下载函数,常用于下载 Composer phar 包、包索引等。

DownloadConfig

go
type DownloadConfig struct {
    UseProxy       bool
    ProxyURL       string
    TimeoutSeconds int
}
字段类型说明
UseProxybool是否启用代理
ProxyURLstring代理地址(仅 UseProxy=true 时生效)
TimeoutSecondsint超时秒数,默认 60

DownloadFile

从 URL 下载文件到本地路径,支持 HTTP/HTTPS、代理、超时。目标文件已存在会被覆盖。

go
func DownloadFile(sourceURL, destPath string, config DownloadConfig) error
参数类型说明
sourceURLstring下载源 URL
destPathstring本地存储路径
configDownloadConfig下载配置

可能错误(均包装为 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 时即依赖此能力。

进阶

  • Mock 下载行为见 Mock 接口MockDownloadHelper
  • 实际下载 composer.phar 的封装见 安装器

基于 MIT 许可证发布