blob: 3575281ecd8bb58f906a10fd1adc2002bdd8f2e8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <axutil_utils.h>
#include <axutil_uuid_gen.h>
#include <axutil_error_default.h>
#include <axutil_log_default.h>
#include <axutil_thread_pool.h>
#include <tcpmon_session.h>
#include <tcpmon_entry.h>
#include <tcpmon_util.h>
#include <signal.h>
#include <stdio.h>
#include <axutil_stream.h>
#include <axutil_network_handler.h>
#include <axis2_http_transport.h>
#include <axutil_version.h>
#include <tcpmon_util.h>
#define SIZE 1024
axis2_char_t *tcpmon_traffic_log = "tcpmon_traffic.log";
axutil_env_t *system_env = NULL;
tcpmon_session_t *session = NULL;
char *target_host = NULL;
int on_new_entry(
const axutil_env_t * env,
tcpmon_entry_t * entry,
int status);
int on_new_entry_to_file(
const axutil_env_t * env,
tcpmon_entry_t * entry,
int status);
int on_error_func(
const axutil_env_t * env,
char *error_message);
void sig_handler(
int signal);
int resend_request(
const axutil_env_t * env,
int status);
int
main(
int argc,
char **argv)
{
axutil_env_t *env = NULL;
int c;
int listen_port = 9099,
target_port = 9090; /* the default port simple axis2 server is run on 9090 */
int test_bit = 0;
int format_bit = 0; /* pretty print the request/response SOAP messages */
int ii = 1;
if (!axutil_strcmp(argv[1], "-h"))
{
printf
("Usage : %s [-lp LISTEN_PORT] [-tp TARGET_PORT] [-th TARGET_HOST] [-f LOG_FILE] [options]\n",
argv[0]);
fprintf(stdout, " Options :\n");
fprintf(stdout,
"\t-lp LISTEN_PORT \tport number to listen on, default is 9099\n");
fprintf(stdout,
"\t-tp TARGET_PORT \tport number to connect and re-direct messages, default is 9090\n");
fprintf(stdout,
"\t-th TARGET_HOST \ttarget host to connect, default is localhost\n");
fprintf(stdout,
"\t-f LOG_FILE \tfile to write the messages to, default is %s\n",
tcpmon_traffic_log);
fprintf(stdout,
"\t--format \tenable xml formatting\n");
fprintf(stdout,
"\t--test \tenable testing last request/response by logging it separately\n");
fprintf(stdout, " Help :\n\t-h \tdisplay this help screen.\n\n");
return 0;
}
env = axutil_env_create_all("axis2_tcpmon.log", AXIS2_LOG_LEVEL_DEBUG);
signal(SIGINT, sig_handler);
system_env = env;
#ifndef WIN32
signal(SIGPIPE, sig_handler);
#endif
target_host = axutil_strdup(env, "localhost");
while (ii < argc)
{
if (!strcmp("-lp", argv[ii]))
{
ii++;
if (argv[ii])
{
listen_port = atoi(argv[ii++]);
if (listen_port == 0)
{
printf("INVALID value for listen port\n");
printf("Use -h for help\n");
AXIS2_FREE(env->allocator, target_host);
if (env)
{
axutil_env_free((axutil_env_t *) env);
env = NULL;
}
return 0;
}
}
}
else if (!strcmp("-tp", argv[ii]))
{
ii++;
if (argv[ii])
{
target_port = atoi(argv[ii++]);
if (target_port == 0)
{
printf("INVALID value for target port\n");
printf("Use -h for help\n");
AXIS2_FREE(env->allocator, target_host);
if (env)
{
axutil_env_free((axutil_env_t *) env);
env = NULL;
}
return 0;
}
}
}
else if (!strcmp("-th", argv[ii]))
{
ii++;
if (argv[ii])
{
AXIS2_FREE(env->allocator, target_host);
target_host = (char *) axutil_strdup(env, argv[ii++]);
}
}
else if (!strcmp("--test", argv[ii]))
{
ii++;
test_bit = 1;
}
else if (!strcmp("--format", argv[ii]))
{
ii++;
format_bit = 1;
}
else if (!strcmp("-f", argv[ii]))
{
ii++;
if (argv[ii])
{
tcpmon_traffic_log = argv[ii++];
}
}
else
{
printf("INVALID value for tcpmon \n");
printf("Use -h for help\n");
AXIS2_FREE(env->allocator, target_host);
if (env)
{
axutil_env_free((axutil_env_t *) env);
env = NULL;
}
return 0;
}
}
if (!(listen_port && target_port && target_host))
{
printf("ERROR: essential argument missing \n");
printf
("Please recheck values of listen_port (-lp), target_port(-tp) and target_host (-th)\n");
AXIS2_FREE(env->allocator, target_host);
if (env)
{
axutil_env_free((axutil_env_t *) env);
env = NULL;
}
return 0;
}
printf("Listen port : %d Target port : %d Target host: %s\n",
listen_port, target_port, target_host);
session = tcpmon_session_create(env);
TCPMON_SESSION_SET_LISTEN_PORT(session, env, listen_port);
TCPMON_SESSION_SET_TARGET_PORT(session, env, target_port);
TCPMON_SESSION_SET_TARGET_HOST(session, env, target_host);
TCPMON_SESSION_ON_TRANS_FAULT(session, env, on_error_func);
TCPMON_SESSION_ON_NEW_ENTRY(session, env, on_new_entry_to_file);
TCPMON_SESSION_SET_TEST_BIT(session, env, test_bit);
TCPMON_SESSION_SET_FORMAT_BIT(session, env, format_bit);
TCPMON_SESSION_START(session, env);
do
{
c = getchar();
if (c == 'f')
{
format_bit = format_bit ? 0 : 1;
TCPMON_SESSION_SET_FORMAT_BIT(session, env, format_bit);
}
else if (c == 'r')
{
resend_request(env, 0);
}
}
while (c != 'q');
printf("\n\n");
TCPMON_SESSION_STOP(session, env);
TCPMON_SESSION_FREE(session, env);
AXIS2_FREE(env->allocator, target_host);
if (env)
{
axutil_env_free((axutil_env_t *) env);
env = NULL;
}
return 0;
}
int
on_new_entry_to_file(
const axutil_env_t * env,
tcpmon_entry_t * entry,
int status)
{
char *plain_buffer = NULL;
char *formated_buffer = NULL;
int format = 0;
FILE *file;
char *convert = NULL;
char *uuid = NULL;
int resend = 0;
file = fopen(tcpmon_traffic_log, "ab");
if (NULL == file)
{
printf("\ncould not create or open log-file\n");
return -1;
}
fprintf(file,
"\n= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\n");
format = TCPMON_ENTRY_GET_FORMAT_BIT(entry, env);
if (status == 0)
{
if (strstr(TCPMON_ENTRY_SENT_HEADERS(entry, env), AXIS2_HTTP_HEADER_USER_AGENT
": " AXIS2_HTTP_HEADER_SERVER_AXIS2C "TCPMon\r\n"))
{
resend = 1;
}
plain_buffer = TCPMON_ENTRY_SENT_DATA(entry, env);
if (plain_buffer) /* this can be possible as no xml present */
{
if (TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) !=
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env)) +
(int)strlen(plain_buffer) + 4)
{
format = 0; /* mtom scenario */
}
formated_buffer = tcpmon_util_format_as_xml
(env, plain_buffer, format);
}
else
{
formated_buffer = "";
}
/* 2 screen */
printf("\n\n%s\n", resend ? "RESENDING DATA..": "SENDING DATA..");
printf("/* sending time = %s*/\n", TCPMON_ENTRY_SENT_TIME(entry, env));
uuid = axutil_uuid_gen(env);
printf("/* message uuid = %s*/\n", uuid);
printf("---------------------\n");
if (format || TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env)) +
(int)strlen(formated_buffer) + 4)
{
printf("%s\n\n%s\n\n", TCPMON_ENTRY_SENT_HEADERS(entry, env),
formated_buffer);
}
else
{
int count = 0;
int printed = 0;
axis2_char_t *formated_buffer_temp = formated_buffer;
printf("%s\n\n", TCPMON_ENTRY_SENT_HEADERS(entry, env));
count = TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) - 4 -
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env));
while (count > printed)
{
int plen = 0;
plen = ((int)strlen(formated_buffer) + 1);
if (plen != 1)
{
printf("%s", formated_buffer);
}
printed += plen;
if (count > printed)
{
printf("%c", '\0');
formated_buffer += plen;
}
}
formated_buffer = formated_buffer_temp;
}
/* 2 file */
fprintf(file, "%s\n", resend ? "RESENDING DATA..": "SENDING DATA..");
fprintf(file, "/* sending time = %s*/\n",
TCPMON_ENTRY_SENT_TIME(entry, env));
fprintf(file, "/* message uuid = %s*/\n", uuid);
AXIS2_FREE(env->allocator, uuid);
fprintf(file, "---------------------\n");
convert = axutil_strdup(env, TCPMON_ENTRY_SENT_HEADERS(entry, env));
convert = tcpmon_util_str_replace(env, convert, "; ", ";\n\t");
fprintf(file, "%s\r\n\r\n", convert);
if (convert)
{
AXIS2_FREE(env->allocator, convert);
convert = NULL;
}
if (strcmp(formated_buffer, "") != 0)
{
if (format || TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env)) +
(int)strlen(formated_buffer) + 4)
{
convert = axutil_strdup(env, formated_buffer);
convert = tcpmon_util_str_replace(env, convert, "><", ">\n<");
fprintf(file, "%s", convert);
if (convert)
{
AXIS2_FREE(env->allocator, convert);
convert = NULL;
}
}
else
{
int count = 0;
int printed = 0;
count = TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) - 4 -
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env));
while (count > printed)
{
int plen = 0;
plen = ((int)strlen(formated_buffer) + 1);
if (plen != 1)
{
fprintf(file, "%s", formated_buffer);
}
printed += plen;
if (count > printed)
{
fprintf(file, "%c", '\0');
formated_buffer += plen;
}
}
}
}
}
if (status == 1)
{
plain_buffer = TCPMON_ENTRY_ARRIVED_DATA(entry, env);
if (plain_buffer) /* this can be possible as no xml present */
{
if (TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) !=
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env)) +
(int)strlen(plain_buffer) + 4)
{
format = 0; /* mtom scenario */
}
formated_buffer = tcpmon_util_format_as_xml
(env, plain_buffer, format);
}
else
{
formated_buffer = "";
}
/* 2 screen */
printf("\n\n%s\n", "RETRIEVING DATA..");
printf("/* retrieving time = %s*/\n",
TCPMON_ENTRY_ARRIVED_TIME(entry, env));
printf("/* time throughput = %s*/\n",
TCPMON_ENTRY_TIME_DIFF(entry, env));
printf("---------------------\n");
if (format || TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env)) +
(int)strlen(formated_buffer) + 4)
{
printf("%s\n\n%s\n\n", TCPMON_ENTRY_ARRIVED_HEADERS(entry, env),
formated_buffer);
}
else
{
int count = 0;
int printed = 0;
axis2_char_t *formated_buffer_temp = formated_buffer;
printf("%s\n\n", TCPMON_ENTRY_ARRIVED_HEADERS(entry, env));
count = TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) - 4 -
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env));
while (count > printed)
{
int plen = 0;
plen = ((int)strlen(formated_buffer) + 1);
if (plen != 1)
{
printf("%s", formated_buffer);
}
printed += plen;
if (count > printed)
{
printf("%c", '\0');
formated_buffer += plen;
}
}
formated_buffer = formated_buffer_temp;
}
/* 2 file */
fprintf(file, "%s\n", "RETRIEVING DATA..");
fprintf(file, "/* retrieving time = %s*/\n",
TCPMON_ENTRY_ARRIVED_TIME(entry, env));
fprintf(file, "/* time throughput = %s*/\n",
TCPMON_ENTRY_TIME_DIFF(entry, env));
fprintf(file, "---------------------\n");
convert = axutil_strdup(env, TCPMON_ENTRY_ARRIVED_HEADERS(entry, env));
convert = tcpmon_util_str_replace(env, convert, "; ", ";\n\t");
fprintf(file, "%s\r\n\r\n", convert);
if (convert)
{
AXIS2_FREE(env->allocator, convert);
convert = NULL;
}
if (strcmp(formated_buffer, "") != 0)
{
if (format || TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env)) +
(int)strlen(formated_buffer) + 4)
{
convert = axutil_strdup(env, formated_buffer);
convert = tcpmon_util_str_replace(env, convert, "><", ">\n<");
fprintf(file, "%s", convert);
if (convert)
{
AXIS2_FREE(env->allocator, convert);
convert = NULL;
}
}
else
{
int count = 0;
int printed = 0;
count = TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) - 4 -
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env));
while (count > printed)
{
int plen = 0;
plen = ((int)strlen(formated_buffer) + 1);
if (plen != 1)
{
fprintf(file, "%s", formated_buffer);
}
printed += plen;
if (count > printed)
{
fprintf(file, "%c", '\0');
formated_buffer += plen;
}
}
}
}
}
fclose(file);
return 0;
}
int
resend_request(
const axutil_env_t * env,
int status)
{
FILE *file;
axis2_char_t *uuid = NULL;
axis2_char_t *buffer = NULL;
size_t read_len = 0;
if (status == 0)
{
int c;
int i = 0;
do
{
c = getchar();
}
while (c == ' ');
uuid = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * 37);
for (i = 0; i < 36; i++)
{
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || c == '-')
{
uuid[i] = (axis2_char_t)c;
}
else if (c >= 'A' && c <= 'F')
{
uuid[i] = (axis2_char_t)(c + 32);
}
else
{
return 0;
}
c = getchar();
}
uuid[i] = '\0';
}
file = fopen(tcpmon_traffic_log, "rb");
if (!file)
{
printf("\ncould not create or open log-file\n");
return -1;
}
buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * SIZE);
if (!buffer)
{
printf("\ngimme more memory\n");
return -1;
}
buffer[SIZE - 1] = '\0';
read_len = (int)fread(buffer, sizeof(char), SIZE - 1, file);
while(read_len)
{
axis2_char_t *search = "/* message uuid = ";
axis2_char_t *tmp1 = NULL;
axis2_char_t *tmp2 = NULL;
axis2_char_t *tmp3 = NULL;
axis2_char_t *uuid_match = NULL;
size_t offset = 0;
int loop_state = 1;
int end_reached = 0;
size_t rounds = 0;
offset = strlen(search);
tmp3 = buffer;
if (read_len >= SIZE)
{
AXIS2_FREE(env->allocator, buffer);
AXIS2_FREE(env->allocator, uuid);
printf("\nbuffer overflow\n");
return -1;
}
if (read_len < SIZE - 1)
{
end_reached = 1;
}
while (loop_state)
{
size_t temp_len = 0;
tmp1 = strstr(tmp3, search);
temp_len = strlen(tmp3) + 1;
/* loop below is for mtom cases */
while (!tmp1 && (read_len - rounds > temp_len))
{
tmp3 += strlen(tmp3) + 1;
tmp1 = strstr(tmp3, search);
temp_len += strlen(tmp3) + 1;
}
if (!tmp1)
{
if (end_reached)
{
break;
}
memmove(buffer, buffer + (SIZE - 1 - offset), offset);
read_len = fread(buffer + offset, sizeof(char),
SIZE - 1 - offset, file) + offset;
break;
}
else
{
rounds = tmp1 - tmp3 + offset + 36;
tmp3 = tmp1 + offset + 36;
}
if (read_len - offset - 36 < (size_t)(tmp1 - buffer))
{
if (end_reached)
{
break;
}
offset += 36;
memmove(buffer, buffer + (SIZE - 1 - offset), offset);
read_len = fread(buffer + offset, sizeof(char),
SIZE - 1 - offset, file) + offset;
break;
}
tmp2 = tmp1 + offset;
uuid_match = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * 37);
if (!uuid_match)
{
printf("\ngimme more memory\n");
return -1;
}
memcpy(uuid_match, tmp2, 36);
uuid_match[36] = '\0';
if (!axutil_strcasecmp(uuid_match, uuid))
{
axis2_char_t *header_str = "*/\n---------------------\n";
axis2_char_t *footer_str =
"\n= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =";
size_t seek_len = 0;
int has_raw_binary = 0;
axis2_char_t *request_buffer = NULL;
AXIS2_FREE(env->allocator, uuid_match);
AXIS2_FREE(env->allocator, uuid);
end_reached = 1;
tmp2 += 36;
offset = strlen(header_str);
if (read_len - offset < (size_t)(tmp2 - buffer))
{
seek_len = tmp2 - buffer + offset - read_len;
if (seek_len > 0)
{
read_len = fread(buffer, sizeof(char), seek_len, file);
}
seek_len = 0;
}
else
{
seek_len = read_len - (size_t)(tmp2 - buffer) - offset;
}
request_buffer = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * (48 * 1024 + 1));
if (!request_buffer)
{
printf("\ngimme more memory\n");
return -1;
}
if (seek_len > 0)
{
memcpy(request_buffer, buffer + (read_len - seek_len), seek_len);
}
read_len = (int)fread(request_buffer + seek_len,
sizeof(char), 48 * 1024 - seek_len, file) + seek_len;
tmp1 = NULL;
tmp3 = request_buffer;
tmp1 = strstr(tmp3, footer_str);
temp_len = (int)strlen(tmp3) + 1;
/* loop below is for mtom cases */
while (!tmp1 && (read_len > temp_len))
{
if (!has_raw_binary)
{
has_raw_binary = 1;
}
tmp3 += (int)strlen(tmp3) + 1;
tmp1 = strstr(tmp3, footer_str);
temp_len += (int)strlen(tmp3) + 1;
}
if (tmp1)
{
axis2_char_t *req_header = NULL;
axis2_char_t *req_payload = NULL;
int req_content_len = 0;
req_content_len = (int)(tmp1 - request_buffer) - 4;
*tmp1 = '\0';
tmp1 = NULL;
tmp1 = strstr(request_buffer, "\r\n\r\n");
if (tmp1)
{
axis2_char_t *listen_host = "localhost";
int write_socket = -1;
axutil_stream_t *write_stream = NULL;
tmp1 += 2;
*tmp1 = '\0';
req_payload = tmp1 + 2;
tmp1 = axutil_strdup(env, request_buffer);
req_content_len -= (int)strlen(tmp1);
tmp1 = tcpmon_util_str_replace(env, tmp1, ";\n\t", "; ");
req_header = tmp1;
tmp2 = strstr(req_header, AXIS2_HTTP_HEADER_USER_AGENT ":");
if (tmp2)
{
tmp3 = strstr(tmp2, "\r\n");
if (tmp3)
{
int header_len = 0;
axis2_char_t *user_agent = AXIS2_HTTP_HEADER_USER_AGENT
": " AXIS2_HTTP_HEADER_SERVER_AXIS2C " TCPMon";
header_len = (int)(tmp3 - tmp2) + 2;
tmp1 = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * header_len + 1);
memcpy(tmp1, tmp2, header_len);
tmp1[header_len] = '\0';
header_len = 2 + (int)strlen(user_agent);
tmp2 = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * (header_len + 1));
sprintf(tmp2, "%s\r\n", user_agent);
req_header = tcpmon_util_str_replace(env, req_header, tmp1, tmp2);
AXIS2_FREE(env->allocator, tmp1);
AXIS2_FREE(env->allocator, tmp2);
tmp1 = NULL;
tmp2 = NULL;
}
}
if (!has_raw_binary)
{
tmp2 = strstr(req_header, AXIS2_HTTP_HEADER_CONTENT_LENGTH ":");
if (tmp2)
{
tmp3 = strstr(tmp2, "\r\n");
if (tmp3)
{
int header_len = 0;
header_len = (int)(tmp3 - tmp2) + 2;
tmp1 = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * header_len + 1);
memcpy(tmp1, tmp2, header_len);
tmp1[header_len] = '\0';
tmp2 = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * (header_len + 2));
req_content_len = (int)strlen(req_payload);
sprintf(tmp2, "%s%d\r\n", AXIS2_HTTP_HEADER_CONTENT_LENGTH
": ", req_content_len);
req_header = tcpmon_util_str_replace(env, req_header, tmp1, tmp2);
AXIS2_FREE(env->allocator, tmp1);
AXIS2_FREE(env->allocator, tmp2);
tmp1 = NULL;
tmp2 = NULL;
}
}
}
tmp2 = strstr(req_header, AXIS2_HTTP_HEADER_HOST ":");
if (tmp2)
{
tmp3 = strstr(tmp2, "\r\n");
if (tmp3)
{
int header_len = 0;
header_len = (int)(tmp3 - tmp2) + 2;
tmp1 = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * header_len + 1);
memcpy(tmp1, tmp2, header_len);
tmp1[header_len] = '\0';
header_len = 16 + (int)strlen(target_host);
tmp2 = AXIS2_MALLOC(env->allocator,
sizeof(axis2_char_t) * (header_len + 1));
sprintf(tmp2, "%s%s:%d\r\n", AXIS2_HTTP_HEADER_HOST ": ", target_host,
TCPMON_SESSION_GET_LISTEN_PORT(session, env));
req_header = tcpmon_util_str_replace(env, req_header, tmp1, tmp2);
AXIS2_FREE(env->allocator, tmp1);
AXIS2_FREE(env->allocator, tmp2);
tmp1 = NULL;
tmp2 = NULL;
}
}
write_socket =
(int)axutil_network_handler_open_socket(env, listen_host,
TCPMON_SESSION_GET_LISTEN_PORT(session, env));
if (write_socket == -1)
{
printf("\nerror in creating socket\n");
}
else
{
write_stream = axutil_stream_create_socket(env, write_socket);
}
if (!write_stream)
{
printf("\nerror in creating stream\n");
}
else
{
axutil_stream_write(write_stream, env, req_header, strlen(req_header));
axutil_stream_write(write_stream, env, "\r\n", 2);
axutil_stream_write(write_stream, env, req_payload, req_content_len);
axutil_stream_free(write_stream, env);
axutil_network_handler_close_socket(env, write_socket);
}
AXIS2_FREE(env->allocator, req_header);
}
}
else if (read_len == 48 * 1024)
{
printf("\nrequest size greater than buffer\n");
}
AXIS2_FREE(env->allocator, request_buffer);
break;
}
AXIS2_FREE(env->allocator, uuid_match);
}
if (end_reached)
{
break;
}
}
AXIS2_FREE(env->allocator, buffer);
fclose(file);
return 0;
}
int
on_new_entry(
const axutil_env_t * env,
tcpmon_entry_t * entry,
int status)
{
char *plain_buffer = NULL;
char *formated_buffer = NULL;
int format = 0;
char *uuid = NULL;
int resend = 0;
format = TCPMON_ENTRY_GET_FORMAT_BIT(entry, env);
if (status == 0)
{
if (strstr(TCPMON_ENTRY_SENT_HEADERS(entry, env),
AXIS2_HTTP_HEADER_USER_AGENT ": "\
AXIS2_HTTP_HEADER_SERVER_AXIS2C " TCPMon\r\n"))
{
resend = 1;
}
plain_buffer = TCPMON_ENTRY_SENT_DATA(entry, env);
if (plain_buffer) /* this can be possible as no xml present */
{
if (TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env)) +
(int)strlen(plain_buffer) + 4)
{
format = 0; /* mtom scenario */
}
formated_buffer = tcpmon_util_format_as_xml
(env, plain_buffer, format);
}
else
{
formated_buffer = "";
}
printf("\n\n%s\n", resend ? "RESENDING DATA..": "SENDING DATA..");
printf("/* sending time = %s*/\n", TCPMON_ENTRY_SENT_TIME(entry, env));
uuid = axutil_uuid_gen(env);
printf("/* message uuid = %s*/\n", uuid);
AXIS2_FREE(env->allocator, uuid);
printf("---------------------\n");
if (format || TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env)) +
(int)strlen(formated_buffer) + 4)
{
printf("%s\n\n%s\n\n", TCPMON_ENTRY_SENT_HEADERS(entry, env),
formated_buffer);
}
else
{
int count = 0;
int printed = 0;
axis2_char_t *formated_buffer_temp = formated_buffer;
printf("%s\n", TCPMON_ENTRY_SENT_HEADERS(entry, env));
count = TCPMON_ENTRY_GET_SENT_DATA_LENGTH(entry, env) - 4 -
(int)strlen(TCPMON_ENTRY_SENT_HEADERS(entry, env));
while (count > printed)
{
int plen = 0;
plen = ((int)strlen(formated_buffer) + 1);
if (plen != 1)
{
printf("%s", formated_buffer);
}
printed += plen;
if (count > printed)
{
printf("%c", '\0');
formated_buffer += plen;
}
}
formated_buffer = formated_buffer_temp;
}
}
if (status == 1)
{
plain_buffer = TCPMON_ENTRY_ARRIVED_DATA(entry, env);
if (plain_buffer) /* this can be possible as no xml present */
{
if (TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env)) +
(int)strlen(plain_buffer) + 4)
{
format = 0; /* mtom scenario */
}
formated_buffer = tcpmon_util_format_as_xml
(env, plain_buffer, format);
}
else
{
formated_buffer = "";
}
printf("\n\n%s\n", "RETRIEVING DATA..");
printf("/* retrieving time = %s*/\n",
TCPMON_ENTRY_ARRIVED_TIME(entry, env));
printf("/* time throughput = %s*/\n",
TCPMON_ENTRY_TIME_DIFF(entry, env));
printf("---------------------\n");
if (format || TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) ==
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env)) +
(int)strlen(formated_buffer) + 4)
{
printf("%s\n\n%s\n\n", TCPMON_ENTRY_ARRIVED_HEADERS(entry, env),
formated_buffer);
}
else
{
int count = 0;
int printed = 0;
axis2_char_t *formated_buffer_temp = formated_buffer;
printf("%s\n", TCPMON_ENTRY_ARRIVED_HEADERS(entry, env));
count = TCPMON_ENTRY_GET_ARRIVED_DATA_LENGTH(entry, env) - 4 -
(int)strlen(TCPMON_ENTRY_ARRIVED_HEADERS(entry, env));
while (count > printed)
{
int plen = 0;
plen = ((int)strlen(formated_buffer) + 1);
if (plen != 1)
{
printf("%s", formated_buffer);
}
printed += plen;
if (count > printed)
{
printf("%c", '\0');
formated_buffer += plen;
}
}
formated_buffer = formated_buffer_temp;
}
}
return 0;
}
int
on_error_func(
const axutil_env_t * env,
char *error_message)
{
fprintf(stderr, "ERROR: %s\n", error_message);
return 0;
}
/**
* Signal handler
*/
void
sig_handler(
int signal)
{
if (!system_env)
{
fprintf(stderr,"Received signal %d, unable to proceed system_env is NULL,\
system exit with -1", signal);
_exit (-1);
}
switch (signal)
{
case SIGINT:
{
AXIS2_LOG_INFO(system_env->log, "Received signal SIGINT. Utility "
"shutting down");
printf("\n\n");
TCPMON_SESSION_STOP(session, system_env);
TCPMON_SESSION_FREE(session, system_env);
AXIS2_FREE(system_env->allocator, target_host);
if (system_env)
{
axutil_env_free(system_env);
}
exit(0);
}
#ifndef WIN32
case SIGPIPE:
{
AXIS2_LOG_INFO(system_env->log, "Received signal SIGPIPE. Operation "
"aborted");
return;
}
#endif
case SIGSEGV:
{
fprintf(stderr, "Received deadly signal SIGSEGV. Terminating\n");
_exit(-1);
}
}
}