代理设置失效(C SDK)
问题1:Windows端Demo设置代理后报错且代理设置失效
现象:
Windows端Demo中设置了代理,程序报错且代理设置未生效。
问题根因:
某些SDK版本中Demo使用的头文件 eSDKOBS.h 与SDK的头文件未同步更新,Demo中缺少新增的结构体成员(如 obs_upload_file_server_callback),导致代理设置失效。
解决办法:
- 升级到最新版本SDK(推荐)。
- 如需使用旧版本,将SDK安装目录下 source/eSDK_OBS_API/eSDK_OBS_API_C++/build/obs/demo/eSDKOBS.h 复制到 source/eSDK_OBS_API/eSDK_OBS_API_C++/inc/ 目录替换原文件,并按新头文件中的接口变化调整Demo代码。
问题2:设置了代理仍然连接失败
现象:
通过 obs_http_request_option 正确设置了 proxy_host 和 proxy_auth,部分请求仍然连接失败。
问题根因:
SDK内部 get_api_version 函数未读取用户设置的代理配置,导致该请求未走代理通道。此为SDK已知缺陷。
解决办法:
升级到最新版本SDK。如需临时修复,可在SDK源码 request.c 的 get_api_version 函数中,参考 setup_curl 函数的代理设置方式,添加 CURLOPT_PROXY 和 CURLOPT_PROXYUSERPWD 项的设置逻辑。
正确的代理设置方式
通过 obs_http_request_option 配置代理,相关参数说明详见配置option(C SDK):
#include "eSDKOBS.h"
#include <stdio.h>
int main()
{
obs_status ret_status = obs_initialize(OBS_INIT_ALL);
if (OBS_STATUS_OK != ret_status)
{
printf("obs_initialize failed(%s).\n", obs_get_status_name(ret_status));
return -1;
}
obs_options options;
init_obs_options(&options);
// host_name填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。
options.bucket_options.host_name = "obs.cn-north-4.myhuaweicloud.com";
options.bucket_options.access_key = getenv("ACCESS_KEY_ID");
options.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
options.bucket_options.bucket_name = "example-bucket-name";
// 设置代理服务器
options.request_options.proxy_host = "http://proxy.example.com:8080";
// 设置代理认证信息(格式:username:password),无认证则不设置
options.request_options.proxy_auth = "username:password";
// ... 业务代码 ...
obs_deinitialize();
return 0;
}