You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/06/20 05:57:02 UTC
[incubator-nuttx-apps] 04/05: webclient: Export a few ops on webclient_conn_s
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
commit d435858c533c0a84f8b3be10385033886d366855
Author: YAMAMOTO Takashi <ya...@midokura.com>
AuthorDate: Mon Jun 20 09:51:01 2022 +0900
webclient: Export a few ops on webclient_conn_s
* Make webclient_conn_s self-contained so that it can be
used without webclient_context.
* Add missing FAR.
---
include/netutils/webclient.h | 12 +++
netutils/webclient/webclient.c | 213 ++++++++++++++++++++++-------------------
2 files changed, 126 insertions(+), 99 deletions(-)
diff --git a/include/netutils/webclient.h b/include/netutils/webclient.h
index 8bd78efce..692e76ffa 100644
--- a/include/netutils/webclient.h
+++ b/include/netutils/webclient.h
@@ -501,6 +501,11 @@ struct webclient_conn_s
/* for tls */
FAR struct webclient_tls_connection *tls_conn;
+
+ /* for tls, same as webclient_context */
+
+ FAR const struct webclient_tls_ops *tls_ops;
+ FAR void *tls_ctx;
};
/****************************************************************************
@@ -564,6 +569,13 @@ int webclient_get_poll_info(FAR struct webclient_context *ctx,
void webclient_get_tunnel(FAR struct webclient_context *ctx,
FAR struct webclient_conn_s **connp);
+ssize_t webclient_conn_send(FAR struct webclient_conn_s *conn,
+ FAR const void *buffer, size_t len);
+ssize_t webclient_conn_recv(FAR struct webclient_conn_s *conn,
+ FAR void *buffer, size_t len);
+void webclient_conn_close(FAR struct webclient_conn_s *conn);
+void webclient_conn_free(FAR struct webclient_conn_s *conn);
+
#undef EXTERN
#ifdef __cplusplus
}
diff --git a/netutils/webclient/webclient.c b/netutils/webclient/webclient.c
index d2d7ef261..b13ab618c 100644
--- a/netutils/webclient/webclient.c
+++ b/netutils/webclient/webclient.c
@@ -266,96 +266,13 @@ static const char g_httpcache[] = "Cache-Control: no-cache";
static void free_ws(FAR struct wget_s *ws)
{
- free(ws->conn);
- free(ws->tunnel);
- free(ws);
-}
-
-/****************************************************************************
- * Name: conn_send
- ****************************************************************************/
-
-static ssize_t conn_send(struct webclient_context *ctx,
- struct webclient_conn_s *conn,
- const void *buffer, size_t len)
-{
- if (conn->tls)
- {
- return ctx->tls_ops->send(ctx->tls_ctx, conn->tls_conn, buffer, len);
- }
-
- while (true)
- {
- ssize_t ret = send(conn->sockfd, buffer, len, 0);
- if (ret == -1)
- {
- if (errno == EINTR)
- {
- continue;
- }
-
- if (errno == EAGAIN)
- {
- conn->flags |= CONN_WANT_WRITE;
- }
-
- return -errno;
- }
-
- return ret;
- }
-}
-
-/****************************************************************************
- * Name: conn_recv
- ****************************************************************************/
-
-static ssize_t conn_recv(struct webclient_context *ctx,
- struct webclient_conn_s *conn,
- void *buffer, size_t len)
-{
- if (conn->tls)
+ if (ws->conn != NULL)
{
- return ctx->tls_ops->recv(ctx->tls_ctx, conn->tls_conn, buffer, len);
+ webclient_conn_free(ws->conn);
}
- while (true)
- {
- ssize_t ret = recv(conn->sockfd, buffer, len, 0);
- if (ret == -1)
- {
- if (errno == EINTR)
- {
- continue;
- }
-
- if (errno == EAGAIN)
- {
- conn->flags |= CONN_WANT_READ;
- }
-
- return -errno;
- }
-
- return ret;
- }
-}
-
-/****************************************************************************
- * Name: conn_close
- ****************************************************************************/
-
-static void conn_close(struct webclient_context *ctx,
- struct webclient_conn_s *conn)
-{
- if (conn->tls)
- {
- ctx->tls_ops->close(ctx->tls_ctx, conn->tls_conn);
- }
- else
- {
- close(conn->sockfd);
- }
+ free(ws->tunnel);
+ free(ws);
}
/****************************************************************************
@@ -1147,6 +1064,100 @@ static int wget_gethostip(FAR char *hostname, FAR struct in_addr *dest)
* Public Functions
****************************************************************************/
+/****************************************************************************
+ * Name: webclient_conn_send
+ ****************************************************************************/
+
+ssize_t webclient_conn_send(FAR struct webclient_conn_s *conn,
+ FAR const void *buffer, size_t len)
+{
+ if (conn->tls)
+ {
+ return conn->tls_ops->send(conn->tls_ctx, conn->tls_conn, buffer, len);
+ }
+
+ while (true)
+ {
+ ssize_t ret = send(conn->sockfd, buffer, len, 0);
+ if (ret == -1)
+ {
+ if (errno == EINTR)
+ {
+ continue;
+ }
+
+ if (errno == EAGAIN)
+ {
+ conn->flags |= CONN_WANT_WRITE;
+ }
+
+ return -errno;
+ }
+
+ return ret;
+ }
+}
+
+/****************************************************************************
+ * Name: webclient_conn_recv
+ ****************************************************************************/
+
+ssize_t webclient_conn_recv(FAR struct webclient_conn_s *conn,
+ FAR void *buffer, size_t len)
+{
+ if (conn->tls)
+ {
+ return conn->tls_ops->recv(conn->tls_ctx, conn->tls_conn, buffer, len);
+ }
+
+ while (true)
+ {
+ ssize_t ret = recv(conn->sockfd, buffer, len, 0);
+ if (ret == -1)
+ {
+ if (errno == EINTR)
+ {
+ continue;
+ }
+
+ if (errno == EAGAIN)
+ {
+ conn->flags |= CONN_WANT_READ;
+ }
+
+ return -errno;
+ }
+
+ return ret;
+ }
+}
+
+/****************************************************************************
+ * Name: webclient_conn_close
+ ****************************************************************************/
+
+void webclient_conn_close(FAR struct webclient_conn_s *conn)
+{
+ if (conn->tls)
+ {
+ conn->tls_ops->close(conn->tls_ctx, conn->tls_conn);
+ }
+ else
+ {
+ close(conn->sockfd);
+ }
+}
+
+/****************************************************************************
+ * Name: webclient_conn_free
+ ****************************************************************************/
+
+void webclient_conn_free(FAR struct webclient_conn_s *conn)
+{
+ DEBUGASSERT(conn != NULL);
+ free(conn);
+}
+
/****************************************************************************
* Name: webclient_perform
*
@@ -1273,6 +1284,8 @@ int webclient_perform(FAR struct webclient_context *ctx)
else if (!strcmp(ws->target.scheme, "https") && tls_ops != NULL)
{
conn->tls = true;
+ conn->tls_ops = tls_ops;
+ conn->tls_ctx = ctx->tls_ctx;
}
else if (!strcmp(ws->target.scheme, "http"))
{
@@ -1480,15 +1493,15 @@ int webclient_perform(FAR struct webclient_context *ctx)
DEBUGASSERT(ret != -EAGAIN &&
ret != -EINPROGRESS &&
ret != -EALREADY);
- conn_close(ctx, tunnel_conn);
- free(tunnel_conn);
+ webclient_conn_close(tunnel_conn);
+ webclient_conn_free(tunnel_conn);
}
}
else
{
conn->sockfd = tunnel_conn->sockfd;
ws->need_conn_close = true;
- free(tunnel_conn);
+ webclient_conn_free(tunnel_conn);
}
}
}
@@ -1767,8 +1780,9 @@ int webclient_perform(FAR struct webclient_context *ctx)
{
ssize_t ssz;
- ssz = conn_send(ctx, conn, ws->buffer + ws->state_offset,
- ws->state_len);
+ ssz = webclient_conn_send(conn,
+ ws->buffer + ws->state_offset,
+ ws->state_len);
if (ssz < 0)
{
ret = ssz;
@@ -1841,9 +1855,10 @@ int webclient_perform(FAR struct webclient_context *ctx)
size_t bytes_to_send = ws->data_len - ws->state_offset;
DEBUGASSERT(bytes_to_send <= ws->state_len);
- ssize_t ssz = conn_send(ctx, conn,
- ws->data_buffer + ws->state_offset,
- bytes_to_send);
+ ssize_t ssz = webclient_conn_send(conn,
+ ws->data_buffer +
+ ws->state_offset,
+ bytes_to_send);
if (ssz < 0)
{
ret = ssz;
@@ -1898,7 +1913,7 @@ int webclient_perform(FAR struct webclient_context *ctx)
want = 1;
}
- ssz = conn_recv(ctx, conn, ws->buffer, want);
+ ssz = webclient_conn_recv(conn, ws->buffer, want);
if (ssz < 0)
{
ret = ssz;
@@ -2121,7 +2136,7 @@ int webclient_perform(FAR struct webclient_context *ctx)
if (ws->state == WEBCLIENT_STATE_CLOSE)
{
- conn_close(ctx, conn);
+ webclient_conn_close(conn);
ws->need_conn_close = false;
if (ws->redirected)
{
@@ -2163,7 +2178,7 @@ errout_with_errno:
if (ws->need_conn_close)
{
- conn_close(ctx, conn);
+ webclient_conn_close(conn);
}
free_ws(ws);
@@ -2200,7 +2215,7 @@ void webclient_abort(FAR struct webclient_context *ctx)
{
struct webclient_conn_s *conn = ws->conn;
- conn_close(ctx, conn);
+ webclient_conn_close(conn);
}
if (ws->tunnel != NULL)