diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Components/wac_network/Headers.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Components/wac_network/Headers.cpp')
-rw-r--r-- | Src/Components/wac_network/Headers.cpp | 120 |
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; +} |