Author: ericdc Date: Wed Dec 17 19:28:17 2008 New Revision: 10865 Log: Major update. Many bug fixes. Modified: freeswitch/trunk/src/mod/applications/mod_http/http_req.c freeswitch/trunk/src/mod/applications/mod_http/mod_http.c Modified: freeswitch/trunk/src/mod/applications/mod_http/http_req.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_http/http_req.c (original) +++ freeswitch/trunk/src/mod/applications/mod_http/http_req.c Wed Dec 17 19:28:17 2008 @@ -308,6 +308,29 @@ sm.buf = buf; sm.buf_len = buf_len; + fprintf( + stderr, + "ERRORS\n" + "VERSION = %d\n" + "STATUS_CODE = %d\n" + "PHRASE = %d\n" + "HEADER = %d\n" + "NEWLINE = %d\n" + "SYNTAX_ERROR = %d\n", + VERSION, + STATUS_CODE, + PHRASE, + HEADER, + NEWLINE, + SYNTAX_ERROR + ); + + fprintf( + stderr, + "buf = \"%s\"\n", + buf + ); + pos = sm.pos; token = get_next_token(&sm); if(token != VERSION){ @@ -379,7 +402,13 @@ if(token != HEADER && token != PHRASE && token != STATUS_CODE) break; }while(token != SYNTAX_ERROR); - + + fprintf( + stderr, + "HEADERS = %d\n", + nt + ); + if(nt != 0){ response->headers = (http_header_t *)malloc(sizeof(http_header_t)*nt); if(response->headers == NULL){ @@ -441,7 +470,6 @@ return ERROR; } - response->body = (char *)malloc((buf_len - sm.pos + 1) * sizeof(char)); if(response->body == NULL){ perror("Could not allocate memory for body"); Modified: freeswitch/trunk/src/mod/applications/mod_http/mod_http.c ============================================================================== --- freeswitch/trunk/src/mod/applications/mod_http/mod_http.c (original) +++ freeswitch/trunk/src/mod/applications/mod_http/mod_http.c Wed Dec 17 19:28:17 2008 @@ -96,6 +96,7 @@ char *buf; char *method; char *url; + char *headers_dec; char *headers_str; char *value; char *body; @@ -132,11 +133,19 @@ if(argc != HTTP_PARAMS && argc != (HTTP_PARAMS - 1)){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n1\n"); return SWITCH_STATUS_SUCCESS; } method = argv[0]; + if(strcasecmp( "GET", method) == 0) request.method = GET; + else if(strcasecmp("POST", method) == 0) request.method = POST; + else if(strcasecmp("HEAD", method) == 0) request.method = HEAD; + else if(strcasecmp("DELETE", method) == 0) request.method = DELETE; + else if(strcasecmp("PUT", method) == 0) request.method = PUT; + + + url = argv[1]; headers_str = argv[2]; if(argc == HTTP_PARAMS){ @@ -145,7 +154,7 @@ body = (char *)malloc(1 * sizeof(char)); if(body == NULL){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n2\n"); return SWITCH_STATUS_SUCCESS; } body[0] = '\0'; @@ -155,7 +164,7 @@ buf = (char *)malloc(HTTP_BUFFER_SIZE * sizeof(char)); if(buf == NULL){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n3\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; } @@ -167,50 +176,63 @@ request.url = (char *)malloc((l + 1) * sizeof(char)); if(request.url == NULL){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n4\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; } GARBAGE_ADD(request.url); strcpy(request.url, url); - json_http_headers = json_tokener_parse(headers_str); + + + l = strlen(headers_str); + + headers_dec = url_decode(headers_str, l); + GARBAGE_ADD(headers_dec); + + json_http_headers = json_tokener_parse(headers_dec); if(is_error(json_http_headers)){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n5\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; } + i = 0; json_object_object_foreach(json_http_headers, key, val){ i++; } request.header_len = i; - headers = (http_header_t *)malloc(i * sizeof(http_header_t)); + headers = (http_header_t *)malloc(i * sizeof(http_header_t)); + request.headers = headers; GARBAGE_ADD(headers); i = 0; json_object_object_foreach(json_http_headers, key, val){ l = strlen(key); + request.headers[i].field_name = (char *)malloc((l + 1) * sizeof(char)); if(request.headers[i].field_name == NULL){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n6\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; } + GARBAGE_ADD(request.headers[i].field_name); + strcpy(request.headers[i].field_name, key); a += strlen(key); - value = json_object_to_json_string(val); + value = json_object_get_string(val); + /* value = json_object_to_json_string(val); */ l = strlen(value); request.headers[i].value = (char *)malloc((l + 1) * sizeof(char)); if(request.headers[i].value == NULL){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n7\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; } @@ -230,6 +252,7 @@ }else request.body_len = 0; ret = http_req(&request, &response); + if(response.version != NULL) GARBAGE_ADD(response.version); if(response.phrase != NULL) GARBAGE_ADD(response.phrase); if(response.headers != NULL) GARBAGE_ADD(response.headers); @@ -242,7 +265,7 @@ if(ret == ERROR){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n8\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; } @@ -262,7 +285,7 @@ json_response = (char *)malloc(l * sizeof(char)); if(json_response == NULL){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n9\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; } @@ -272,7 +295,7 @@ t = (char *)malloc((response.body_len + 1) * sizeof(char)); if(t == NULL){ switch_safe_free(ccmd); - stream->write_function(stream, "-ERR\n"); + stream->write_function(stream, "-ERR\n10\n"); GARBAGE_CLEANUP(); return SWITCH_STATUS_SUCCESS; }