Skip to content

Commit

Permalink
URL refactor part 1.
Browse files Browse the repository at this point in the history
This eliminates most (but not all) of the dynamic allocations
associated with URL objects.  A number of convenience fields
on the URL are removed, but we are able to use common buffer
for most of the details.
  • Loading branch information
gdamore committed Nov 18, 2024
1 parent e54e2b1 commit b3e0ce9
Show file tree
Hide file tree
Showing 13 changed files with 197 additions and 270 deletions.
7 changes: 3 additions & 4 deletions docs/ref/api/url.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,11 @@ that are not part of the IETF standards.
typedef struct nng_url {
const char *u_scheme;
char *u_userinfo;
char *u_host;
char *u_hostname;
uint16_t u_port;
char *u_path;
char *u_query;
char *u_fragment;
char *u_requri;
} nng_url;
```

Expand All @@ -29,17 +27,18 @@ typedef struct nng_url {
Applications may access individual fields, but must not free or
alter them, as the underlying memory is managed by the library.

Additionally applications must not depend on the size of this structure.
Obtain one using `nng_parse_url`.

The fields of an `nng_url` object are as follows:

- `u_scheme`: The URL scheme, such as "http" or "inproc". Always lower case. This will never be `NULL`.
- `u_userinfo`: This username and password if supplied in the URL string. Will be `NULL` when not present.
- `u_host`: The full host part of the URL, including the port if present (separated by a colon.)
- `u_hostname`: The name of the host, and may be the empty string in some cases.
- `u_port`: The port. May be zero if irrelevant or not specified.
- `u_path`: The path, typically used with HTTP or WebSockets. Will be empty string if not specified.
- `u_query`: The query info (typically following `?` in the URL.) Will be `NULL` if not present.
- `u_fragment`: This is used for specifying an anchor, the part after `#` in a URL. Will be `NULL` if not present.
- `u_requri`: The full Request-URI. Will be the empty string if not specified.

> [!NOTE]
> Other fields may also be present, but only those documented here are safe for application use.
Expand Down
13 changes: 11 additions & 2 deletions docs/ref/migrate/nng1.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,11 +160,20 @@ A number of the [statistics][statistic] functions take, or return, `const nng_st
of plain `nng_stat *`. The ABI has not changed, but it may be necessary to declare
certain methods variables `const` to avoid warnings about misuse of `const`.

## Url Structure Members
## Wildcards Not Valid in URLs

The use of `*` to act as a wild card meaning all local interface addresses
is removed. The empty string already performs this function, and unlike
`*` is RFC compliant.

## URL Structure Members

The details of [`nng_url`] have changed as follows:

- `u_port` is no longer a string, but a `uint16_t`
- `u_scheme` is a const char \*
- `u_scheme` is a `const char *`
- `u_requri` is removed - it can be easily formulated from the other fields.
- `u_host` is removed - use `u_hostname` and `u_port` to construct if needed
- `u_rawurl` is removed - a "cooked" URL can be obtained from the new [`nng_url_sprintf`] function.

{{#include ../xref.md}}
8 changes: 5 additions & 3 deletions include/nng/nng.h
Original file line number Diff line number Diff line change
Expand Up @@ -1085,14 +1085,16 @@ enum nng_errno_enum {
typedef struct nng_url {
char *u_rawurl; // never NULL
const char *u_scheme; // never NULL
char *u_userinfo; // will be NULL if not specified
char *u_host; // including colon and port
const char *u_userinfo; // will be NULL if not specified
char *u_hostname; // name only, will be "" if not specified
uint16_t u_port; // port, may be zero for schemes that do not use
char *u_path; // path, will be "" if not specified
char *u_query; // without '?', will be NULL if not specified
char *u_fragment; // without '#', will be NULL if not specified
char *u_requri; // includes query and fragment, "" if not specified
// these members are private
char *u_buffer;
size_t u_bufsz;
char u_static[NNG_MAXADDRLEN]; // Most URLs fit within this
} nng_url;

// nng_url_parse parses a URL string into a structured form.
Expand Down
Loading

0 comments on commit b3e0ce9

Please sign in to comment.