void test_spdylay_gzip_inflate(void) { spdylay_gzip *inflater; uint8_t in[4096], out[4096], *inptr; size_t inlen = sizeof(in); size_t inproclen, outproclen; const char *inputptr = input; inlen = deflate_data(in, inlen, (const uint8_t*)input, sizeof(input)-1); CU_ASSERT(0 == spdylay_gzip_inflate_new(&inflater)); /* First 16 bytes */ inptr = in; inproclen = inlen; outproclen = 16; CU_ASSERT(0 == spdylay_gzip_inflate(inflater, out, &outproclen, inptr, &inproclen)); CU_ASSERT(16 == outproclen); CU_ASSERT(inproclen > 0); CU_ASSERT(0 == memcmp(inputptr, out, outproclen)); /* Next 32 bytes */ inptr += inproclen; inlen -= inproclen; inproclen = inlen; inputptr += outproclen; outproclen = 32; CU_ASSERT(0 == spdylay_gzip_inflate(inflater, out, &outproclen, inptr, &inproclen)); CU_ASSERT(32 == outproclen); CU_ASSERT(inproclen > 0); CU_ASSERT(0 == memcmp(inputptr, out, outproclen)); /* Rest */ inptr += inproclen; inlen -= inproclen; inproclen = inlen; inputptr += outproclen; outproclen = sizeof(out); CU_ASSERT(0 == spdylay_gzip_inflate(inflater, out, &outproclen, inptr, &inproclen)); CU_ASSERT(sizeof(input)-49 == outproclen); CU_ASSERT(inproclen > 0); CU_ASSERT(0 == memcmp(inputptr, out, outproclen)); inlen -= inproclen; CU_ASSERT(0 == inlen); spdylay_gzip_inflate_del(inflater); }
/* * The implementation of spdylay_on_data_chunk_recv_callback type. We * use this function to print the received response body. */ static void on_data_chunk_recv_callback(spdylay_session *session, uint8_t flags, int32_t stream_id, const uint8_t *data, size_t len, void *user_data) { struct Request *req; req = spdylay_session_get_stream_user_data(session, stream_id); if(req) { printf("[INFO] C <---------------------------- S (DATA)\n"); printf(" %lu bytes\n", (unsigned long int)len); if(req->inflater) { while(len > 0) { uint8_t out[MAX_OUTLEN]; size_t outlen = MAX_OUTLEN; size_t tlen = len; int rv; rv = spdylay_gzip_inflate(req->inflater, out, &outlen, data, &tlen); if(rv == -1) { spdylay_submit_rst_stream(session, stream_id, SPDYLAY_INTERNAL_ERROR); break; } fwrite(out, 1, outlen, stdout); data += tlen; len -= tlen; } } else { /* TODO add support gzip */ fwrite(data, 1, len, stdout); } printf("\n"); } }
/* * The implementation of spdylay_on_data_chunk_recv_callback type. We * use this function to print the received response body. */ static void on_data_chunk_recv_callback(spdylay_session *session, uint8_t flags, int32_t stream_id, const uint8_t *data, size_t len, void *user_data) { (void)user_data; (void)flags; struct Request *req; req = spdylay_session_get_stream_user_data(session, stream_id); if(req) { printf("[INFO] C <---------------------------- S (DATA)\n"); printf(" %lu bytes\n", (unsigned long int)len); if(req->inflater) { while(len > 0) { uint8_t out[MAX_OUTLEN]; size_t outlen = MAX_OUTLEN; size_t tlen = len; int rv; rv = spdylay_gzip_inflate(req->inflater, out, &outlen, data, &tlen); if(rv == -1) { spdylay_submit_rst_stream(session, stream_id, SPDYLAY_INTERNAL_ERROR); break; } fwrite(out, 1, outlen, stdout); data += tlen; len -= tlen; } } else { /* TODO add support gzip */ fwrite(data, 1, len, stdout); //check if the data is correct //if(strcmp(RESPONSE_BODY, data) != 0) //killparent(parent, "\nreceived data is not the same"); if(len + rcvbuf_c > strlen(RESPONSE_BODY)) killparent(parent, "\nreceived data is not the same"); strcpy(rcvbuf + rcvbuf_c,(char*)data); rcvbuf_c+=len; } printf("\n"); } }