如何为esp_https_ota调用设置HTTP Header以拉取GitHub私有仓库固件?
问题排查与解决
1. 修复授权头冲突
你当前代码同时调用了setAuthorization()和手动添加Authorization令牌头,二者会产生冲突:setAuthorization()会自动生成Basic Auth格式的授权头,和你手动添加的令牌格式授权头共存时,会导致GitHub的认证逻辑异常,最终优先返回JSON格式的错误响应而非二进制固件。
直接删除http2.setAuthorization(githubname,githubpass);这行即可,GitHub私有资产的令牌认证仅需要Authorization: token <你的令牌>一个头即可正常生效。
2. 修正请求头大小写
部分版本的ESP32 Arduino HTTPClient库对自定义头的大小写处理存在兼容问题,将小写的accept改为首字母大写的标准格式即可:
http2.addHeader("Accept", "application/octet-stream");
3. ESP HTTPS OTA添加自定义头的方案
现有版本的ESP-IDF以及2.0.5版本及以上的Arduino ESP32核心已经支持在OTA流程中添加自定义请求头,不需要额外提交功能请求:
你可以通过esp_https_ota_config_t的http_client_initial_cb回调函数,在HTTP客户端初始化完成后手动插入需要的请求头,示例逻辑如下:
// 回调函数,用于添加自定义头 static esp_err_t http_client_init_callback(esp_http_client_handle_t client) { esp_http_client_set_header(client, "Accept", "application/octet-stream"); esp_http_client_set_header(client, "Authorization", "token 你的令牌"); return ESP_OK; } // OTA初始化逻辑 esp_https_ota_config_t ota_config = { .url = firmwareURL, .cert_pem = GHAPI_CERT, .http_client_initial_cb = http_client_init_callback, }; esp_err_t ret = esp_https_ota(&ota_config);
内容的提问来源于stack exchange,提问作者Michael Bender
相关产品推荐
相关产品推荐

