#include #include #include #include #include #define UNUSED(a) ((void) (a)) static void die( char *test, char *fn, fhp_err_t err ) { char buf[1024]; if (fhp_strerror(err, buf, sizeof(buf)) == FHP_OK) { fprintf(stderr, "ERROR: %s(): %s(): %s\n", test, fn, buf); } else { fprintf(stderr, "ERROR: die(): fhp_strerror() failed\n"); } /* exit app */ exit(EXIT_FAILURE); } /**************/ /* basic test */ /**************/ static const char * basic_str = "GET / HTTP/1.1\r\n" "Host: pablotron.org\r\n" "Connection: close\r\n" "\r\n"; static bool basic_cb( fhp_t *fhp, fhp_token_t token, uint8_t * const buf, size_t len ) { fhp_err_t err; UNUSED(fhp); UNUSED(buf); // get token name char token_buf[64]; if ((err = fhp_strtoken(token, token_buf, sizeof(token_buf))) != FHP_OK) return false; // debug fprintf(stderr, "test_basic_cb(): token = %s, len = %lu\n", token_buf, len); // return success return true; } static void test_basic(void) { fhp_err_t err; fhp_t fhp; // init parser if ((err = fhp_init(&fhp, NULL, basic_cb, NULL)) != FHP_OK) { die("test_basic", "fhp_init", err); } // parse data size_t len = strlen(basic_str); if ((err = fhp_push(&fhp, (uint8_t*) basic_str, len)) != FHP_OK) { die("test_basic", "fhp_push", err); } } /****************/ /* percent test */ /****************/ typedef struct { uint8_t buf[1024]; size_t buf_len; } percent_data; static const char * percent_str = "GET /foo%20bar HTTP/1.1\r\n" "Host: pablotron.org\r\n" "Connection: close\r\n" "\r\n"; static bool percent_cb( fhp_t *fhp, fhp_token_t token, uint8_t * const buf, size_t len ) { percent_data *data = fhp_get_user_data(fhp); switch (token) { case FHP_TOKEN_URL_START: // clear buffer data->buf_len = 0; break; case FHP_TOKEN_URL_FRAGMENT: // buffer overflow, do not use in real code!!! memcpy(data->buf + data->buf_len, buf, len); data->buf_len += len; break; case FHP_TOKEN_URL_END: // terminate and print buffer data->buf[data->buf_len] = '\0'; fprintf(stderr, "decoded URL: \"%s\"\n", data->buf); break; default: // do nothing NULL; } // return success return true; } static void test_percent(void) { fhp_err_t err; fhp_t fhp; percent_data data; // init parser if ((err = fhp_init(&fhp, NULL, percent_cb, &data)) != FHP_OK) { die("test_percent", "fhp_init", err); } // parse data size_t len = strlen(percent_str); if ((err = fhp_push(&fhp, (uint8_t*) percent_str, len)) != FHP_OK) { die("test_percent", "fhp_push", err); } } int main(int argc, char *argv[]) { UNUSED(argc); UNUSED(argv); test_basic(); test_percent(); return EXIT_SUCCESS; }