diff options
Diffstat (limited to 'demo')
| -rw-r--r-- | demo/http_client/http_client.c | 25 | ||||
| -rw-r--r-- | demo/reqrep/reqrep.c | 1 | ||||
| -rw-r--r-- | demo/rest/server.c | 63 |
3 files changed, 32 insertions, 57 deletions
diff --git a/demo/http_client/http_client.c b/demo/http_client/http_client.c index a18725a9..8f7db96d 100644 --- a/demo/http_client/http_client.c +++ b/demo/http_client/http_client.c @@ -1,5 +1,5 @@ // -// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2025 Staysail Systems, Inc. <info@staysail.tech> // Copyright 2018 Capitar IT Group BV <info@capitar.com> // // This software is supplied under the terms of the MIT License, a @@ -33,8 +33,8 @@ // % ./http_client http://httpbin.org/ip // +#include <nng/http.h> #include <nng/nng.h> -#include <nng/supplemental/http/http.h> #include <stdio.h> #include <stdlib.h> @@ -49,11 +49,9 @@ int main(int argc, char **argv) { nng_http_client *client; - nng_http_conn *conn; + nng_http *conn; nng_url *url; nng_aio *aio; - nng_http_req *req; - nng_http_res *res; const char *hdr; int rv; int len; @@ -66,12 +64,12 @@ main(int argc, char **argv) } if (((rv = nng_init(NULL)) != 0) || + ((rv = nng_aio_alloc(&aio, NULL, NULL)) != 0) || ((rv = nng_url_parse(&url, argv[1])) != 0) || ((rv = nng_http_client_alloc(&client, url)) != 0) || - ((rv = nng_http_req_alloc(&req, url)) != 0) || - ((rv = nng_http_res_alloc(&res)) != 0) || ((rv = nng_aio_alloc(&aio, NULL, NULL)) != 0)) { fatal(rv); + return 1; } // Start connection process... @@ -90,7 +88,7 @@ main(int argc, char **argv) // The Host: header is already set up too. // Send the request, and wait for that to finish. - nng_http_conn_write_req(conn, req, aio); + nng_http_write_request(conn, aio); nng_aio_wait(aio); if ((rv = nng_aio_result(aio)) != 0) { @@ -98,22 +96,21 @@ main(int argc, char **argv) } // Read a response. - nng_http_conn_read_res(conn, res, aio); + nng_http_read_response(conn, aio); nng_aio_wait(aio); if ((rv = nng_aio_result(aio)) != 0) { fatal(rv); } - if (nng_http_res_get_status(res) != NNG_HTTP_STATUS_OK) { + if (nng_http_get_status(conn) != NNG_HTTP_STATUS_OK) { fprintf(stderr, "HTTP Server Responded: %d %s\n", - nng_http_res_get_status(res), - nng_http_res_get_reason(res)); + nng_http_get_status(conn), nng_http_get_reason(conn)); } // This only supports regular transfer encoding (no Chunked-Encoding, // and a Content-Length header is required.) - if ((hdr = nng_http_res_get_header(res, "Content-Length")) == NULL) { + if ((hdr = nng_http_get_header(conn, "Content-Length")) == NULL) { fprintf(stderr, "Missing Content-Length header.\n"); exit(1); } @@ -134,7 +131,7 @@ main(int argc, char **argv) nng_aio_set_iov(aio, 1, &iov); // Now attempt to receive the data. - nng_http_conn_read_all(conn, aio); + nng_http_read_all(conn, aio); // Wait for it to complete. nng_aio_wait(aio); diff --git a/demo/reqrep/reqrep.c b/demo/reqrep/reqrep.c index 9d7110f7..38e9d2c0 100644 --- a/demo/reqrep/reqrep.c +++ b/demo/reqrep/reqrep.c @@ -103,7 +103,6 @@ client(const char *url) nng_socket sock; nng_dialer dialer; int rv; - size_t sz; int sleep = 0; if ((rv = nng_init(NULL)) != 0) { diff --git a/demo/rest/server.c b/demo/rest/server.c index 96cdc79c..0fe21acb 100644 --- a/demo/rest/server.c +++ b/demo/rest/server.c @@ -32,11 +32,8 @@ // GRFG // +#include <nng/http.h> #include <nng/nng.h> -#include <nng/protocol/reqrep0/rep.h> -#include <nng/protocol/reqrep0/req.h> -#include <nng/supplemental/http/http.h> -#include <nng/supplemental/util/platform.h> #include <ctype.h> #include <stdio.h> @@ -74,12 +71,12 @@ typedef enum { typedef struct rest_job { nng_aio *http_aio; // aio from HTTP we must reply to - nng_http_res *http_res; // HTTP response object job_state state; // 0 = sending, 1 = receiving nng_msg *msg; // request message nng_aio *aio; // request flow nng_ctx ctx; // context on the request socket - struct rest_job *next; // next on the freelist + nng_http *conn; + struct rest_job *next; // next on the freelist } rest_job; nng_socket req_sock; @@ -94,10 +91,6 @@ static void rest_job_cb(void *arg); static void rest_recycle_job(rest_job *job) { - if (job->http_res != NULL) { - nng_http_res_free(job->http_res); - job->http_res = NULL; - } if (job->msg != NULL) { nng_msg_free(job->msg); job->msg = NULL; @@ -136,20 +129,13 @@ rest_get_job(void) } static void -rest_http_fatal(rest_job *job, const char *fmt, int rv) +rest_http_fatal(rest_job *job, int rv) { - char buf[128]; - nng_aio *aio = job->http_aio; - nng_http_res *res = job->http_res; - - job->http_res = NULL; - job->http_aio = NULL; - snprintf(buf, sizeof(buf), fmt, nng_strerror(rv)); - nng_http_res_set_status(res, NNG_HTTP_STATUS_INTERNAL_SERVER_ERROR); - nng_http_res_set_reason(res, buf); - - nng_aio_set_output(aio, 0, res); - nng_aio_finish(aio, 0); + nng_aio *aio = job->http_aio; + + // let the server give the details, we could have done more here + // ourselves if we wanted a detailed message + nng_aio_finish(aio, rv); rest_recycle_job(job); } @@ -163,7 +149,7 @@ rest_job_cb(void *arg) switch (job->state) { case SEND_REQ: if ((rv = nng_aio_result(aio)) != 0) { - rest_http_fatal(job, "send REQ failed: %s", rv); + rest_http_fatal(job, rv); return; } job->msg = NULL; @@ -174,23 +160,20 @@ rest_job_cb(void *arg) break; case RECV_REP: if ((rv = nng_aio_result(aio)) != 0) { - rest_http_fatal(job, "recv reply failed: %s", rv); + rest_http_fatal(job, rv); return; } job->msg = nng_aio_get_msg(aio); // We got a reply, so give it back to the server. - rv = nng_http_res_copy_data(job->http_res, - nng_msg_body(job->msg), nng_msg_len(job->msg)); + rv = nng_http_copy_body( + job->conn, nng_msg_body(job->msg), nng_msg_len(job->msg)); if (rv != 0) { - rest_http_fatal(job, "nng_http_res_copy_data: %s", rv); + rest_http_fatal(job, rv); return; } - // Set the output - the HTTP server will send it back to the - // user agent with a 200 response. - nng_aio_set_output(job->http_aio, 0, job->http_res); + nng_http_set_status(job->conn, NNG_HTTP_STATUS_OK, NULL); nng_aio_finish(job->http_aio, 0); job->http_aio = NULL; - job->http_res = NULL; // We are done with the job. rest_recycle_job(job); return; @@ -203,14 +186,10 @@ rest_job_cb(void *arg) // Our rest server just takes the message body, creates a request ID // for it, and sends it on. This runs in raw mode, so void -rest_handle(nng_aio *aio) +rest_handle(nng_http *conn, void *arg, nng_aio *aio) { struct rest_job *job; - nng_http_req *req = nng_aio_get_input(aio, 0); - nng_http_conn *conn = nng_aio_get_input(aio, 2); - const char *clen; size_t sz; - nng_iov iov; int rv; void *data; @@ -218,18 +197,18 @@ rest_handle(nng_aio *aio) nng_aio_finish(aio, NNG_ENOMEM); return; } - if (((rv = nng_http_res_alloc(&job->http_res)) != 0) || - ((rv = nng_ctx_open(&job->ctx, req_sock)) != 0)) { + job->conn = conn; + if (((rv = nng_ctx_open(&job->ctx, req_sock)) != 0)) { rest_recycle_job(job); nng_aio_finish(aio, rv); return; } - nng_http_req_get_data(req, &data, &sz); + nng_http_get_body(conn, &data, &sz); job->http_aio = aio; if ((rv = nng_msg_alloc(&job->msg, sz)) != 0) { - rest_http_fatal(job, "nng_msg_alloc: %s", rv); + rest_http_fatal(job, rv); return; } @@ -329,7 +308,7 @@ inproc_server(void *arg) fatal("inproc recvmsg", rv); } body = nng_msg_body(msg); - for (int i = 0; i < nng_msg_len(msg); i++) { + for (size_t i = 0; i < nng_msg_len(msg); i++) { // Table lookup would be faster, but this works. if (isupper(body[i])) { char base = body[i] - 'A'; |
