Skip to content

Commit e6ca531

Browse files
committed
feat(http-utils): various updates and improvements
1 parent 7f8bdbf commit e6ca531

17 files changed

+2687
-1313
lines changed

HttpUtils/NAVFoundation.HttpUtils.axi

Lines changed: 360 additions & 101 deletions
Large diffs are not rendered by default.

HttpUtils/NAVFoundation.HttpUtils.h.axi

Lines changed: 187 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,42 @@ constant char NAV_HTTP_SCHEMES[][20] = {
8888
/**
8989
* @constant NAV_HTTP_MAX_REQUEST_LENGTH
9090
* @description Maximum allowed length for HTTP request
91+
* Can be overridden by defining before including this header.
92+
* Default: 4096 bytes
9193
*/
94+
#IF_NOT_DEFINED NAV_HTTP_MAX_REQUEST_LENGTH
9295
constant integer NAV_HTTP_MAX_REQUEST_LENGTH = 4096
96+
#END_IF
9397

9498
/**
9599
* @constant NAV_HTTP_MAX_RESPONSE_LENGTH
96100
* @description Maximum allowed length for HTTP response
101+
* Can be overridden by defining before including this header.
102+
* Default: 16384 bytes
97103
*/
104+
#IF_NOT_DEFINED NAV_HTTP_MAX_RESPONSE_LENGTH
98105
constant integer NAV_HTTP_MAX_RESPONSE_LENGTH = 16384
106+
#END_IF
107+
108+
/**
109+
* @constant NAV_HTTP_MAX_REQUEST_BODY
110+
* @description Maximum size for HTTP request body in bytes.
111+
* Can be overridden by defining before including this header.
112+
* Default: 8192 bytes
113+
*/
114+
#IF_NOT_DEFINED NAV_HTTP_MAX_REQUEST_BODY
115+
constant long NAV_HTTP_MAX_REQUEST_BODY = 8192
116+
#END_IF
117+
118+
/**
119+
* @constant NAV_HTTP_MAX_RESPONSE_BODY
120+
* @description Maximum size for HTTP response body in bytes.
121+
* Can be overridden by defining before including this header.
122+
* Default: 65535 bytes
123+
*/
124+
#IF_NOT_DEFINED NAV_HTTP_MAX_RESPONSE_BODY
125+
constant long NAV_HTTP_MAX_RESPONSE_BODY = 65535
126+
#END_IF
99127

100128
/**
101129
* @constant NAV_HTTP_METHOD_*
@@ -166,7 +194,7 @@ constant integer NAV_HTTP_STATUS_CODE_SUCCESS_RESET_CONTENT = 205
166194
constant integer NAV_HTTP_STATUS_CODE_SUCCESS_PARTIAL_CONTENT = 206
167195
constant integer NAV_HTTP_STATUS_CODE_SUCCESS_MULTI_STATUS = 207
168196
constant integer NAV_HTTP_STATUS_CODE_SUCCESS_ALREADY_REPORTED = 208
169-
constant integer NAV_HTTP_STATUS_CODE_SUCCESS_IM_USED = 209
197+
constant integer NAV_HTTP_STATUS_CODE_SUCCESS_IM_USED = 226
170198

171199
constant char NAV_HTTP_STATUS_MESSAGE_SUCCESS_OK[] = 'OK'
172200
constant char NAV_HTTP_STATUS_MESSAGE_SUCCESS_CREATED[] = 'Created'
@@ -274,19 +302,19 @@ constant integer NAV_HTTP_STATUS_CODE_SERVER_ERROR_LOOP_DETECTED
274302
constant integer NAV_HTTP_STATUS_CODE_SERVER_ERROR_NOT_EXTENDED = 510
275303
// constant integer NAV_HTTP_STATUS_CODE_SERVER_ERROR_NETWORK_AUTHENTICATION_REQUIRED = 511
276304

277-
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_SERVER_ERROR[] = 'Server Error'
305+
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_SERVER_ERROR[] = 'Internal Server Error'
278306
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_NOT_IMPLEMENTED[] = 'Not Implemented'
279307
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_BAD_GATEWAY[] = 'Bad Gateway'
280308
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_SERVICE_UNAVAILABLE[] = 'Service Unavailable'
281-
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_SERVER_TIMEOUT[] = 'Server Timeout'
282-
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_VERSION_NOT_SUPPORTED[] = 'Version Not Supported'
309+
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_SERVER_TIMEOUT[] = 'Gateway Timeout'
310+
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_VERSION_NOT_SUPPORTED[] = 'HTTP Version Not Supported'
283311
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_VARIANT_ALSO_NEGOTIATES[] = 'Variant Also Negotiates'
284312
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_INSUFFICIENT_STORAGE[] = 'Insufficient Storage'
285313
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_LOOP_DETECTED[] = 'Loop Detected'
286314
constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_NOT_EXTENDED[] = 'Not Extended'
287315
// constant char NAV_HTTP_STATUS_MESSAGE_SERVER_ERROR_NETWORK_AUTHENTICATION_REQUIRED[] = 'Network Authentication Required'
288316

289-
constant char NAV_HTTP_STATUS_MESSAGE_UNKNOWN[] = 'Unknown Error'
317+
constant char NAV_HTTP_STATUS_MESSAGE_UNKNOWN[] = 'Unknown'
290318

291319

292320
constant char NAV_HTTP_CONTENT_TYPE_APPLICATION_1D_INTERLEAVED_PARTYFEC[] = 'application/1d-interleaved-parityfec'
@@ -772,8 +800,14 @@ constant char NAV_HTTP_CONNECTION_CLOSE[] = 'close'
772800
constant char NAV_HTTP_CONNECTION_KEEP_ALIVE[] = 'keep-alive'
773801
constant char NAV_HTTP_CONNECTION_UPGRADE[] = 'upgrade'
774802

803+
// HTTP Response Buffer States
804+
constant integer NAV_HTTP_STATE_IDLE = 0
805+
constant integer NAV_HTTP_STATE_PARSING_HEADERS = 1
806+
constant integer NAV_HTTP_STATE_PARSING_BODY = 2
807+
775808
// Common Character Constants
776-
constant char NAV_HTTP_CRLF[] = '$0D,$0A'
809+
constant char NAV_HTTP_CRLF[] = {$0D,$0A}
810+
constant char NAV_HTTP_HEADER_DELIMITER[] = {$0D,$0A,$0D,$0A}
777811
constant char NAV_HTTP_HEADER_SEPARATOR[] = ': '
778812
constant char NAV_HTTP_QUERY_SEPARATOR[] = '?'
779813
constant char NAV_HTTP_FRAGMENT_SEPARATOR[] = '#'
@@ -806,25 +840,90 @@ constant integer NAV_HTTP_TIMEOUT_QUICK = 5
806840
constant integer NAV_HTTP_TIMEOUT_LONG = 120
807841

808842
// Maximum Sizes
809-
constant integer NAV_HTTP_MAX_HEADER_SIZE = 8192
810-
constant integer NAV_HTTP_MAX_URL_LENGTH = 2048
811-
constant integer NAV_HTTP_MAX_PATH_LENGTH = 1024
812-
constant integer NAV_HTTP_MAX_QUERY_LENGTH = 1024
813-
constant integer NAV_HTTP_MAX_HEADERS = 20
814-
constant integer NAV_HTTP_MAX_COOKIES = 20
843+
/**
844+
* @constant NAV_HTTP_MAX_HEADER_SIZE
845+
* @description Maximum size for a single HTTP header line.
846+
* Can be overridden by defining before including this header.
847+
* Default: 8192 bytes
848+
*/
849+
#IF_NOT_DEFINED NAV_HTTP_MAX_HEADER_SIZE
850+
constant integer NAV_HTTP_MAX_HEADER_SIZE = 8192
851+
#END_IF
815852

816-
// Websocket Related
817-
constant char NAV_HTTP_WEBSOCKET_VERSION[] = '13'
818-
constant char NAV_HTTP_WEBSOCKET_PROTOCOL[] = 'websocket'
853+
/**
854+
* @constant NAV_HTTP_MAX_URL_LENGTH
855+
* @description Maximum length for complete URLs.
856+
* Can be overridden by defining before including this header.
857+
* Default: 2048 bytes
858+
*/
859+
#IF_NOT_DEFINED NAV_HTTP_MAX_URL_LENGTH
860+
constant integer NAV_HTTP_MAX_URL_LENGTH = 2048
861+
#END_IF
862+
863+
/**
864+
* @constant NAV_HTTP_MAX_PATH_LENGTH
865+
* @description Maximum length for HTTP request paths (including query string).
866+
* Can be overridden by defining before including this header.
867+
* Default: 2048 bytes
868+
*/
869+
#IF_NOT_DEFINED NAV_HTTP_MAX_PATH_LENGTH
870+
constant integer NAV_HTTP_MAX_PATH_LENGTH = 2048
871+
#END_IF
872+
873+
/**
874+
* @constant NAV_HTTP_MAX_QUERY_LENGTH
875+
* @description Maximum length for URL query strings.
876+
* Can be overridden by defining before including this header.
877+
* Default: 1024 bytes
878+
*/
879+
#IF_NOT_DEFINED NAV_HTTP_MAX_QUERY_LENGTH
880+
constant integer NAV_HTTP_MAX_QUERY_LENGTH = 1024
881+
#END_IF
882+
883+
/**
884+
* @constant NAV_HTTP_MAX_HEADER_KEY
885+
* @description Maximum length for HTTP header keys/names.
886+
* Can be overridden by defining before including this header.
887+
* Default: 256 bytes
888+
*/
889+
#IF_NOT_DEFINED NAV_HTTP_MAX_HEADER_KEY
890+
constant integer NAV_HTTP_MAX_HEADER_KEY = 256
891+
#END_IF
892+
893+
/**
894+
* @constant NAV_HTTP_MAX_HEADER_VALUE
895+
* @description Maximum length for HTTP header values.
896+
* Can be overridden by defining before including this header.
897+
* Default: 2048 bytes (sufficient for JWT tokens, long cookies, etc.)
898+
*/
899+
#IF_NOT_DEFINED NAV_HTTP_MAX_HEADER_VALUE
900+
constant integer NAV_HTTP_MAX_HEADER_VALUE = 2048
901+
#END_IF
819902

820903
/**
821-
* Maximum number of HTTP headers allowed in a request or response.
822-
* Can be overridden before including this file if a different limit is needed.
904+
* @constant NAV_HTTP_MAX_HEADERS
905+
* @description Maximum number of HTTP headers allowed in a request or response.
906+
* Can be overridden by defining before including this header.
907+
* Default: 20
823908
*/
824909
#IF_NOT_DEFINED NAV_HTTP_MAX_HEADERS
825910
constant integer NAV_HTTP_MAX_HEADERS = 20
826911
#END_IF
827912

913+
/**
914+
* @constant NAV_HTTP_MAX_COOKIES
915+
* @description Maximum number of cookies that can be stored.
916+
* Can be overridden by defining before including this header.
917+
* Default: 20
918+
*/
919+
#IF_NOT_DEFINED NAV_HTTP_MAX_COOKIES
920+
constant integer NAV_HTTP_MAX_COOKIES = 20
921+
#END_IF
922+
923+
// Websocket Related
924+
constant char NAV_HTTP_WEBSOCKET_VERSION[] = '13'
925+
constant char NAV_HTTP_WEBSOCKET_PROTOCOL[] = 'websocket'
926+
828927

829928
DEFINE_TYPE
830929

@@ -847,14 +946,14 @@ struct _NAVHttpStatus {
847946
* @struct _NAVHttpHeader
848947
* @description Structure for storing a key-value pair of strings.
849948
*
850-
* @property {char[256]} Key - The key string
851-
* @property {char[1024]} Value - The value string
949+
* @property {char[NAV_HTTP_MAX_HEADER_KEY]} Key - The key string
950+
* @property {char[NAV_HTTP_MAX_HEADER_VALUE]} Value - The value string
852951
*
853952
* @see NAVHttpHeaderAdd
854953
*/
855954
struct _NAVHttpHeader {
856-
char Key[256];
857-
char Value[1024];
955+
char Key[NAV_HTTP_MAX_HEADER_KEY];
956+
char Value[NAV_HTTP_MAX_HEADER_VALUE];
858957
}
859958

860959
/**
@@ -877,22 +976,22 @@ struct _NAVHttpHeaderCollection {
877976
* @description Structure representing an HTTP request.
878977
*
879978
* @property {char[7]} Method - HTTP method (GET, POST, PUT, etc.)
880-
* @property {char[256]} Path - Request path including query string
979+
* @property {char[NAV_HTTP_MAX_PATH_LENGTH]} Path - Request path including query string
881980
* @property {char[8]} Version - HTTP version
882981
* @property {char[256]} Host - Target host
883982
* @property {integer} Port - Target port
884-
* @property {char[2048]} Body - Request body content
983+
* @property {char[NAV_HTTP_MAX_REQUEST_BODY]} Body - Request body content
885984
* @property {_NAVHttpHeader} Headers - Request headers
886985
*
887986
* @see NAVHttpRequestInit
888987
*/
889988
struct _NAVHttpRequest {
890989
char Method[7];
891-
char Path[256];
990+
char Path[NAV_HTTP_MAX_PATH_LENGTH];
892991
char Version[8];
893992
char Host[256];
894993
integer Port;
895-
char Body[2048];
994+
char Body[NAV_HTTP_MAX_REQUEST_BODY];
896995

897996
_NAVHttpHeaderCollection Headers;
898997
}
@@ -903,7 +1002,7 @@ struct _NAVHttpRequest {
9031002
*
9041003
* @property {_NAVHttpStatus} Status - Response status code and message
9051004
* @property {_NAVHttpHeader} Headers - Response headers
906-
* @property {char[16384]} Body - Response body content
1005+
* @property {char[NAV_HTTP_MAX_RESPONSE_BODY]} Body - Response body content
9071006
* @property {char[256]} ContentType - Content-Type of the response
9081007
* @property {long} ContentLength - Length of response body in bytes
9091008
*
@@ -912,9 +1011,70 @@ struct _NAVHttpRequest {
9121011
struct _NAVHttpResponse {
9131012
_NAVHttpStatus Status;
9141013
_NAVHttpHeaderCollection Headers;
915-
char Body[16384];
1014+
char Body[NAV_HTTP_MAX_RESPONSE_BODY];
9161015
char ContentType[256];
9171016
long ContentLength;
9181017
}
9191018

1019+
/**
1020+
* @struct _NAVHttpResponseBuffer
1021+
* @description Buffer structure for processing HTTP responses with state management.
1022+
*
1023+
* Used with NAVHttpProcessResponseBuffer for incremental response processing.
1024+
* Connect the Data field to a device buffer using create_buffer, then call
1025+
* NAVHttpProcessResponseBuffer from your data_event string handler.
1026+
*
1027+
* @property {char[]} Data - Buffer containing received HTTP data
1028+
* @property {char} Semaphore - Prevents concurrent access to buffer
1029+
* @property {integer} State - Current parsing state (IDLE, PARSING_HEADERS, PARSING_BODY)
1030+
* @property {long} ContentLength - Expected body length (set by user after parsing headers)
1031+
*
1032+
* @see NAVHttpProcessResponseBuffer
1033+
* @see NAVHttpResponseBufferInit
1034+
*/
1035+
struct _NAVHttpResponseBuffer {
1036+
char Data[NAV_HTTP_MAX_RESPONSE_BODY];
1037+
char Semaphore;
1038+
integer State;
1039+
long ContentLength;
1040+
}
1041+
1042+
/**
1043+
* @struct _NAVHttpResponseHeadersResult
1044+
* @description Result structure passed to headers callback.
1045+
*
1046+
* @property {char[]} Data - Raw header data extracted from buffer
1047+
*
1048+
* @see NAVHttpResponseHeadersCallback
1049+
* @see NAVHttpParseResponseHeaders
1050+
*/
1051+
struct _NAVHttpResponseHeadersResult {
1052+
char Data[NAV_HTTP_MAX_RESPONSE_BODY];
1053+
}
1054+
1055+
/**
1056+
* @struct _NAVHttpResponseBodyResult
1057+
* @description Result structure passed to body callback.
1058+
*
1059+
* @property {char[]} Data - Raw body data extracted from buffer
1060+
*
1061+
* @see NAVHttpResponseBodyCallback
1062+
* @see NAVHttpParseResponseBody
1063+
*/
1064+
struct _NAVHttpResponseBodyResult {
1065+
char Data[NAV_HTTP_MAX_RESPONSE_BODY];
1066+
}
1067+
1068+
/**
1069+
* @struct _NAVHttpResponseCompleteResult
1070+
* @description Result structure passed to complete callback.
1071+
*
1072+
* @property {integer} State - The state that completed (PARSING_HEADERS or PARSING_BODY)
1073+
*
1074+
* @see NAVHttpResponseCompleteCallback
1075+
*/
1076+
struct _NAVHttpResponseCompleteResult {
1077+
integer State;
1078+
}
1079+
9201080
#END_IF // __NAV_FOUNDATION_HTTPUTILS_H__

0 commit comments

Comments
 (0)