On Tue, Jun 06, 2023 at 06:09:09PM +0200, Laszlo Ersek wrote:
> only superficial comments:
> 
> On 6/6/23 13:22, Richard W.M. Jones wrote:
[...]
> > diff --git a/tests/test-curl-head-forbidden.c 
> > b/tests/test-curl-head-forbidden.c
> > new file mode 100644
> > index 000000000..16b1f0533
> > --- /dev/null
> > +++ b/tests/test-curl-head-forbidden.c
> > @@ -0,0 +1,134 @@
> > +/* nbdkit
> > + * Copyright Red Hat
> > + *
> > + * Redistribution and use in source and binary forms, with or without
> > + * modification, are permitted provided that the following conditions are
> > + * met:
> > + *
> > + * * Redistributions of source code must retain the above copyright
> > + * notice, this list of conditions and the following disclaimer.
> > + *
> > + * * Redistributions in binary form must reproduce the above copyright
> > + * notice, this list of conditions and the following disclaimer in the
> > + * documentation and/or other materials provided with the distribution.
> > + *
> > + * * Neither the name of Red Hat nor the names of its contributors may be
> > + * used to endorse or promote products derived from this software without
> > + * specific prior written permission.
> > + *
> > + * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
> > + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> > + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> > + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
> > + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> > + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> > + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> > + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> > + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> > + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> > + * SUCH DAMAGE.
> > + */
> > +
> > +/* Test curl plugin against a simulated webserver which responds with
> > + * 403 Forbidden to HEAD requests, but allows the GET method.
> > + */
> > +
> > +#include <config.h>
> > +
> > +#include <stdio.h>
> > +#include <stdlib.h>
> > +#include <stdbool.h>
> > +#include <stdint.h>
> > +#include <inttypes.h>
> > +#include <string.h>
> > +#include <unistd.h>
> > +#include <errno.h>
> > +#include <sys/stat.h>
> > +
> > +#include <libnbd.h>
> > +
> > +#include "cleanup.h"
> > +#include "web-server.h"
> > +
> > +#include "test.h"
> > +
> > +static char buf[1024];
> > +
> > +int
> > +main (int argc, char *argv[])
> > +{
> > +  struct stat statbuf;
> > +  const char *sockpath;
> > +  struct nbd_handle *nbd;
> > +  CLEANUP_FREE char *usp_param = NULL;
> > +  int64_t size;
> > +
> > +#ifndef HAVE_CURLOPT_UNIX_SOCKET_PATH
> > +  fprintf (stderr, "%s: curl does not support CURLOPT_UNIX_SOCKET_PATH\n",
> > +           program_name);
> > +  exit (77);
> > +#endif
> > +
> > +  if (stat ("disk", &statbuf) == -1) {
> > +    if (errno == ENOENT) {
> > +      fprintf (stderr, "%s: test skipped because \"disk\" is missing\n",
> > +               program_name);
> > +      exit (77);
> > +    }
> > +    perror ("disk");
> > +    exit (EXIT_FAILURE);
> > +  }
> > +
> > +  sockpath = web_server ("disk", NULL, true);
> > +  if (sockpath == NULL) {
> > +    fprintf (stderr, "%s: could not start web server thread\n", 
> > program_name);
> > +    exit (EXIT_FAILURE);
> > +  }
> > +
> > +  nbd = nbd_create ();
> > +  if (nbd == NULL) {
> > +    fprintf (stderr, "%s\n", nbd_get_error ());
> > +    exit (EXIT_FAILURE);
> > +  }
> > +
> > +  /* Start nbdkit. */
> > +  if (asprintf (&usp_param, "unix-socket-path=%s", sockpath) == -1) {
> > +    perror ("asprintf");
> > +    exit (EXIT_FAILURE);
> > +  }
> > +  if (nbd_connect_command (nbd,
> > +                           (char *[]) {
> > +                             "nbdkit", "-s", "--exit-with-parent", "-v",
> > +                             "curl",
> > +                             "-D", "curl.verbose=1",
> > +                             "http://localhost/disk";,
> > +                             usp_param, /* unix-socket-path=... */
> > +                             NULL }) == -1) {
> > +    fprintf (stderr, "%s\n", nbd_get_error ());
> > +    exit (EXIT_FAILURE);
> > +  }
> > +
> > +  /* Check the size is expected. */
> > +  size = nbd_get_size (nbd);
> > +  if (size == -1) {
> > +    fprintf (stderr, "%s\n", nbd_get_error ());
> > +    exit (EXIT_FAILURE);
> > +  }
> > +  if (size != statbuf.st_size) {
> > +    fprintf (stderr, "%s: incorrect export size, "
> > +             "expected: %" PRIu64 " actual: %" PRIi64 "\n",
> > +             program_name,
> > +             (uint64_t) statbuf.st_size, size);
> > +    exit (EXIT_FAILURE);
> > +  }
> > +
> > +  /* Make a request. */
> > +  if (nbd_pread (nbd, buf, sizeof buf, 0, 0) == -1) {
> > +    fprintf (stderr, "%s\n", nbd_get_error ());
> > +    exit (EXIT_FAILURE);
> > +  }
> > +
> > +  nbd_close (nbd);
> > +  exit (EXIT_SUCCESS);
> > +}
> 
> I take it this is a small customization (more precisely, lightly
> modified copy) of another (existent) test. The --find-copies-harder git
> formatting option is good for presenting new code in such terms, i.e. as
> a copy of another file + diffs on top. I figure the only relevant
> difference would be the last, "true", argument, for web_server().

It's indeed a copy of test-curl-header-script.c.  --find-copies-harder
thinks it's:

--- a/tests/test-curl-cookie-script.c
+++ b/tests/test-curl-head-forbidden.c

which makes sense as test-curl-header-script.c and
test-curl-cookie-script.c were from a common source originally.

> > @@ -108,6 +112,7 @@ web_server (const char *filename, check_request_t 
> > _check_request)
> >    ignore_sigpipe ();
> >  
> >    check_request = _check_request;
> > +  head_fails_with_403 = _head_fails_with_403;
> >  
> >    /* Open the file. */
> >    fd = open (filename, O_RDONLY|O_CLOEXEC);
> > @@ -250,6 +255,11 @@ handle_requests (int s)
> >        }
> >        memcpy (path, &request[5], n);
> >        path[n] = '\0';
> > +      if (head_fails_with_403) {
> > +        send_403_forbidden (s);
> > +        eof = true;
> > +        break;
> > +      }
> 
> I'm not a fan of the pre-existent pattern where we both set "eof = true"
> and break out of the loop. It would have to be cleaned up first, in a
> different patch, but I'm not sure if we care enough.

It's a test :-) However what do you suggest?  Both statements are
necessary because we have to break out of the inner for(;;) loop, run
a tiny bit of common cleanup code (just a fprintf), and then break
from the while(!eof) loop.

> > +static void
> > +xwrite_allow_epipe (int s, const char *buf, size_t len)
> > +{
> > +  ssize_t r;
> > +
> > +  while (len > 0) {
> > +    r = write (s, buf, len);
> > +    if (r == -1) {
> > +      if (errno != EPIPE) {
> > +        perror ("write");
> > +        exit (EXIT_FAILURE);
> > +      }
> > +      else
> > +        return;
> > +    }
> 
> exit() doesn't return, so I suggest removing the "else" (i.e., unnesting
> the "return").

OK.

> > +    buf += r;
> > +    len -= r;
> > +  }
> > +}
> > +
> >  static void
> >  xpread (char *buf, size_t count, off_t offset)
> >  {
> > diff --git a/tests/web-server.h b/tests/web-server.h
> > index 36f0ea1e1..0961f4c5d 100644
> > --- a/tests/web-server.h
> > +++ b/tests/web-server.h
> > @@ -43,6 +43,8 @@
> >  #ifndef NBDKIT_WEB_SERVER_H
> >  #define NBDKIT_WEB_SERVER_H
> >  
> > +#include <stdbool.h>
> > +
> >  /* Starts a web server in a background thread.  The web server will
> >   * serve 'filename' (only) - the URL in requests is ignored.
> >   *
> > @@ -57,10 +59,15 @@
> >   * The optional check_request function is called when the request is
> >   * received (note: not in the main thread) and can be used to perform
> >   * checks for example that particular headers were sent.
> > + *
> > + * If head_fails_with_403 == true then we simulate a server that
> > + * responds to GET but fails HEAD with 403 errors, see:
> > + * 
> > https://github.com/kubevirt/containerized-data-importer/issues/2737#issuecomment-1577786849
> >   */
> >  typedef void (*check_request_t) (const char *request);
> >  extern const char *web_server (const char *filename,
> > -                               check_request_t check_request)
> > +                               check_request_t check_request,
> > +                               bool head_fails_with_403)
> >    __attribute__ ((__nonnull__ (1)));
> >  
> >  #endif /* NBDKIT_WEB_SERVER_H */
> 
> I'd prefer the introduction of this new parameter to be a separate
> patch. That would isolate much the boilerplate from the relevant feature
> addition.

OK.

> > diff --git a/.gitignore b/.gitignore
> > index e62c23d8b..49af3998f 100644
> > --- a/.gitignore
> > +++ b/.gitignore
> > @@ -122,6 +122,7 @@ plugins/*/*.3
> >  /tests/test-curl
> >  /tests/test-curl-cookie-script
> >  /tests/test-curl-header-script
> > +/tests/test-curl-head-forbidden
> >  /tests/test-data
> >  /tests/test-delay
> >  /tests/test-exit-with-parent
> 
> Reviewed-by: Laszlo Ersek <ler...@redhat.com>

Thanks,

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to