From ca487a43f4541d975280371d6d706f757bb89734 Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Sun, 31 Mar 2013 14:18:43 +0300 Subject: [PATCH] http: add API function to flag request as ready As we allow to the user to add additional data to the request after creation, we also must make sure that the request isn't sent immediately after creation. Add a new function with which the user can tell when a request is ready to be sent. --- src/core/sipe-buddy.c | 1 + src/core/sipe-http-request.c | 20 +++++++++++++++----- src/core/sipe-http-request.h | 16 +++++++++------- src/core/sipe-http.h | 29 ++++++++++++++++++++--------- src/core/sipe-svc.c | 6 ++++-- 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/core/sipe-buddy.c b/src/core/sipe-buddy.c index 9a39cbfb..f62cfdec 100644 --- a/src/core/sipe-buddy.c +++ b/src/core/sipe-buddy.c @@ -1356,6 +1356,7 @@ static void get_photo_ab_entry_response(struct sipe_core_private *sipe_private, if (data->request) { sipe_private->pending_photo_requests = g_slist_append(sipe_private->pending_photo_requests, data); + sipe_http_request_ready(data->request); } else { photo_response_data_free(data); } diff --git a/src/core/sipe-http-request.c b/src/core/sipe-http-request.c index be216049..ee99b4ea 100644 --- a/src/core/sipe-http-request.c +++ b/src/core/sipe-http-request.c @@ -59,8 +59,12 @@ struct sipe_http_request { sipe_http_response_callback *cb; gpointer cb_data; + + guint32 flags; }; +#define SIPE_HTTP_REQUEST_FLAG_FIRST 0x00000001 + struct sipe_http_connection_public *sipe_http_connection_new(struct sipe_core_private *sipe_private, const gchar *host, guint32 port) @@ -213,7 +217,6 @@ struct sipe_http_request *sipe_http_request_new(struct sipe_core_private *sipe_p { struct sipe_http_request *req = g_new0(struct sipe_http_request, 1); struct sipe_http_connection *conn; - gboolean initial; req->path = g_strdup(path); if (headers) @@ -229,15 +232,22 @@ struct sipe_http_request *sipe_http_request_new(struct sipe_core_private *sipe_p req->connection = conn = (struct sipe_http_connection *) sipe_http_transport_new(sipe_private, host, port); - initial = conn->pending_requests == NULL; + if (conn->pending_requests == NULL) + req->flags = SIPE_HTTP_REQUEST_FLAG_FIRST; conn->pending_requests = g_slist_append(conn->pending_requests, req); + return(req); +} + +void sipe_http_request_ready(struct sipe_http_request *request) +{ + struct sipe_http_connection *conn = request->connection; + /* pass first request on already opened connection through directly */ - if (initial && conn->public.connected) + if ((request->flags & SIPE_HTTP_REQUEST_FLAG_FIRST) && + conn->public.connected) sipe_http_request_send(conn); - - return(req); } struct sipe_http_session *sipe_http_session_start(void) diff --git a/src/core/sipe-http-request.h b/src/core/sipe-http-request.h index 00b649fb..952d71fc 100644 --- a/src/core/sipe-http-request.h +++ b/src/core/sipe-http-request.h @@ -93,13 +93,15 @@ void sipe_http_request_shutdown(struct sipe_http_connection_public *conn_public) /** * Create new HTTP request (internal raw version) * - * @param sipe_private SIPE core private data - * @param host name of the host to connect to - * @param port port number to connect to - * @param path relative path - * @param headers additional headers to add (may be @c NULL) - * @param body body (may be @c NULL) - * @param content_type MIME type for body (may be @c NULL if body is @c NULL) + * @param sipe_private SIPE core private data + * @param host name of the host to connect to + * @param port port number to connect to + * @param path relative path + * @param headers additional headers to add (may be @c NULL) + * @param body body (may be @c NULL) + * @param content_type MIME type for body (may be @c NULL if body is @c NULL) + * @param callback callback function + * @param callback_data callback data * * @return pointer to opaque HTTP request data structure */ diff --git a/src/core/sipe-http.h b/src/core/sipe-http.h index d0924200..d0ea74ed 100644 --- a/src/core/sipe-http.h +++ b/src/core/sipe-http.h @@ -49,7 +49,7 @@ typedef void (sipe_http_response_callback)(struct sipe_core_private *sipe_privat const gchar *body, gpointer callback_data); -/* HTTP status codes */ +/* HTTP response status codes */ #define SIPE_HTTP_STATUS_OK 200 /** @@ -76,9 +76,11 @@ void sipe_http_session_close(struct sipe_http_session *session); /** * Create HTTP GET request * - * @param sipe_private SIPE core private data - * @param uri URI - * @param headers additional headers (may be @c NULL) + * @param sipe_private SIPE core private data + * @param uri URI + * @param headers additional headers (may be @c NULL) + * @param callback callback function + * @param callback_data callback data * * @return pointer to opaque HTTP request data structure (@c NULL if failed) */ @@ -91,11 +93,13 @@ struct sipe_http_request *sipe_http_request_get(struct sipe_core_private *sipe_p /** * Create HTTP POST request * - * @param sipe_private SIPE core private data - * @param uri URI - * @param headers additional headers (may be @c NULL) - * @param body body contents - * @param content_type body content type + * @param sipe_private SIPE core private data + * @param uri URI + * @param headers additional headers (may be @c NULL) + * @param body body contents + * @param content_type body content type + * @param callback callback function + * @param callback_data callback data * * @return pointer to opaque HTTP request data structure (@c NULL if failed) */ @@ -108,6 +112,13 @@ struct sipe_http_request *sipe_http_request_post(struct sipe_core_private *sipe_ gpointer callback_data); /** + * HTTP request is ready to be sent + * + * @param pointer to opaque HTTP request data structure + */ +void sipe_http_request_ready(struct sipe_http_request *request); + +/** * Cancel pending HTTP request * * @param pointer to opaque HTTP request data structure diff --git a/src/core/sipe-svc.c b/src/core/sipe-svc.c index 6bcd53fe..ccb5f1ab 100644 --- a/src/core/sipe-svc.c +++ b/src/core/sipe-svc.c @@ -200,11 +200,13 @@ static gboolean sipe_svc_https_request(struct sipe_core_private *sipe_private, data->request = request; data->uri = g_strdup(uri); - sipe_http_request_session(request, session->session); - sipe_svc_init(sipe_private); sipe_private->svc->pending_requests = g_slist_prepend(sipe_private->svc->pending_requests, data); + + sipe_http_request_session(request, session->session); + sipe_http_request_ready(request); + } else { SIPE_DEBUG_ERROR("failed to create HTTP connection to %s", uri); g_free(data); -- 2.11.4.GIT