From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56061) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNNlH-0005yV-BP for qemu-devel@nongnu.org; Fri, 29 Aug 2014 11:06:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XNNlA-0000FK-Ta for qemu-devel@nongnu.org; Fri, 29 Aug 2014 11:06:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38015) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XNNlA-0000FE-LW for qemu-devel@nongnu.org; Fri, 29 Aug 2014 11:06:40 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7TF6eJN024167 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 29 Aug 2014 11:06:40 -0400 Message-ID: <540096FE.1040203@redhat.com> Date: Fri, 29 Aug 2014 16:06:38 +0100 From: Matthew Booth MIME-Version: 1.0 References: <1409324592-31888-1-git-send-email-rjones@redhat.com> <1409324592-31888-2-git-send-email-rjones@redhat.com> In-Reply-To: <1409324592-31888-2-git-send-email-rjones@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v2] curl: Allow a cookie or cookies to be sent with http/https requests. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Richard W.M. Jones" , qemu-devel@nongnu.org Cc: famz@redhat.com, stefanha@redhat.com Looks good. Please add: Reviewed-by: Matthew Booth Matt On 29/08/14 16:03, Richard W.M. Jones wrote: > In order to access VMware ESX efficiently, we need to send a session > cookie. This patch is very simple and just allows you to send that > session cookie. It punts on the question of how you get the session > cookie in the first place, but in practice you can just run a `curl' > command against the server and extract the cookie that way. > > To use it, add file.cookie to the curl URL. For example: > > $ qemu-img info 'json: { > "file.driver":"https", > "file.url":"https://vcenter/folder/Windows%202003/Windows%202003-flat.vmdk?dcPath=Datacenter&dsName=datastore1", > "file.sslverify":"off", > "file.cookie":"vmware_soap_session=\"52a01262-bf93-ccce-d379-8dabb3e55560\""}' > image: [...] > file format: raw > virtual size: 8.0G (8589934592 bytes) > disk size: unavailable > > Signed-off-by: Richard W.M. Jones > --- > block/curl.c | 16 ++++++++++++++++ > qemu-options.hx | 5 +++++ > 2 files changed, 21 insertions(+) > > diff --git a/block/curl.c b/block/curl.c > index f59615d..fa1a258 100644 > --- a/block/curl.c > +++ b/block/curl.c > @@ -71,6 +71,7 @@ static CURLMcode __curl_multi_socket_action(CURLM *multi_handle, > #define CURL_BLOCK_OPT_URL "url" > #define CURL_BLOCK_OPT_READAHEAD "readahead" > #define CURL_BLOCK_OPT_SSLVERIFY "sslverify" > +#define CURL_BLOCK_OPT_COOKIE "cookie" > > struct BDRVCURLState; > > @@ -109,6 +110,7 @@ typedef struct BDRVCURLState { > char *url; > size_t readahead_size; > bool sslverify; > + char *cookie; > bool accept_range; > AioContext *aio_context; > } BDRVCURLState; > @@ -382,6 +384,9 @@ static CURLState *curl_init_state(BlockDriverState *bs, BDRVCURLState *s) > curl_easy_setopt(state->curl, CURLOPT_URL, s->url); > curl_easy_setopt(state->curl, CURLOPT_SSL_VERIFYPEER, > (long) s->sslverify); > + if (s->cookie) { > + curl_easy_setopt(state->curl, CURLOPT_COOKIE, s->cookie); > + } > curl_easy_setopt(state->curl, CURLOPT_TIMEOUT, 5); > curl_easy_setopt(state->curl, CURLOPT_WRITEFUNCTION, > (void *)curl_read_cb); > @@ -489,6 +494,11 @@ static QemuOptsList runtime_opts = { > .type = QEMU_OPT_BOOL, > .help = "Verify SSL certificate" > }, > + { > + .name = CURL_BLOCK_OPT_COOKIE, > + .type = QEMU_OPT_STRING, > + .help = "Pass the cookie or list of cookies with each request" > + }, > { /* end of list */ } > }, > }; > @@ -501,6 +511,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags, > QemuOpts *opts; > Error *local_err = NULL; > const char *file; > + const char *cookie; > double d; > > static int inited = 0; > @@ -527,6 +538,9 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags, > > s->sslverify = qemu_opt_get_bool(opts, CURL_BLOCK_OPT_SSLVERIFY, true); > > + cookie = qemu_opt_get(opts, CURL_BLOCK_OPT_COOKIE); > + s->cookie = g_strdup(cookie); > + > file = qemu_opt_get(opts, CURL_BLOCK_OPT_URL); > if (file == NULL) { > error_setg(errp, "curl block driver requires an 'url' option"); > @@ -582,6 +596,7 @@ out: > curl_easy_cleanup(state->curl); > state->curl = NULL; > out_noclean: > + g_free(s->cookie); > g_free(s->url); > qemu_opts_del(opts); > return -EINVAL; > @@ -684,6 +699,7 @@ static void curl_close(BlockDriverState *bs) > DPRINTF("CURL: Close\n"); > curl_detach_aio_context(bs); > > + g_free(s->cookie); > g_free(s->url); > } > > diff --git a/qemu-options.hx b/qemu-options.hx > index c573dd8..7b4a58a 100644 > --- a/qemu-options.hx > +++ b/qemu-options.hx > @@ -2351,6 +2351,11 @@ multiple of 512 bytes. It defaults to 256k. > @item sslverify > Whether to verify the remote server's certificate when connecting over SSL. It > can have the value 'on' or 'off'. It defaults to 'on'. > + > +@item cookie > +Send this cookie (it can also be a list of cookies separated by ';') with > +each outgoing request. Only supported when using protocols such as HTTP > +which support cookies, otherwise ignored. > @end table > > Note that when passing options to qemu explicitly, @option{driver} is the value > -- Matthew Booth Red Hat Engineering, Virtualisation Team Phone: +442070094448 (UK) GPG ID: D33C3490 GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490