cpp-httplib 客户端自动跟随重定向(Follow Redirects)指南:set_follow_location 用法、HTTP→HTTPS 跳转与源码原理
后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载本篇指南以 cpp-httplib 官方 Cookbook 的「リダイレクトを追従する」C04. Follow Redirects为核心讲解 header-only HTTP/HTTPS 客户端库 cpp-httplib 如何默认不跟随 HTTP 3xx 重定向、如何通过set_follow_location(true)一键开启自动跟随以及 HTTP 跳转到 HTTPS 时的 TLS 构建前提、最大重定向次数、跨主机跳转的安全策略等底层细节。读完本文你将能正确处理各类 301/302/303 跳转场景并能基于源码理解重定向的内部调用链。默认行为cpp-httplib 不跟随 3xx 重定向默认情况下cpp-httplib 的客户端不会自动跟随 HTTP 重定向3xx。即使服务器返回302 Found客户端也只会原样把它当作一个状态码为 302 的响应接收下来——不会去读取Location头也不会向新地址重新发起请求。从源码可以确认这一点httplib.h 中ClientImpl的成员follow_location_默认值为false见 httplib.hbool follow_location_ false;同时只有在follow_location_为真时客户端才会在收到 3xx 响应后进入重定向逻辑见 httplib.hif (300 res.status res.status 400 follow_location_) { req std::move(req_save); ret redirect(req, res, error); }也就是说301 Moved Permanently、302 Found、303 See Other、307 Temporary Redirect、308 Permanent Redirect等 3xx 状态码默认都会原样返回给调用方由你自行决定如何处理。开启自动跟随set_follow_location(true)如果希望客户端自动处理重定向只需调用一次set_follow_location(true)httplib::Client cli(http://example.com); cli.set_follow_location(true); auto res cli.Get(/old-path); if (res res-status 200) { std::cout res-body std::endl; }开启后客户端会读取响应中的Location头自动向新 URL 重新发起请求最终把最后一次响应的结果放进res。因此上面的示例中只要最终落点返回 200res-status 200就成立res-body就是最终页面的内容。API 形态与线程安全说明set_follow_location在公开的Client类上也有同名方法内部转发给ClientImpl见 httplib.hinline void Client::set_follow_location(bool on) { cli_-set_follow_location(on); }SSLClientHTTPS 客户端同样继承/拥有该接口见 httplib.h 声明所以 HTTP 与 HTTPS 客户端都可以使用同一套开关。重定向的内部调用链与细节规则开启跟随之后每次收到 3xx 响应都会走 httplib.h 的ClientImpl::redirect()内部遵循以下规则读取Location头若Location为空则停止跟随返回当前 3xx 响应。解析并解析相对路径Location既可以是绝对 URL也可以是相对路径如/new-path。相对路径会按 RFC 3986 Section 5.2 的规则以当前请求路径为基准解析合并并清理其中的./..段具体实现在detail::resolve_relative_location见 httplib.h。只跟随 http/https如果Location携带了非http/https的 scheme如ftp:、file:直接放弃跟随见 httplib.h。同主机复用当前连接跨主机新建客户端跳转后主机与端口不变时沿用当前客户端重发请求主机或 scheme 变化时会通过create_redirect_client新建一个客户端并补齐 TLS 相关配置详见下文。303 See Other方法自动切换为 GET在 httplib.h 的detail::redirect()中对303 See Other做了特殊处理若原始请求不是GET或HEAD例如 POST则重发时会把方法改为GET并清空请求体和请求头if (res.status StatusCode::SeeOther_303 (req.method ! GET req.method ! HEAD)) { new_req.method GET; new_req.body.clear(); new_req.headers.clear(); }这与 HTTP 规范对 303 的语义一致303 要求客户端用 GET 重新获取资源。307/308 则保留原方法与请求体不会被改写。最大重定向次数默认 20 次为避免重定向循环导致无限请求Request内部维护了redirect_count_初始值为编译期宏CPPHTTPLIB_REDIRECT_MAX_COUNT见 httplib.h#ifndef CPPHTTPLIB_REDIRECT_MAX_COUNT #define CPPHTTPLIB_REDIRECT_MAX_COUNT 20每跟随一次计数减一减到 0 时redirect()会设置Error::ExceedRedirectCount并停止见 httplib.h错误文本为Maximum redirect count exceeded见 httplib.h。如果你在编译时通过-DCPPHTTPLIB_REDIRECT_MAX_COUNTN定义了其他值则以你的定义为准。跨主机跳转的凭据与 TLS 配置策略跨主机或跨 scheme跳转时cpp-httplib 会新建客户端并执行一套更谨慎的配置见 httplib.h目标是 HTTPS 时创建SSLClient并把原客户端的证书校验开关enable_server_certificate_verification、enable_server_hostname_verification、系统 CA 模式、CA 证书/证书目录一并转移过去依据 RFC 9110 Section 15.4 的语义跨主机跳转时不会转发 Authorization 等凭据头避免把认证信息泄露给第三方主机见 httplib.h 注释。同主机跳转则直接在当前客户端上重发不受此限制。HTTP → HTTPS 重定向现实中大量站点会把 HTTP 访问重定向到 HTTPS。开启set_follow_location(true)后这类跳转可以被透明处理——即使 schemehttp→https或主机名发生变化客户端也会自动跟随httplib::Client cli(http://example.com); cli.set_follow_location(true); auto res cli.Get(/);关键前提必须启用 TLS 支持警告要跟随指向 HTTPS 的重定向必须使用带 OpenSSL或其他 TLS 后端的 cpp-httplib 构建版本。如果没有 TLS 支持HTTP → HTTPS 的跳转会失败。这与上文的跨主机逻辑一致目标 scheme 变为https时客户端需要创建SSLClient并建立 TLS 连接这要求库在编译时启用了 TLS 后端如CPPHTTPLIB_OPENSSL_SUPPORT。从源码看只有#ifdef CPPHTTPLIB_SSL_ENABLED相关的 TLS 基础设施可用时HTTPS 跳转链路才是完整的。因此请确认你的构建配置包含 OpenSSL/BoringSSL 等 TLS 后端再依赖自动跟随 HTTPS 跳转。配套示例服务端如何生成重定向重定向是双向的——客户端要能跟随服务端也要能生成。仓库中的 example/redirect.cc 演示了完整的 HTTP/HTTPS 双服务器重定向场景HTTP 服务器localhost:8080对任何请求在错误处理器中返回res.set_redirect(https://localhost:8081/)即把流量引导到 HTTPS 服务HTTPS 服务器localhost:8081对/返回res.set_redirect(/hi)相对路径跳转/hi返回正文内容。服务端用到的Response::set_redirect(url, status)默认生成302 Found并自动设置Location头见 httplib.h 与 httplib.h 的实现void set_redirect(const std::string url, int status StatusCode::Found_302);这也从侧面验证了客户端跟随重定向时读取的Location头的来源。注意res.location字段也会记录跳转目标见 httplib.h供上层回调读取。注意事项跟随重定向会拉长请求耗时跟随重定向意味着客户端需要依次发起多次网络请求每次都包含完整的 TCP/TLS 握手与 HTTP 往返整体请求执行时间会随之增长。对于长重定向链或网络较差的场景请务必为客户端配置合理的超时时间。超时配置的具体方法连接超时、读超时、写超时及set_connection_timeout/set_read_timeout/set_write_timeout等参见官方 Cookbook 的 C12. タイムアウトを設定する设置超时英文版见 C12. Set timeouts。此外20 次的最大跟随上限也意味着极端情况下最坏会串行发起 20 次请求建议结合实际场景评估超时预算。小结与速查场景结论默认是否跟随 3xx否3xx 会原样返回follow_location_默认false开启自动跟随cli.set_follow_location(true);一行即可跟随后的响应res保存最后一次最终响应相对路径Location按 RFC 3986 5.2 解析合并非 http/https 跳转不跟随303 响应非 GET/HEAD 自动转为 GET清空 body 与 headers最大跟随次数CPPHTTPLIB_REDIRECT_MAX_COUNT默认 20超出报ExceedRedirectCountHTTP→HTTPS 跳转需带 TLS 后端如 OpenSSL编译否则失败跨主机跳转新建客户端不转发 Authorization 等凭据RFC 9110 §15.4服务端生成跳转res.set_redirect(url, status)默认 302参考 example/redirect.cc耗时提醒多次往返会拉长总耗时超时配置参考 C12核心源码参考httplib.hset_follow_location声明与实现、ClientImpl::redirect、create_redirect_client、detail::redirect、resolve_relative_location、CPPHTTPLIB_REDIRECT_MAX_COUNT、example/redirect.ccHTTP/HTTPS 双服务重定向演示。赞分享后端网络【免费下载链接】cpp-httplibA C header-only HTTP/HTTPS server and client library项目地址https://gitcode.com/GitHub_Trending/cp/cpp-httplib点击查看免费下载相关推荐Podman 容器伪终端详解--tty / -t 参数的语义、实现与实战注意事项Podman 容器伪终端详解 tty / t 参数的语义、实现与实战注意事项 本篇指南围绕 Podman 的 tty 短选项 t 参数展开系统讲解该参数后端网络自动跟随重定向的Node.js利器Follow Redirects自动跟随重定向的Node.js利器Follow Redirects 在构建网络应用时处理HTTP重定向是一项基本但至关重要的任务。 follow redir后端【开源精选】自动处理HTTP重定向的Node.js利器——follow-redirects【开源精选】自动处理HTTP重定向的Node.js利器——follow redirects 随着网络请求的复杂性日益增加开发者常常面临处理HTTP重定向的挑战后端上一篇clean-code-typescriptAngular开发提升应用质量下一篇智能资源下载神器5分钟搞定全平台视频音频素材收集创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →