#include "MultipartParser.h" #include "MultipartReader.h" #include #include #include #include #include //#define TEST_PARSER #define INPUT_FILE "input3.txt" //#define BOUNDARY "abcd" #define BOUNDARY "-----------------------------168072824752491622650073" #define TIMES 10 #define SLURP #define QUIET using namespace std; #ifdef TEST_PARSER static void onPartBegin(const char *buffer, size_t start, size_t end, void *userData) { printf("onPartBegin\n"); } static void onHeaderField(const char *buffer, size_t start, size_t end, void *userData) { printf("onHeaderField: (%s)\n", string(buffer + start, end - start).c_str()); } static void onHeaderValue(const char *buffer, size_t start, size_t end, void *userData) { printf("onHeaderValue: (%s)\n", string(buffer + start, end - start).c_str()); } static void onPartData(const char *buffer, size_t start, size_t end, void *userData) { printf("onPartData: (%s)\n", string(buffer + start, end - start).c_str()); } static void onPartEnd(const char *buffer, size_t start, size_t end, void *userData) { printf("onPartEnd\n"); } static void onEnd(const char *buffer, size_t start, size_t end, void *userData) { printf("onEnd\n"); } #else void onPartBegin(const MultipartHeaders &headers, void *userData) { printf("onPartBegin:\n"); MultipartHeaders::const_iterator it; MultipartHeaders::const_iterator end = headers.end(); for (it = headers.begin(); it != headers.end(); it++) { printf(" %s = %s\n", it->first.c_str(), it->second.c_str()); } printf(" aaa: %s\n", headers["aaa"].c_str()); } void onPartData(const char *buffer, size_t size, void *userData) { //printf("onPartData: (%s)\n", string(buffer, size).c_str()); } void onPartEnd(void *userData) { printf("onPartEnd\n"); } void onEnd(void *userData) { printf("onEnd\n"); } #endif int main() { #ifdef TEST_PARSER MultipartParser parser; #ifndef QUIET parser.onPartBegin = onPartBegin; parser.onHeaderField = onHeaderField; parser.onHeaderValue = onHeaderValue; parser.onPartData = onPartData; parser.onPartEnd = onPartEnd; parser.onEnd = onEnd; #endif #else MultipartReader parser; #ifndef QUIET parser.onPartBegin = onPartBegin; parser.onPartData = onPartData; parser.onPartEnd = onPartEnd; parser.onEnd = onEnd; #endif #endif struct timeval stime, etime; struct stat sbuf; stat(INPUT_FILE, &sbuf); #ifdef SLURP size_t bufsize = sbuf.st_size; char *buf = (char *) malloc(bufsize); FILE *f = fopen(INPUT_FILE, "rb"); fread(buf, 1, bufsize, f); fclose(f); gettimeofday(&stime, NULL); for (int i = 0; i < TIMES; i++) { #ifndef QUIET printf("------------\n"); #endif parser.setBoundary(BOUNDARY); size_t fed = 0; do { size_t ret = parser.feed(buf + fed, bufsize - fed); fed += ret; } while (fed < bufsize && !parser.stopped()); #ifndef QUIET printf("%s\n", parser.getErrorMessage()); #endif } gettimeofday(&etime, NULL); #else size_t bufsize = 1024 * 32; char *buf = (char *) malloc(bufsize); gettimeofday(&stime, NULL); for (int i = 0; i < TIMES; i++) { #ifndef QUIET printf("------------\n"); #endif parser.setBoundary(BOUNDARY); FILE *f = fopen(INPUT_FILE, "rb"); while (!parser.stopped() && !feof(f)) { size_t len = fread(buf, 1, bufsize, f); size_t fed = 0; do { size_t ret = parser.feed(buf + fed, len - fed); fed += ret; } while (fed < len && !parser.stopped()); } #ifndef QUIET printf("%s\n", parser.getErrorMessage()); #endif fclose(f); } gettimeofday(&etime, NULL); #endif unsigned long long a = (unsigned long long) stime.tv_sec * 1000000 + stime.tv_usec; unsigned long long b = (unsigned long long) etime.tv_sec * 1000000 + etime.tv_usec; printf("(C++) Total: %.2fs Per run: %.2fs Throughput: %.2f MB/sec\n", (b - a) / 1000000.0, (b - a) / TIMES / 1000000.0, ((unsigned long long) sbuf.st_size * TIMES) / ((b - a) / 1000000.0) / 1024.0 / 1024.0); return 0; }