Re: [PATCH v2 6/6] t5556-http-auth: add test for HTTP auth hdr logic
- From
Matthew John Cheetham <mjcheetham@outlook.com>
- Date
- Nov 1, 2022, 23:14 UTC
- Message-ID
- <AS2PR03MB981549CCF945BF26DD212BDBC0369@AS2PR03MB9815.eurprd03.prod.outlook.com>
- In-Reply-To
- <d61d8881-ce58-de02-2c3b-e3cc812e316a@jeffhostetler.com>
On 2022-10-28 12:14, Jeff Hostetler wrote:
Show 46 quoted lines
> > > On 10/28/22 11:08 AM, Derrick Stolee wrote: >> } >> >>> diff --git a/t/helper/test-http-server.c b/t/helper/test-http-server.c >> >>> @@ -0,0 +1,1134 @@ >>> +#include "config.h" >>> +#include "run-command.h" >>> +#include "strbuf.h" >>> +#include "string-list.h" >>> +#include "trace2.h" >>> +#include "version.h" >>> +#include "dir.h" >>> +#include "date.h" >>> + >>> +#define TR2_CAT "test-http-server" >>> + >>> +static const char *pid_file; >>> +static int verbose; >>> +static int reuseaddr; >>> + >>> +static const char test_http_auth_usage[] = >>> +"http-server [--verbose]\n" >>> +" [--timeout=<n>] [--init-timeout=<n>] [--max-connections=<n>]\n" >>> +" [--reuseaddr] [--pid-file=<file>]\n" >>> +" [--listen=<host_or_ipaddr>]* [--port=<n>]\n" >>> +" [--anonymous-allowed]\n" >>> +" [--auth=<scheme>[:<params>] [--auth-token=<scheme>:<token>]]*\n" >>> +; >> >> These are a lot of options to implement all at once. They are probably >> simple enough, but depending on the implementation and tests, it might >> be helpful to split this patch into smaller ones that introduce these >> options along with the tests that exercise each. That will help >> verify that they are being tested properly instead of needing to track >> back and forth across the patch for each one. > > how many of these options were inherited from test-gvfs-protocol or > from upstream git-daemon? If most came from git-daemon, it's probably > easier to see that this was a cut-n-paste from it if it comes over in > one commit, since all of the OPT_ processing, usage(), and static global > state vars will come over together I would think -- rather than to build > up the arg parsing bit by bit. More on this in a minute... >
Only --anonymous-allowed, --auth and --auth-token are added over git-daemon.
Show 47 quoted lines
>
>>> +
>>> +/* Timeout, and initial timeout */
>>> +static unsigned int timeout;
>>> +static unsigned int init_timeout;
>>> +
>>> +static void logreport(const char *label, const char *err, va_list params)
>>> +{
>>> + struct strbuf msg = STRBUF_INIT;
>>> +
>>> + strbuf_addf(&msg, "[%"PRIuMAX"] %s: ", (uintmax_t)getpid(), label);
>>> + strbuf_vaddf(&msg, err, params);
>>> + strbuf_addch(&msg, '\n');
>>> +
>>> + fwrite(msg.buf, sizeof(char), msg.len, stderr);
>>> + fflush(stderr);
>>> +
>>> + strbuf_release(&msg);
>>> +}
>>> +
>>> +__attribute__((format (printf, 1, 2)))
>>> +static void logerror(const char *err, ...)
>>> +{
>>> + va_list params;
>>> + va_start(params, err);
>>> + logreport("error", err, params);
>>> + va_end(params);
>>> +}
>>> +
>>> +__attribute__((format (printf, 1, 2)))
>>> +static void loginfo(const char *err, ...)
>>> +{
>>> + va_list params;
>>> + if (!verbose)
>>> + return;
>>> + va_start(params, err);
>>> + logreport("info", err, params);
>>> + va_end(params);
>>> +}
>
> ...Maybe it would be easier to see/diff this large new test server
> if we copied `daemon.c` into this source file in 1 commit and then
> converted it to what you have now in 1 commit -- so that only new
> code shows up here. For example, all of the above logreport, logerror,
> and loginfo routines would show up as new in the copy commit, but not
> in the edit commit. However, that may lead to too much noise when
> you actually get into the meat of the auth changes, maybe.I take from git-daemon and the test-gvfs-protocol helper from microsoft/git fork, but then also delete lots of not required pieces too just as much as I have added. Copying git-daemon.c, to then delete, and then add feels like lots of noise.
Show 22 quoted lines
>> I wonder how much of this we need or is just a nice thing. I would >> err on the side of making things as simple as possible, but being >> able to debug this test server may be important based on your >> experience. > > i'd vote to keep it. > > [...] >>> +static void kill_some_child(void) >> >>> +static void check_dead_children(void) >> >> These technically sound methods have unfortunate names. >> Using something like "connection" over "child" might >> alleviate some of the horror. (I initially wanted to >> suggest "subprocess" but you compare live_children to >> max_connections in the next method, so connection seemed >> appropriate.) > > These names were inherited from `daemon.c` IIRC. I wouldn't change > them since it'll just introduce noise when diffing. Especially, > if we do the copy commit first.
Indeed. These functions are untouched from daemon.c. I do plan to split this mega-patch up however in to a single 'add the boilerplate' based on git-daemon patch, then add the extra pieces like HTTP request parsing and the auth pieces in a v3.
Show 33 quoted lines
> [...]
>>> +static struct strvec cld_argv = STRVEC_INIT;
>>> +static void handle(int incoming, struct sockaddr *addr, socklen_t addrlen)
>>> +{
>>> + struct child_process cld = CHILD_PROCESS_INIT;
>>> +
>>> + if (max_connections && live_children >= max_connections) {
>>> + kill_some_child();
>>> + sleep(1); /* give it some time to die */
>>> + check_dead_children();
>>> + if (live_children >= max_connections) {
>>> + close(incoming);
>>> + logerror("Too many children, dropping connection");
>>> + return;
>>> + }
>>> + }
>>
>> Do we anticipate exercising concurrent requests in our
>> tests? Perhaps it's not worth putting a cap on the
>> connection count so we can keep the test helpers simple.
>
> again, this code was inherited from `daemon.c`, so we could leave it.
>
> [...]
>>> + mod = xmalloc(sizeof(struct auth_module));
>>> + mod->scheme = xstrdup(p[0]->buf);
>>> + mod->challenge_params = p[1] ? xstrdup(p[1]->buf) : NULL;
>>
>> Here, you xstrdup() into a 'const char *', but you are really
>> passing ownership so it shouldn't be conts.
>
> There is a strbuf_detach() that will let you steal the buffer from the
> strbuf if that would help.Will update in v3 to drop the const.
Show 22 quoted lines
> [...] >> This was a lot to read, and the interesting bits are all mixed in >> with the http server code, which is less interesting to what we >> are trying to accomplish. It would be beneficial to split this >> into one or two patches before we actually introduce the tests. > > agreed. it is big, but it does make sense. perhaps doing the > copy daemon.c commit and then see how this commit diffs from it > would make it more manageable. (not sure, but worth a try.) > > [...] >> From what I read, I don't think there is much to change in >> the end result of the code, but it definitely was hard to read >> the important things when surrounded by many lines of >> boilerplate. > > agreed. i think the end result is good. > > Thanks > Jeff > >