aboutsummaryrefslogtreecommitdiff
path: root/Src/Components/wac_network/Headers.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Components/wac_network/Headers.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Components/wac_network/Headers.cpp')
-rw-r--r--Src/Components/wac_network/Headers.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/Src/Components/wac_network/Headers.cpp b/Src/Components/wac_network/Headers.cpp
new file mode 100644
index 00000000..bf95a7b4
--- /dev/null
+++ b/Src/Components/wac_network/Headers.cpp
@@ -0,0 +1,120 @@
+#include "foundation/error.h"
+#include "foundation/types.h"
+
+#include "headers.h"
+#include "netinc.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+JNL_Headers::JNL_Headers()
+{
+ m_recvheaders = NULL;
+ m_recvheaders_size = 0;
+}
+
+JNL_Headers::~JNL_Headers()
+{
+ if ( m_recvheaders )
+ free( m_recvheaders );
+}
+
+void JNL_Headers::Reset()
+{
+ if ( m_recvheaders )
+ free( m_recvheaders );
+
+ m_recvheaders = NULL;
+ m_recvheaders_size = 0;
+}
+
+const char *JNL_Headers::GetAllHeaders()
+{
+ // double null terminated, null delimited list
+ if ( m_recvheaders )
+ return m_recvheaders;
+ else
+ return "\0\0";
+}
+
+const char *JNL_Headers::GetHeader( const char *headername )
+{
+ char *ret = NULL;
+
+ if ( headername[ 0 ] == 0 || !m_recvheaders )
+ return NULL;
+
+ size_t headername_size = strlen( headername );
+
+ char *buf = (char *)malloc( headername_size + 2 );
+ strcpy( buf, headername );
+
+ if ( buf[ headername_size - 1 ] != ':' )
+ {
+ buf[ headername_size++ ] = ':';
+ buf[ headername_size ] = 0;
+ }
+
+ char *p = m_recvheaders;
+ while ( p && *p )
+ {
+ if ( !strncasecmp( buf, p, headername_size ) )
+ {
+ ret = p + headername_size;
+ while ( ret && *ret && *ret == ' ' )
+ ret++;
+
+ break;
+ }
+
+ p += strlen( p ) + 1;
+ }
+
+ free( buf );
+
+ return ret;
+}
+
+int JNL_Headers::Add( const char *buf )
+{
+ if ( !m_recvheaders )
+ {
+ m_recvheaders_size = strlen( buf ) + 1;
+ if ( m_recvheaders_size == 0 || m_recvheaders_size == (size_t)-1 ) // check for overflow
+ {
+ return NErr_OutOfMemory;
+ }
+
+ m_recvheaders = (char *)malloc( m_recvheaders_size + 1 );
+ if ( m_recvheaders )
+ {
+ strcpy( m_recvheaders, buf ); // safe because we malloc'd specifically above
+ m_recvheaders[ m_recvheaders_size ] = 0;
+ }
+ else
+ {
+ return NErr_OutOfMemory;
+ }
+ }
+ else
+ {
+ size_t oldsize = m_recvheaders_size;
+ m_recvheaders_size += strlen( buf ) + 1;
+ if ( m_recvheaders_size + 1 < oldsize ) // check for overflow
+ {
+ return NErr_OutOfMemory;
+ }
+
+ char *n = (char *)realloc( m_recvheaders, m_recvheaders_size + 1 );
+ if ( !n )
+ {
+ return NErr_OutOfMemory;
+ }
+
+ strcpy( n + oldsize, buf ); // safe because we malloc specifially for the size
+ n[ m_recvheaders_size ] = 0; // double null terminate
+ m_recvheaders = n;
+ }
+
+ return NErr_Success;
+}