ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
connection_endpoint.c
Go to the documentation of this file.
1
7#include <ascii-chat/common.h>
9
10#include <string.h>
11
13 switch (protocol) {
15 return "TCP";
17 return "WebSocket";
18 default:
19 return "Unknown";
20 }
21}
22
23static asciichat_error_t connection_endpoint_from_parts(connection_endpoint_t *endpoint_out, const url_parts_t *parts,
24 connection_endpoint_protocol_t protocol, uint16_t default_port,
25 const char *input) {
26 if (!endpoint_out || !parts || !parts->host) {
27 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid endpoint parse state");
28 }
29
30 memset(endpoint_out, 0, sizeof(*endpoint_out));
31 endpoint_out->protocol = protocol;
32 SAFE_STRNCPY(endpoint_out->input, input, sizeof(endpoint_out->input));
33 SAFE_STRNCPY(endpoint_out->host, parts->host, sizeof(endpoint_out->host));
34 endpoint_out->port = parts->port > 0 ? (uint16_t)parts->port : default_port;
35 endpoint_out->has_explicit_port = parts->port > 0;
36 return ASCIICHAT_OK;
37}
38
40 connection_endpoint_t *endpoint_out) {
41 if (!input || !*input || !endpoint_out) {
42 return SET_ERRNO(ERROR_INVALID_PARAM, "input or endpoint_out is NULL");
43 }
44
45 url_parts_t parts = {0};
46 asciichat_error_t result;
47
48 if (url_is_websocket(input)) {
49 result = url_parse(input, &parts);
50 if (result != ASCIICHAT_OK) {
51 return result;
52 }
53 result = connection_endpoint_from_parts(endpoint_out, &parts, CONNECTION_ENDPOINT_WEBSOCKET, default_port, input);
54 url_parts_destroy(&parts);
55 return result;
56 }
57
58 if (url_is_tcp(input)) {
59 result = url_parse(input, &parts);
60 if (result != ASCIICHAT_OK) {
61 return result;
62 }
63 result = connection_endpoint_from_parts(endpoint_out, &parts, CONNECTION_ENDPOINT_TCP, default_port, input);
64 url_parts_destroy(&parts);
65 return result;
66 }
67
68 /* Unsupported explicit scheme. Bare hostnames are allowed and have no "://". */
69 if (strstr(input, "://") != NULL) {
70 return SET_ERRNO(ERROR_INVALID_PARAM, "Unsupported connection scheme: %s", input);
71 }
72
73 result = url_parse(input, &parts);
74 if (result != ASCIICHAT_OK) {
75 return result;
76 }
77
78 result = connection_endpoint_from_parts(endpoint_out, &parts, CONNECTION_ENDPOINT_TCP, default_port, input);
79 url_parts_destroy(&parts);
80 return result;
81}
⚙️ Common definitions, error codes, macros, and types shared throughout the application
asciichat_error_t connection_endpoint_resolve(const char *input, uint16_t default_port, connection_endpoint_t *endpoint_out)
const char * connection_endpoint_protocol_name(connection_endpoint_protocol_t protocol)
Shared endpoint normalization for TCP and WebSocket connections.
connection_endpoint_protocol_t
@ CONNECTION_ENDPOINT_TCP
@ CONNECTION_ENDPOINT_WEBSOCKET
unsigned short uint16_t
Definition common.h:57
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:414
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it, returning the error code.
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
@ ASCIICHAT_OK
Definition error_codes.h:51
@ ERROR_INVALID_PARAM
void url_parts_destroy(url_parts_t *parts)
Free parsed URL components.
Definition url.c:281
bool url_is_websocket(const char *url)
Check if a URL string is a valid WebSocket URL.
Definition url.c:307
asciichat_error_t url_parse(const char *url, url_parts_t *parts_out)
Parse HTTP(S), WebSocket, and TCP URL into components.
Definition url.c:166
bool url_is_tcp(const char *url)
Check if a URL string is a valid TCP URL.
Definition url.c:342
connection_endpoint_protocol_t protocol
Structure containing parsed URL components.
Definition url.h:57
char * host
Extracted hostname or IP address (allocated)
Definition url.h:60
int port
Extracted port number (0 if not specified)
Definition url.h:62
🌐 Production-Grade URL Validation and Parsing