Index: /branches/rel_apv_10_7/usr/click/lib/libepolicy/epolicy_engine.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libepolicy/epolicy_engine.c	(revision 39145)
+++ /branches/rel_apv_10_7/usr/click/lib/libepolicy/epolicy_engine.c	(working copy)
@@ -1837,6 +1837,7 @@
 	if(!frame_temp_tail_p)
 	{
 		ePolicy_log_vs(EPOLICY_LOG_ERROR, vs, "%s: message_frame_alloc_and_append failed", __FUNCTION__);
+		message_frame_chain_free(frame_temp_head_p);
 		return;
 	}
 	//½«message frame Ìí¼Óµ½msg->message_header_frames
Index: /branches/rel_apv_10_7/usr/click/lib/libepolicy/message_frame_utils.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libepolicy/message_frame_utils.c	(revision 39145)
+++ /branches/rel_apv_10_7/usr/click/lib/libepolicy/message_frame_utils.c	(working copy)
@@ -120,8 +120,8 @@
 			vs_p);
 		if(!message_frame_chain_tail)
 		{
-			ePolicy_log_vs(EPOLICY_LOG_ERROR, vs_p, "%s: too much data in current_mbuf: %d, %d", 
-				__FUNCTION__, message_frame_chain_tail->f_datalen,  current_mbuf->f_datalen );
+			ePolicy_log_vs(EPOLICY_LOG_ERROR, vs_p, "(%s:%d) too much data in current_mbuf",
+				       __FUNCTION__, __LINE__);
 			return NULL;
 		}
 		current_mbuf = STAILQ_NEXT(current_mbuf, f_next);
@@ -135,8 +135,7 @@
 		vs_p);
 	if(!message_frame_chain_tail)
 	{
-		ePolicy_log_vs(EPOLICY_LOG_ERROR, vs_p, "%s: too much data in end_mbuf: %d, %d", 
-			__FUNCTION__, message_frame_chain_tail->f_datalen,  end_mbuf_copy_end_p - end_mbuf->f_data + 1 );
+		ePolicy_log_vs(EPOLICY_LOG_ERROR, vs_p, "(%s:%d) too much data in current_mbuf", __FUNCTION__, __LINE__);
 		return NULL;
 	}
 	return message_frame_chain_tail;
Index: /branches/rel_apv_10_7/usr/click/lib/libeproxy/eproxy_state.h
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libeproxy/eproxy_state.h	(revision 39145)
+++ /branches/rel_apv_10_7/usr/click/lib/libeproxy/eproxy_state.h	(working copy)
@@ -147,6 +147,6 @@
 uint16_t eproxy_is_client_in_snat(struct eproxy_conn_data *client_conn_data);
 ePolicy_message * eproxy_copy_message(const ePolicy_message *ori_msg);
 void eproxy_free_message(struct _ePolicy_message *msg);
-
+void eproxy_free_message_content(struct _ePolicy_message *msg);
 
 
Index: /branches/rel_apv_10_7/usr/click/lib/libeproxy/eproxy_state.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libeproxy/eproxy_state.c	(revision 39145)
+++ /branches/rel_apv_10_7/usr/click/lib/libeproxy/eproxy_state.c	(working copy)
@@ -1530,6 +1530,42 @@
 	epolicy_message_free++;
 }
 
+void eproxy_free_message_content(struct _ePolicy_message *msg)
+{
+	if (msg->original != msg && msg->original) {
+		/*a rewriten message*/
+		ePolicy_message *orig = msg->original;
+		if (orig->message_header_frames) {
+			/*the follow line is a cheater*/
+			UFLAG_UNSET(orig->message_header_frames->f_flags, HTTP_PFRAME_SENT_TO_KERNEL);
+			parser_frame_chain_free(orig->message_header_frames);
+			orig->message_header_frames = NULL;
+		}
+		if (orig->message_body_frames) {
+			/*the follow line is a cheater*/
+			UFLAG_UNSET(orig->message_body_frames->f_flags, HTTP_PFRAME_SENT_TO_KERNEL);
+			parser_frame_chain_free(orig->message_body_frames);
+			orig->message_body_frames = NULL;
+		}
+		EPOLICY_MSG_FREE(orig);
+		msg->original = NULL;
+		epolicy_message_free++;
+	}
+	if (msg->message_header_frames) {
+		/*the follow line is a cheater*/
+		UFLAG_UNSET(msg->message_header_frames->f_flags, HTTP_PFRAME_SENT_TO_KERNEL);
+		parser_frame_chain_free(msg->message_header_frames);
+		msg->message_header_frames = NULL;
+	}
+	if (msg->message_body_frames) {
+		/*the follow line is a cheater*/
+		UFLAG_UNSET(msg->message_body_frames->f_flags, HTTP_PFRAME_SENT_TO_KERNEL);
+		parser_frame_chain_free(msg->message_body_frames);
+		msg->message_body_frames = NULL;
+	}
+}
+
+
 static void 
 eproxy_free_conn(struct eproxy_conn_data *conn_data){
 	ePolicy_message *msg;
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/request.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/request.c	(revision 39145)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/request.c	(working copy)
@@ -166,7 +166,9 @@
 			bzero(client_conn_data->conn_data2, sizeof(struct uproxy_conn_data2));
 		}
 		
-		if (!client_conn_data->eproxy_mid_msg) {
+		if (client_conn_data->eproxy_mid_msg) {
+			eproxy_free_message_content(client_conn_data->eproxy_mid_msg);
+		} else {
 			client_conn_data->eproxy_mid_msg = EPOLICY_MSG_ALLOC();
 			if (!client_conn_data->eproxy_mid_msg) {
 				free_proxy_p(proxy_p);
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/response.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/response.c	(revision 39145)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/response.c	(working copy)
@@ -751,7 +751,9 @@
 			bzero(server_conn_data->conn_data2, sizeof(struct uproxy_conn_data2));
 		}
 		
-		if (server_conn_data->eproxy_mid_msg == NULL) {
+		if (server_conn_data->eproxy_mid_msg) {
+			eproxy_free_message_content(server_conn_data->eproxy_mid_msg);
+		} else {
 			server_conn_data->eproxy_mid_msg = EPOLICY_MSG_ALLOC();
 			if (server_conn_data->eproxy_mid_msg == NULL) {
 				*detail = HTTP_ERR_502;
Index: /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/server_states.c
===================================================================
--- /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/server_states.c	(revision 39145)
+++ /branches/rel_apv_10_7/usr/click/lib/libhttp_proxy/server_states.c	(working copy)
@@ -1,3 +1,4 @@
+
 #include <bsd/bsd.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -502,7 +503,7 @@
                  * only send response headers to client, 
                  * the body will be sent to compression engine later
 		 */
-		PARSER_FRAME_DESTROY_AFTER_WRITE(server_conn_data->http_proxy_p->parsed_resp_hdrs);
+		PARSER_FRAME_DESTROY_AFTER_WRITE(frame_p);
 		write_result = amp_conn_write_http_headers(PROXY_CONNP(client_conn_data), 
 				     PROXY_CONNP(server_conn_data),
 				     frame_p,
@@ -514,6 +515,12 @@
 			AMP_PRX_APP_ERR_STAT_INC(err_write_resp_hdrs_failed);
 			return HTTP_FAIL;
 		}
+		if (epolicy_is_on(vs_p) && epolicy_msg_exist(server_conn_data)) {
+			msg = (ePolicy_message *)server_conn_data->eproxy_mid_msg;
+			msg->message_header_frames = NULL;
+			UFLAG_UNSET(server_conn_data->http_proxy_p->parsed_resp_hdrs->f_flags, HTTP_PFRAME_SENT_TO_KERNEL);
+			parser_frame_chain_free(server_conn_data->http_proxy_p->parsed_resp_hdrs);
+		}
 		server_conn_data->http_proxy_p->parsed_resp_hdrs = NULL;
 		AMP_CONNAPI_ERR_STAT_INC(connapi_event_tcp_send_headers_to_client2);
 	}
