eEmtyCodec
} eStreamType;
-void *StrBufNewStreamContext(eStreamType type);
-void StrBufDestroyStreamContext(eStreamType type, void **Stream);
-int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *Stream, int LastChunk);
+void *StrBufNewStreamContext(eStreamType type, const char **Err);
+int StrBufDestroyStreamContext(eStreamType type, void **Stream, const char **Err);
+int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *Stream, int LastChunk, const char **Err);
int StrBufDecodeBase64(StrBuf *Buf);
int StrBufDecodeBase64To(const StrBuf *BufIn, StrBuf *BufOut);
z_stream zstream;
} z_enc_stream;
-void *StrBufNewStreamContext(eStreamType type)
+void *StrBufNewStreamContext(eStreamType type, const char **Err)
{
base64_decodestate *state;;
+ *Err = NULL;
switch (type)
{
err = inflateInit(&stream->zstream);
if (err != Z_OK) {
- StrBufDestroyStreamContext(type, (void**)&stream);
+ StrBufDestroyStreamContext(type, (void**)&stream, Err);
+ *Err = zError(err);
return NULL;
}
return stream;
DEF_MEM_LEVEL,
Z_DEFAULT_STRATEGY);
if (err != Z_OK) {
- StrBufDestroyStreamContext(type, (void**) &stream);
+ StrBufDestroyStreamContext(type, (void**) &stream, Err);
+ *Err = zError(err);
return NULL;
}
return stream;
return NULL;
}
-void StrBufDestroyStreamContext(eStreamType type, void **vStream)
+int StrBufDestroyStreamContext(eStreamType type, void **vStream, const char **Err)
{
+ int err;
+ int rc = 0;
+ *Err = NULL;
+
if ((vStream == NULL) || (*vStream==NULL)) {
- return;
+ *Err = strerror(EINVAL);
+ return EINVAL;
}
switch (type)
{
case eZLibEncode:
{
z_enc_stream *stream = (z_enc_stream *)*vStream;
+ err = deflateEnd(&stream->zstream);
+ if (err != Z_OK) {
+ *Err = zError(err);
+ rc = -1;
+ }
free(stream->OutBuf.buf);
free(stream);
-// todo more?
*vStream = NULL;
break;
}
case eEmtyCodec:
break; /// TODO
}
+ return rc;
}
-int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *vStream, int LastChunk)
+int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *vStream, int LastChunk, const char **Err)
{
-
+ int rc = 0;
switch (type)
{
case eBase64Encode:
(In->Buf->BufUsed - stream->zstream.avail_in);
}
}
- return (LastChunk && (err != Z_FINISH));
+ rc = (LastChunk && (err != Z_FINISH));
+ if (!rc && (err != Z_OK)) {
+ *Err = zError(err);
+ }
}
break;
err = Z_DATA_ERROR; /* and fall through */
case Z_DATA_ERROR:
- fprintf(stderr, "sanoteuh\n");
+ *Err = zError(err);
case Z_MEM_ERROR:
(void)inflateEnd(&stream->zstream);
return err;
}
break; /// TODO
}
- return 0;
+ return rc;
}
/**
IOBuffer ReadBuffer;
IOBuffer WriteBuffer;
int err;
+ const char *Err = NULL;
int ret = 0;
int done = 0;
void *vStream;
ST = eBase64Decode;
else
ST = eEmtyCodec;
- vStream = StrBufNewStreamContext(ST);
+ vStream = StrBufNewStreamContext(ST, &Err);
while (!done && (fdin >= 0) && (fdout >= 0) && (!feof(stdin)))
{
do
{
do {
- ret = StrBufStreamTranscode(ST, &WriteBuffer, &ReadBuffer, NULL, -1, vStream, done);
+ ret = StrBufStreamTranscode(ST, &WriteBuffer, &ReadBuffer, NULL, -1, vStream, done, &Err);
while (IOBufferStrLength(&WriteBuffer) > 0)
{
}
- StrBufDestroyStreamContext(ST, &vStream);
+ StrBufDestroyStreamContext(ST, &vStream, &Err);
FreeStrBuf(&ReadBuffer.Buf);
FreeStrBuf(&WriteBuffer.Buf);
int client_con_state = 0;
int chunked = 0;
int is_gzip = 0;
+ const char *Err = NULL;
StrBuf *BufHeader = NULL;
StrBuf *Buf;
StrBuf *pBuf = NULL;
if (chunked && !DisableGzip && WCC->Hdr->HR.gzip_ok)
{
is_gzip = 1;
- SC = StrBufNewStreamContext (eZLibEncode);
+ SC = StrBufNewStreamContext (eZLibEncode, &Err);
+ if (SC == NULL) {
+ syslog(LOG_ERR, "Error while initializing stream context: %s", Err);
+ FreeStrBuf(&Buf);
+ return;
+ }
memset(&ReadBuffer, 0, sizeof(IOBuffer));
ReadBuffer.Buf = WCC->WBuf;
FreeStrBuf(&Buf);
FreeStrBuf(&WriteBuffer.Buf);
FreeStrBuf(&BufHeader);
- StrBufDestroyStreamContext(eZLibEncode, SC);
+ if (StrBufDestroyStreamContext(eZLibEncode, SC, &Err) && Err) {
+ syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
+ }
return;
}
}
FreeStrBuf(&Buf);
FreeStrBuf(&WriteBuffer.Buf);
FreeStrBuf(&BufHeader);
- StrBufDestroyStreamContext(eZLibEncode, SC);
+ StrBufDestroyStreamContext(eZLibEncode, SC, &Err);
+ if (StrBufDestroyStreamContext(eZLibEncode, SC, &Err) && Err) {
+ syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
+ }
return;
}
int rc;
do {
- rc = StrBufStreamTranscode(eZLibEncode, &WriteBuffer, &ReadBuffer, NULL, -1, SC, done);
+ rc = StrBufStreamTranscode(eZLibEncode, &WriteBuffer, &ReadBuffer, NULL, -1, SC, done, &Err);
if (StrLength (pBuf) > 0) {
StrBufPrintf(BufHeader, "%s%x\r\n",
}
}
- StrBufDestroyStreamContext(eZLibEncode, &SC);
+ if (SC && StrBufDestroyStreamContext(eZLibEncode, SC, &Err) && Err) {
+ syslog(LOG_ERR, "Error while destroying stream context: %s", Err);
+ }
FreeStrBuf(&WriteBuffer.Buf);
if ((chunked) && (client_con_state == 0))
{