webclient: Allow users to specify extra headers for proxy
My primary motivation at this point is to use it for basic proxy auth. (specify "Proxy-Authorization" header) But there can be other use cases for proxy-specific extra headers. If/when we want to support other non-trivial auth methods, probably a callback-based mechanism will be necessary. But at this point, this serves my purpose well.
This commit is contained in:
parent
068905d07b
commit
159ca00752
@ -360,6 +360,10 @@ struct webclient_context
|
|||||||
* unix_socket_path - If not NULL, the path to an AF_LOCAL socket.
|
* unix_socket_path - If not NULL, the path to an AF_LOCAL socket.
|
||||||
* headers - An array of pointers to the extra headers.
|
* headers - An array of pointers to the extra headers.
|
||||||
* nheaders - The number of elements in the "headers" array.
|
* nheaders - The number of elements in the "headers" array.
|
||||||
|
* proxy_headers - An array of pointers to the extra headers for
|
||||||
|
* the proxy connection.
|
||||||
|
* proxy_nheaders - The number of elements in the "headers" array for
|
||||||
|
* the proxy connection.
|
||||||
* bodylen - The size of the request body.
|
* bodylen - The size of the request body.
|
||||||
* timeout_sec - The timeout in second.
|
* timeout_sec - The timeout in second.
|
||||||
* This is not meant to cover the entire transaction.
|
* This is not meant to cover the entire transaction.
|
||||||
@ -384,6 +388,10 @@ struct webclient_context
|
|||||||
#endif
|
#endif
|
||||||
FAR const char * FAR const *headers;
|
FAR const char * FAR const *headers;
|
||||||
unsigned int nheaders;
|
unsigned int nheaders;
|
||||||
|
|
||||||
|
FAR const char * FAR const *proxy_headers;
|
||||||
|
unsigned int proxy_nheaders;
|
||||||
|
|
||||||
size_t bodylen;
|
size_t bodylen;
|
||||||
unsigned int timeout_sec;
|
unsigned int timeout_sec;
|
||||||
|
|
||||||
|
@ -1337,6 +1337,8 @@ int webclient_perform(FAR struct webclient_context *ctx)
|
|||||||
tunnel->tunnel_target_host = ws->target.hostname;
|
tunnel->tunnel_target_host = ws->target.hostname;
|
||||||
tunnel->tunnel_target_port = ws->target.port;
|
tunnel->tunnel_target_port = ws->target.port;
|
||||||
tunnel->proxy = ctx->proxy;
|
tunnel->proxy = ctx->proxy;
|
||||||
|
tunnel->proxy_headers = ctx->proxy_headers;
|
||||||
|
tunnel->proxy_nheaders = ctx->proxy_nheaders;
|
||||||
|
|
||||||
/* Inherit some configurations.
|
/* Inherit some configurations.
|
||||||
*
|
*
|
||||||
@ -1700,10 +1702,35 @@ int webclient_perform(FAR struct webclient_context *ctx)
|
|||||||
dest = append(dest, ep, ws->target.hostname);
|
dest = append(dest, ep, ws->target.hostname);
|
||||||
dest = append(dest, ep, g_httpcrnl);
|
dest = append(dest, ep, g_httpcrnl);
|
||||||
|
|
||||||
for (i = 0; i < ctx->nheaders; i++)
|
/* Append user-specified headers.
|
||||||
|
*
|
||||||
|
* - For non-proxied request,
|
||||||
|
* only send "headers".
|
||||||
|
*
|
||||||
|
* - For proxied request, (traditional http proxy)
|
||||||
|
* send both of "headers" and "proxy_headers".
|
||||||
|
*
|
||||||
|
* - For tunneling request, (WEBCLIENT_FLAG_TUNNEL)
|
||||||
|
* only send "proxy_headers".
|
||||||
|
*/
|
||||||
|
|
||||||
|
if ((ctx->flags & WEBCLIENT_FLAG_TUNNEL) == 0)
|
||||||
{
|
{
|
||||||
dest = append(dest, ep, ctx->headers[i]);
|
for (i = 0; i < ctx->nheaders; i++)
|
||||||
dest = append(dest, ep, g_httpcrnl);
|
{
|
||||||
|
dest = append(dest, ep, ctx->headers[i]);
|
||||||
|
dest = append(dest, ep, g_httpcrnl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((ctx->flags & WEBCLIENT_FLAG_TUNNEL) != 0 ||
|
||||||
|
ctx->proxy != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < ctx->proxy_nheaders; i++)
|
||||||
|
{
|
||||||
|
dest = append(dest, ep, ctx->proxy_headers[i]);
|
||||||
|
dest = append(dest, ep, g_httpcrnl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx->bodylen)
|
if (ctx->bodylen)
|
||||||
|
Loading…
Reference in New Issue
Block a user