X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuclient.git;a=blobdiff_plain;f=uclient-example.c;h=a54aa889d202d5c6d8b9b32e843bf94da0009881;hp=07b330dc308edded71541938d1aecab5bf0d75fd;hb=63a984dbdf8a4d1249838e0708a4bed2dfaff476;hpb=32f153a8dba2ef26ec14dd2b4dff917fbda90f83 diff --git a/uclient-example.c b/uclient-example.c index 07b330d..a54aa88 100644 --- a/uclient-example.c +++ b/uclient-example.c @@ -1,15 +1,43 @@ -#include +/* + * uclient - ustream based protocol client library + * + * Copyright (C) 2014 Felix Fietkau + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + #include #include +#include + #include "uclient.h" + static void example_header_done(struct uclient *cl) { struct blob_attr *cur; + char local[INET6_ADDRSTRLEN], remote[INET6_ADDRSTRLEN]; + int local_port, remote_port; int rem; - printf("Headers: \n"); + uclient_get_addr(local, &local_port, &cl->local_addr); + uclient_get_addr(remote, &remote_port, &cl->remote_addr); + + fprintf(stderr, "Connected: %s:%d -> %s:%d\n", + local, local_port, remote, remote_port); + + printf("Headers (%d): \n", cl->status_code); blobmsg_for_each_attr(cur, cl->meta, rem) { printf("%s=%s\n", blobmsg_name(cur), (char *) blobmsg_data(cur)); } @@ -47,7 +75,6 @@ static void example_request_sm(struct uclient *cl) uclient_request(cl); break; default: - uclient_free(cl); uloop_end(); break; }; @@ -55,6 +82,20 @@ static void example_request_sm(struct uclient *cl) static void example_eof(struct uclient *cl) { + static int retries; + + if (retries < 10 && uclient_http_redirect(cl)) { + retries++; + return; + } + + retries = 0; + example_request_sm(cl); +} + +static void example_error(struct uclient *cl, int code) +{ + fprintf(stderr, "Error %d!\n", code); example_request_sm(cl); } @@ -62,26 +103,66 @@ static const struct uclient_cb cb = { .header_done = example_header_done, .data_read = example_read_data, .data_eof = example_eof, + .error = example_error, }; +static int usage(const char *progname) +{ + fprintf(stderr, + "Usage: %s [options] \n" + "Options:\n" + " -c : Load CA certificates from file \n" + " -C: Skip certificate CN verification against hostname\n" + "\n", progname); + return 1; +} + + int main(int argc, char **argv) { + struct ustream_ssl_ctx *ctx; + const char *progname = argv[0]; struct uclient *cl; + bool verify = true; + int ch; - if (argc != 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); - return 1; + ctx = ustream_ssl_context_new(false); + + while ((ch = getopt(argc, argv, "Cc:")) != -1) { + switch(ch) { + case 'c': + ustream_ssl_context_add_ca_crt_file(ctx, optarg); + break; + case 'C': + verify = false; + break; + default: + return usage(progname); + } } + argv += optind; + argc -= optind; + + if (argc != 1) + return usage(progname); + uloop_init(); - cl = uclient_new(argv[1], &cb); + + cl = uclient_new(argv[0], NULL, &cb); if (!cl) { fprintf(stderr, "Failed to allocate uclient context\n"); return 1; } + + uclient_http_set_ssl_ctx(cl, ctx, verify); example_request_sm(cl); uloop_run(); uloop_done(); + uclient_free(cl); + ustream_ssl_context_free(ctx); + + return 0; }