<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<br>
<div class="moz-forward-container"> <font face="Helvetica, Arial,
sans-serif">Hi team,</font>
<p><font face="Helvetica, Arial, sans-serif"> i have
Faced issue on Data transfer on buffers. just like proxy .
in Both end create and establish the Connection. while Data
transferring website has Loading infinity. but i Got
content partially. can any one help this!</font></p>
<p><font face="Helvetica, Arial, sans-serif">i copied code here
can any one help , or suggestion from the Data transfer both
end.</font></p>
<p><font face="Helvetica, Arial, sans-serif">---------------------------------------------------------------------------------------------------------------------------------</font></p>
<p><font face="Helvetica, Arial, sans-serif">int<br>
handle_epollin(tproxy_conn_t *conn) {<br>
<br>
int numbytes,i;<br>
int fd_in, fd_out, ret;<br>
char *data_buf;<br>
void *buff = malloc(80 * MEBYTE);<br>
void *sndbuff = malloc(2 * MEBYTE);<br>
const char *method, *path;<br>
int pret, minor_version;<br>
struct phr_header headers[100];<br>
size_t buflen = 0, prevbuflen = 0,method_len,
path_len, num_headers;<br>
<br>
unsigned int server_session = 0;<br>
<br>
//Easy way to determin which socket is ready for
reading<br>
//TODO: Optimize. This one allows me quick lookup for
conn, but<br>
//I need to make a system call to determin which
socket<br>
//FILE *stream;<br>
size_t bufferd_size = gnutls_record_check_pending(conn
-> serv_session);<br>
if(bufferd_size)<br>
log_trace("data contains on server Record
%lu", bufferd_size);<br>
else<br>
log_trace("data contains on server Record
%lu", bufferd_size);<br>
<br>
bufferd_size = gnutls_record_check_pending(conn ->
cli_session);<br>
if(bufferd_size)<br>
log_trace("data contains on client Record
%lu", bufferd_size);<br>
else<br>
log_trace("data contains on client Record
%lu", bufferd_size);<br>
<br>
if(ioctl(conn->local_fd, FIONREAD, &numbytes)
!= -1<br>
&& numbytes > 0){<br>
<br>
server_session = 1;<br>
log_trace("IN:[Server Socket is READY for
Reading]");<br>
fd_in = conn->local_fd;<br>
fd_out = conn->remote_fd;<br>
<br>
} else {<br>
server_session = 0;<br>
log_trace("IN:[client Socket is READY for
Reading(origin server)]");<br>
fd_in = conn->remote_fd;<br>
fd_out = conn->local_fd;<br>
}<br>
<br>
//Optimize with SPLICE_F_MORE later<br>
/*numbytes = splice(fd_in, NULL,
conn->splice_pipe[1], NULL, <br>
SPLICE_LEN, SPLICE_F_MOVE);*/<br>
<br>
log_trace("Hostname : %s", conn -> hostname);<br>
<br>
int direction = gnutls_record_get_direction(conn ->
serv_session);<br>
if(direction)<br>
log_trace("[gnutls serv write Data Direction
]");<br>
else<br>
log_trace("[gnutls serv read Data Direction is
");<br>
<br>
direction = gnutls_record_get_direction(conn ->
cli_session);<br>
if(direction)<br>
log_trace("[origin Client write Data Direction
]");<br>
else<br>
log_trace("[origin Client write Data Direction ]");<br>
<br>
if(server_session) {<br>
<br>
log_trace("check : Entering Server Session");<br>
memset(buff,'\0', MAX_BUF);<br>
<br>
LOOP_CHECK(ret, gnutls_record_recv(conn ->
serv_session, buff , MAX_BUF));<br>
if (ret == 0) {<br>
log_error("\n- Peer has closed the
GnuTLS connection");<br>
<br>
} else if (ret < 0 &&
gnutls_error_is_fatal(ret) == 0) {<br>
<br>
log_error( "*** Warning:
%s\n",gnutls_strerror(ret));<br>
} else if (ret < 0) {<br>
log_error("\n*** Received corrupted "<br>
"data(%d). Closing the
connection.\n", ret);<br>
return -1;<br>
} else if (ret > 0) {<br>
<br>
if(read_done == false) {<br>
read_done = true;<br>
numbytes = ret;<br>
prevbuflen = buflen;<br>
buflen += ret;<br>
num_headers = sizeof(headers) /
sizeof(headers[0]);<br>
pret = phr_parse_request(buff, buflen,
&method, &method_len, &path, &path_len,<br>
&minor_version,
headers, &num_headers, prevbuflen);<br>
<br>
if (pret > 0)<br>
log_trace("parsering
success"); /* successfully parsed the request */<br>
else if (pret == -1) {<br>
log_error("PArse the Request
incompleted!");<br>
//TODO: expermental Need to
receive again by check checking tls records<br>
return 0; /* request is
incomplete, continue the loop */<br>
}<br>
<br>
if(pret == -2);<br>
if (buflen == sizeof(buff)){<br>
log_error(" Error: To long the
Buffer Failed to Parse the Request");<br>
return 0;<br>
}<br>
<br>
<br>
log_debug("request is %d bytes long",
pret);<br>
log_debug("**method is %.*s",
(int)method_len, method);<br>
log_debug("**path is %.*s",
(int)path_len, path);<br>
log_debug("**HTTP version is 1.%d",
minor_version);<br>
log_debug("**headers:");<br>
for (i = 0; i != num_headers; ++i) {<br>
log_debug("**%.*s: %.*s",
(int)headers[i].name_len, headers[i].name,<br>
(int)headers[i].value_len, headers[i].value);<br>
}<br>
<br>
//"GET /
HTTP/1.1\r\nHost:www.google.org\r\n\r\n"<br>
memset(sndbuff,'\0', MAX_BUF);<br>
//sprintf(sndbuff,"%s %s
HTTP/1.%d\r\nHost:%s\r\n\n",method,path,minor_version,conn
-> hostname);<br>
sprintf(sndbuff,"%s %s
HTTP/1.%d\r\nHost:%s\r\n\n","GET","/",1,conn -> hostname);<br>
<br>
log_debug(" ---- Sndbuff
contains:%s-----",(char *)sndbuff);<br>
/*if(numbytes > 0){<br>
numbytes =
splice(conn->splice_pipe[0], NULL, fd_out, NULL,<br>
numbytes, SPLICE_F_MOVE);*/<br>
//numbytes = splice_all(conn ->
pipes[0], bp, SPLICE_LEN);<br>
log_debug("IN: Handle EPOLL IN inside
client session");<br>
<br>
LOOP_CHECK(ret,
gnutls_record_send(conn -> cli_session, sndbuff,
strlen(buff)));<br>
memset(buff,'\0', MAX_BUF);<br>
}<br>
else {<br>
LOOP_CHECK(ret,
gnutls_record_send(conn -> cli_session, buff,
strlen(buff)));<br>
memset(buff,'\0', MAX_BUF);<br>
}<br>
}<br>
<br>
} else {<br>
memset(buff,'\0', MAX_BUF);<br>
LOOP_CHECK(ret,
gnutls_record_recv(conn -> cli_session, buff , MAX_BUF));<br>
<br>
if (ret == 0) {<br>
log_debug("\n- Peer has closed
the GnuTLS connection");<br>
} else if (ret < 0<br>
&&
gnutls_error_is_fatal(ret) == 0) {<br>
log_error("*** Warning: %s",<br>
gnutls_strerror(ret));<br>
} else if (ret < 0) {<br>
log_error("\n*** Received
corrupted "<br>
"data(%d).
Closing the connection.\n", ret);<br>
return -1;<br>
} else if (ret > 0) {<br>
numbytes = ret;<br>
/*if(numbytes > 0){<br>
numbytes =
splice(conn->splice_pipe[0], NULL, fd_out, NULL,<br>
numbytes, SPLICE_F_MOVE);*/<br>
<br>
LOOP_CHECK(ret,
gnutls_record_send(conn -> serv_session, buff,
strlen(buff)));<br>
//ret = gnutls_record_send(conn ->
serv_session, buff, strlen(buff));<br>
memset(buff,'\0', MAX_BUF);<br>
<br>
if (ret == 0) {<br>
log_debug("\n- Peer has closed
the GnuTLS connection");<br>
} else if (ret < 0<br>
&&
gnutls_error_is_fatal(ret) == 0) {<br>
log_error("*** Warning: %s\n",<br>
gnutls_strerror(ret));<br>
} else if (ret < 0) {<br>
log_error("*** Received
corrupted "<br>
"data(%d).
Closing the connection.\n", ret);<br>
return -1;<br>
}<br>
}<br>
}<br>
return numbytes;<br>
free(buff);<br>
}<br>
<br>
</font></p>
<pre class="moz-signature" cols="72">--
Thanks,
udhayakumar</pre>
</div>
</body>
</html>