Skip to content

Commit

Permalink
fixes nanomsg#681 HTTP convenience GET method desired...
Browse files Browse the repository at this point in the history
This adds a couple of new methods, and related documentation
and test cases.
  • Loading branch information
gdamore committed Aug 30, 2018
1 parent c96b766 commit 0cc96c6
Show file tree
Hide file tree
Showing 15 changed files with 793 additions and 8 deletions.
4 changes: 4 additions & 0 deletions docs/man/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -198,11 +198,13 @@ if (NNG_ENABLE_DOC)
nng_http_client_free
nng_http_client_get_tls
nng_http_client_set_tls
nng_http_client_transact
nng_http_conn_close
nng_http_conn_read
nng_http_conn_read_all
nng_http_conn_read_req
nng_http_conn_read_res
nng_http_conn_transact
nng_http_conn_write
nng_http_conn_write_all
nng_http_conn_write_req
Expand All @@ -220,6 +222,7 @@ if (NNG_ENABLE_DOC)
nng_http_req_copy_data
nng_http_req_del_header
nng_http_req_free
nng_http_req_get_data
nng_http_req_get_header
nng_http_req_get_method
nng_http_req_get_uri
Expand All @@ -235,6 +238,7 @@ if (NNG_ENABLE_DOC)
nng_http_res_copy_data
nng_http_res_del_header
nng_http_res_free
nng_http_res_get_data
nng_http_res_get_header
nng_http_res_get_reason
nng_http_res_get_status
Expand Down
16 changes: 10 additions & 6 deletions docs/man/libnng.3.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ and connections.
|<<nng_http_req_copy_data.3http#,nng_http_req_copy_data()>>|copy HTTP request body
|<<nng_http_req_del_header.3http#,nng_http_req_del_header()>>|delete HTTP request header
|<<nng_http_req_free.3http#,nng_http_req_free()>>|free HTTP request structure
|<<nng_http_req_get_data.3http#,nng_http_req_get_data()>>|get HTTP request body
|<<nng_http_req_get_header.3http#,nng_http_req_get_header()>>|return HTTP request header
|<<nng_http_req_get_method.3http#,nng_http_req_get_method()>>|return HTTP request method
|<<nng_http_req_get_uri.3http#,nng_http_req_get_uri()>>|return HTTP request URI
Expand All @@ -302,11 +303,12 @@ and connections.
|<<nng_http_res_copy_data.3http#,nng_http_res_copy_data()>>|copy HTTP response body
|<<nng_http_res_del_header.3http#,nng_http_res_del_header()>>|delete HTTP response header
|<<nng_http_res_free.3http#,nng_http_res_free()>>|free HTTP response structure
|<<nng_http_res_set_data.3http#,nng_http_res_set_data()>>|set HTTP response body
|<<nng_http_res_get_data.3http#,nng_http_res_get_data()>>|get HTTP response body
|<<nng_http_res_get_header.3http#,nng_http_res_get_header()>>|return HTTP response header
|<<nng_http_res_get_reason.3http#,nng_http_res_get_reason()>>|return HTTP response reason
|<<nng_http_res_get_status.3http#,nng_http_res_get_status()>>|return HTTP response status
|<<nng_http_res_get_version.3http#,nng_http_res_get_version()>>|return HTTP response protocol version
|<<nng_http_res_set_data.3http#,nng_http_res_set_data()>>|set HTTP response body
|<<nng_http_res_set_header.3http#,nng_http_res_set_header()>>|set HTTP response header
|<<nng_http_res_set_reason.3http#,nng_http_res_set_reason()>>|set HTTP response reason
|<<nng_http_res_set_status.3http#,nng_http_res_set_status()>>|set HTTP response status
Expand All @@ -318,11 +320,13 @@ and connections.
These functions are intended for use with HTTP client applications.

|===
| <<nng_http_client_alloc.3http#,nng_http_client_alloc()>>|allocate HTTP client
| <<nng_http_client_connect.3http#,nng_http_client_connect()>>|establish HTTP client connection
| <<nng_http_client_free.3http#,nng_http_client_free()>>|free HTTP client
| <<nng_http_client_get_tls.3http#,nng_http_client_get_tls()>>|get HTTP client TLS configuration
| <<nng_http_client_set_tls.3http#,nng_http_client_set_tls()>>|set HTTP client TLS configuration
|<<nng_http_client_alloc.3http#,nng_http_client_alloc()>>|allocate HTTP client
|<<nng_http_client_connect.3http#,nng_http_client_connect()>>|establish HTTP client connection
|<<nng_http_client_free.3http#,nng_http_client_free()>>|free HTTP client
|<<nng_http_client_get_tls.3http#,nng_http_client_get_tls()>>|get HTTP client TLS configuration
|<<nng_http_client_set_tls.3http#,nng_http_client_set_tls()>>|set HTTP client TLS configuration
|<<nng_http_client_transact.3http#,nng_http_client_transact()>>|perform one HTTP transaction
|<<nng_http_conn_transact.3http#,nng_http_conn_transact()>>|perform one HTTP transaction on connection
|===

==== HTTP Server Functions
Expand Down
89 changes: 89 additions & 0 deletions docs/man/nng_http_client_transact.3http.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
= nng_http_client_transact(3http)
//
// Copyright 2018 Staysail Systems, Inc. <[email protected]>
// Copyright 2018 Capitar IT Group BV <[email protected]>
//
// This document is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//

== NAME

nng_http_client_transact - perform one HTTP transaction

== SYNOPSIS

[source, c]
----
#include <nng/nng.h>
#include <nng/supplemental/http/http.h>
void nng_http_client_transact(nng_http_client *client, nng_http_req *req,
nng_http_res *res, nng_aio *aio);
----

== DESCRIPTION

The `nng_http_client_transact()` function is used to perform a complete
HTTP exchange.
It creates a new connection using _client_, performs the transaction by
sending the request _req_
(and attached body data) to the remote server, then reading the response
_res_, and finally closes the connection that it created.
The entire response is read, including any associated body, which can
subsequently be obtained using
`<<nng_http_res_get_data.3http#,nng_http_res_get_data()>>`.

This function is intended to make creation of client applications easier,
by performing multiple asynchronous operations required to complete an
entire HTTP transaction.

A similar function,
`<<nng_http_conn_transact.3http#,nng_http_conn_transact()>>`,
exists.
That function behaves similarily, but uses an existing connection, which
can be reused.

NOTE: This function does not support reading data sent using chunked
transfer encoding, and if the server attempts to do so, the underlying
connection will be closed and an `NNG_ENOTSUP` error will be returned.
This limitation is considered a bug, and a fix is planned for the future.

WARNING: If the remote server tries to send an extremely large buffer,
then a corresponding allocation will be made, which can lead to denial
of service attacks.
Client applications should take care to use this only with reasonably
trust-worthy servers.

This function returns immediately, with no return value.
Completion of the operation is signaled via the _aio_, and the final result
may be obtained via `<<nng_aio_result.3#,nng_aio_result()>>`.
That result will either be zero or an error code.

== RETURN VALUES

None.

== ERRORS

[horizontal]
`NNG_ECANCELED`:: The operation was canceled.
`NNG_ECLOSED`:: The connection was closed.
`NNG_ECONNRESET`:: The peer closed the connection.
`NNG_ENOMEM`:: Insufficient free memory to perform the operation.
`NNG_ENOTSUP`:: HTTP operations are not supported, or peer sent chunked encoding.
`NNG_EPROTO`:: An HTTP protocol error occurred.
`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection.

== SEE ALSO

[.text-left]
<<nng_aio_alloc.3#,nng_aio_alloc(3)>>,
<<nng_aio_result.3#,nng_aio_result(3)>>,
<<nng_strerror.3#,nng_strerror(3)>>,
<<nng_http_client_connect.3http#,nng_http_client_connect(3http)>>,
<<nng_http_conn_transact.3http#,nng_http_conn_transact(3http)>>,
<<nng_http_res_get_data.3http#,nng_http_res_get_data(3http)>>,
<<nng.7#,nng(7)>>
8 changes: 8 additions & 0 deletions docs/man/nng_http_conn_read_res.3http.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ the operation is signaled via the _aio_, and the final result may be
obtained via `<<nng_aio_result.3#,nng_aio_result()>>`.
That result will either be zero or an error code.

NOTE: Consider using the
`<<nng_http_client_transact.3http#,nng_http_client_transact()>>` or
`<<nng_http_conn_transact.3http#,nng_http_conn_transact()>>` functions,
which provide a simpler interface for performing a complete HTTP client
transaction.

== RETURN VALUES

None.
Expand All @@ -63,5 +69,7 @@ None.
<<nng_aio_result.3#,nng_aio_result(3)>>,
<<nng_strerror.3#,nng_strerror(3)>>,
<<nng_http_client_connect.3http#,nng_http_client_connect(3http)>>,
<<nng_http_client_transact.3http#,nng_http_client_transact(3http)>>,
<<nng_http_conn_transact.3http#,nng_http_conn_transact(3http)>>,
<<nng_http_conn_read_all.3http#,nng_http_conn_read_all(3http)>>,
<<nng.7#,nng(7)>>
98 changes: 98 additions & 0 deletions docs/man/nng_http_conn_transact.3http.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
= nng_http_conn_transact(3http)
//
// Copyright 2018 Staysail Systems, Inc. <[email protected]>
// Copyright 2018 Capitar IT Group BV <[email protected]>
//
// This document is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//

== NAME

nng_http_conn_transact - perform one HTTP transaction on connection

== SYNOPSIS

[source, c]
----
#include <nng/nng.h>
#include <nng/supplemental/http/http.h>
void nng_http_conn_transact(nng_http_conn *conn, nng_http_req *req,
nng_http_res *res, nng_aio *aio);
----

== DESCRIPTION

The `nng_http_conn_transact()` function is used to perform a complete
HTTP exchange over the connection _conn_, sending the request _req_
(and attached body data) to the remote server, and reading the response
_res_.
The entire response is read, including any associated body, which can
subsequently be obtained using
`<<nng_http_res_get_data.3http#,nng_http_res_get_data()>>`.

This function is intended to make creation of client applications easier,
by performing multiple asynchronous operations required to complete an
entire HTTP transaction.

If an error occurs, the caller should close _conn_ with
`<<nng_http_conn_close.3http#,nng_http_conn_close()>>`, as it may not
necessarily be usable with other transactions.

A similar function,
`<<nng_http_client_transact.3http#,nng_http_client_transact()>>`,
exists.
That function behaves similarily, but creates a connection on demand
for the transaction, and disposes of it when finished.

NOTE: This function does not support reading data sent using chunked
transfer encoding, and if the server attempts to do so, the underlying
connection will be closed and an `NNG_ENOTSUP` error will be returned.
This limitation is considered a bug, and a fix is planned for the future.

WARNING: If the remote server tries to send an extremely large buffer,
then a corresponding allocation will be made, which can lead to denial
of service attacks.
Client applications should take care to use this only with reasonably
trust-worthy servers.

WARNING: A given connection _conn_ should be used with only one
operation or transaction at a time as HTTP/1.1 has no support for
request interleaving.

This function returns immediately, with no return value.
Completion of the operation is signaled via the _aio_, and the final result
may be obtained via `<<nng_aio_result.3#,nng_aio_result()>>`.
That result will either be zero or an error code.

== RETURN VALUES

None.

== ERRORS

[horizontal]
`NNG_ECANCELED`:: The operation was canceled.
`NNG_ECLOSED`:: The connection was closed.
`NNG_ECONNRESET`:: The peer closed the connection.
`NNG_ENOMEM`:: Insufficient free memory to perform the operation.
`NNG_ENOTSUP`:: HTTP operations are not supported, or peer sent chunked encoding.
`NNG_EPROTO`:: An HTTP protocol error occurred.
`NNG_ETIMEDOUT`:: Timeout waiting for data from the connection.

== SEE ALSO

[.text-left]
<<nng_aio_alloc.3#,nng_aio_alloc(3)>>,
<<nng_aio_result.3#,nng_aio_result(3)>>,
<<nng_strerror.3#,nng_strerror(3)>>,
<<nng_http_client_connect.3http#,nng_http_client_connect(3http)>>,
<<nng_http_client_transact.3http#,nng_http_client_transact(3http)>>,
<<nng_http_conn_read_res.3http#,nng_http_conn_read_res(3http)>>,
<<nng_http_conn_read_all.3http#,nng_http_conn_read_all(3http)>>,
<<nng_http_conn_write_req.3http#,nng_http_conn_write_req(3http)>>,
<<nng_http_res_get_data.3http#,nng_http_res_get_data(3http)>>,
<<nng.7#,nng(7)>>
8 changes: 8 additions & 0 deletions docs/man/nng_http_conn_write_req.3http.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ Completion of the operation is signaled via the _aio_, and the final result
may be obtained via `<<nng_aio_result.3#,nng_aio_result()>>`.
That result will either be zero or an error code.

NOTE: Consider using the
`<<nng_http_client_transact.3http#,nng_http_client_transact()>>` or
`<<nng_http_conn_transact.3http#,nng_http_conn_transact()>>` functions,
which provide a simpler interface for performing a complete HTTP client
transaction.

== RETURN VALUES

None.
Expand All @@ -59,6 +65,8 @@ None.
<<nng_aio_alloc.3#,nng_aio_alloc(3)>>,
<<nng_aio_result.3#,nng_aio_result(3)>>,
<<nng_http_client_connect.3http#,nng_http_client_connect(3http)>>,
<<nng_http_client_transact.3http#,nng_http_client_transact(3http)>>,
<<nng_http_conn_read_all.3http#,nng_http_conn_read_all(3http)>>,
<<nng_http_conn_transact.3http#,nng_http_conn_transact(3http)>>,
<<nng_strerror.3#,nng_strerror(3)>>,
<<nng.7#,nng(7)>>
8 changes: 8 additions & 0 deletions docs/man/nng_http_conn_write_res.3http.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ If however the _res_ contains a header of `Connection:` with a value
of `Close` (case-insensitive) or the response corresponds to `HTTP/1.0`,
then the connection is immediately after sending the response.

NOTE: Consider using the
`<<nng_http_client_transact.3http#,nng_http_client_transact()>>` or
`<<nng_http_conn_transact.3http#,nng_http_conn_transact()>>` functions,
which provide a simpler interface for performing a complete HTTP client
transaction.

== RETURN VALUES

None.
Expand All @@ -68,6 +74,8 @@ None.
<<nng_aio_alloc.3#,nng_aio_alloc(3)>>,
<<nng_aio_result.3#,nng_aio_result(3)>>,
<<nng_http_client_connect.3http#,nng_http_client_connect(3http)>>,
<<nng_http_client_transact.3http#,nng_http_client_transact(3http)>>,
<<nng_http_conn_read_all.3http#,nng_http_conn_read_all(3http)>>,
<<nng_http_conn_transact.3http#,nng_http_conn_transact(3http)>>,
<<nng_strerror.3#,nng_strerror(3)>>,
<<nng.7#,nng(7)>>
50 changes: 50 additions & 0 deletions docs/man/nng_http_req_get_data.3http.adoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
= nng_http_req_get_data(3http)
//
// Copyright 2018 Staysail Systems, Inc. <[email protected]>
// Copyright 2018 Capitar IT Group BV <[email protected]>
//
// This document is supplied under the terms of the MIT License, a
// copy of which should be located in the distribution where this
// file was obtained (LICENSE.txt). A copy of the license may also be
// found online at https://opensource.org/licenses/MIT.
//

== NAME

nng_http_req_get_data - get HTTP request body

== SYNOPSIS

[source, c]
----
#include <nng/nng.h>
#include <nng/supplemental/http/http.h>
void nng_http_req_get_data(nng_http_req *req, void **bodyp, size_t *sizep);
----

== DESCRIPTION

The `nng_http_req_get_data()` gets the HTTP body associated with
the request _req_, storing a pointer to the buffer at the location referenced
by _bodyp_, and the length of the associated buffer at the location referenced
by _sizep_.

NOTE: The buffer returned is owned by _req_, and will automatically freed
when the request is freed.

== RETURN VALUES

None.

== ERRORS

None.

== SEE ALSO

[.text-left]
<<nng_http_req_alloc.3http#,nng_http_req_alloc(3http)>>,
<<nng_http_req_set_data.3http#,nng_http_req_copy_data(3http)>>,
<<nng_http_req_copy_data.3http#,nng_http_req_copy_data(3http)>>,
<<nng.7#,nng(7)>>
Loading

0 comments on commit 0cc96c6

Please sign in to comment.