diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
index c9cac611..3637a4dd 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java
@@ -77,8 +77,8 @@ public class ConnectionDetailsActivity extends BaseActivity implements Connectio
View url_row = findViewById(R.id.detail_url_row);
View info_row = findViewById(R.id.detail_info_row);
TextView source = findViewById(R.id.detail_source);
- TextView http_request = findViewById(R.id.http_request);
- TextView http_request_lbl = findViewById(R.id.http_request_label);
+ TextView request_data = findViewById(R.id.request_data);
+ TextView request_data_lbl = findViewById(R.id.request_data_label);
TextView destination = findViewById(R.id.detail_destination);
mTable = findViewById(R.id.table);
mBytesView = findViewById(R.id.detail_bytes);
@@ -118,11 +118,11 @@ public class ConnectionDetailsActivity extends BaseActivity implements Connectio
else
url_row.setVisibility(View.GONE);
- if(!mConn.http_request.isEmpty())
- http_request.setText(mConn.http_request);
+ if(!mConn.request_plaintext.isEmpty())
+ request_data.setText(mConn.request_plaintext);
else {
- http_request.setVisibility(View.GONE);
- http_request_lbl.setVisibility(View.GONE);
+ request_data.setVisibility(View.GONE);
+ request_data_lbl.setVisibility(View.GONE);
}
updateStats(mConn);
diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java
index 29586c13..a791ab18 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java
@@ -56,7 +56,7 @@ public class ConnectionDescriptor implements Serializable {
public int rcvd_pkts;
public String info;
public String url;
- public String http_request;
+ public String request_plaintext;
public String l7proto;
public int uid;
public int incr_id;
@@ -88,7 +88,7 @@ public class ConnectionDescriptor implements Serializable {
status = _status;
info = _info;
url = _url;
- http_request = _req;
+ request_plaintext = _req;
l7proto = _l7proto;
uid = _uid;
incr_id = _incr_id;
diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.c b/app/src/main/jni/vpnproxy-jni/vpnproxy.c
index 51ec8fbd..a88c30c8 100644
--- a/app/src/main/jni/vpnproxy-jni/vpnproxy.c
+++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.c
@@ -42,13 +42,6 @@ static vpnproxy_data_t *global_proxy = NULL;
/* ******************************************************* */
-static void trim_trailing_newlines(char *request_data, int request_len) {
- while((request_len > 0) && (request_data[request_len - 1] == '\n'))
- request_data[--request_len] = '\0';
-}
-
-/* ******************************************************* */
-
static void conn_free_ndpi(conn_data_t *data) {
if(data->ndpi_flow) {
ndpi_free_flow(data->ndpi_flow);
@@ -74,10 +67,10 @@ void conn_free_data(conn_data_t *data) {
if(data->info)
free(data->info);
- if(data->http.url)
- free(data->http.url);
- if(data->http.request_data)
- free(data->http.request_data);
+ if(data->url)
+ free(data->url);
+ if(data->request_data)
+ free(data->request_data);
free(data);
}
@@ -372,11 +365,7 @@ void conn_end_ndpi_detection(conn_data_t *data, vpnproxy_data_t *proxy, const zd
}
if(data->ndpi_flow->http.url)
- data->http.url = strndup(data->ndpi_flow->http.url, 256);
-
- if(data->http.request_data && !data->http.parsing_done)
- trim_trailing_newlines(data->http.request_data, strlen(data->http.request_data));
- data->http.parsing_done = true;
+ data->url = strndup(data->ndpi_flow->http.url, 256);
break;
case NDPI_PROTOCOL_TLS:
@@ -394,52 +383,47 @@ void conn_end_ndpi_detection(conn_data_t *data, vpnproxy_data_t *proxy, const zd
/* ******************************************************* */
-static int http_is_printable(char c) {
- return isprint(c) || (c == '\r') || (c == '\n');
+static int is_plaintext(char c) {
+ return isprint(c) || (c == '\r') || (c == '\n') || (c == '\t');
}
/* ******************************************************* */
-static void process_http_data(conn_data_t *data, const struct zdtun_pkt *pkt, uint8_t from_tun) {
+static void process_request_data(conn_data_t *data, const struct zdtun_pkt *pkt, uint8_t from_tun) {
if(pkt->l7_len > 0) {
- int request_len = data->http.request_data ? (int)strlen(data->http.request_data) : 0;
-
- if(from_tun) {
- int num_chars = min(MAX_HTTP_REQUEST_LENGTH - request_len, pkt->l7_len);
+ if(from_tun && is_plaintext(pkt->l7[0])) {
+ int request_len = data->request_data ? (int)strlen(data->request_data) : 0;
+ int num_chars = min(MAX_PLAINTEXT_LENGTH - request_len, pkt->l7_len);
if(num_chars <= 0) {
- data->http.parsing_done = true;
+ data->request_done = true;
return;
}
// +1 to add a NULL terminator
- data->http.request_data = realloc(data->http.request_data,
- request_len + num_chars + 1);
+ data->request_data = realloc(data->request_data,request_len + num_chars + 1);
- if(!data->http.request_data) {
- log_e("realloc(http.request_data.buffer) failed with code %d/%s",
+ if(!data->request_data) {
+ log_e("realloc(request_data) failed with code %d/%s",
errno, strerror(errno));
- data->http.parsing_done = true;
+ data->request_done = true;
return;
}
for(int i = 0; i < num_chars; i++) {
char ch = pkt->l7[i];
- if(!http_is_printable(ch)) {
- data->http.parsing_done = true;
+ if(!is_plaintext(ch)) {
+ data->request_done = true;
break;
}
- if(ch != '\r')
- data->http.request_data[request_len++] = ch;
+ data->request_data[request_len++] = ch;
}
- data->http.request_data[request_len] = '\0';
- } else {
- trim_trailing_newlines(data->http.request_data, request_len);
- data->http.parsing_done = true;
- }
+ data->request_data[request_len] = '\0';
+ } else
+ data->request_done = true;
}
}
@@ -454,12 +438,8 @@ static void process_ndpi_packet(conn_data_t *data, vpnproxy_data_t *proxy,
from_tun ? data->src_id : data->dst_id,
from_tun ? data->dst_id : data->src_id);
- if((data->l7proto.master_protocol == NDPI_PROTOCOL_HTTP) || (data->l7proto.app_protocol == NDPI_PROTOCOL_HTTP)
- && (!data->http.parsing_done)
- && !data->ndpi_flow->packet.tcp_retransmission) {
- data->l7proto.master_protocol = NDPI_PROTOCOL_HTTP;
- process_http_data(data, pkt, from_tun);
- }
+ if((!data->request_done) && !data->ndpi_flow->packet.tcp_retransmission)
+ process_request_data(data, pkt, from_tun);
if(giveup || ((data->l7proto.app_protocol != NDPI_PROTOCOL_UNKNOWN) &&
(!ndpi_extra_dissection_possible(proxy->ndpi, data->ndpi_flow))))
@@ -541,8 +521,8 @@ static int dumpConnection(vpnproxy_data_t *proxy, const vpn_conn_t *conn, jobjec
#endif
jobject info_string = (*env)->NewStringUTF(env, data->info ? data->info : "");
- jobject url_string = (*env)->NewStringUTF(env, data->http.url ? data->http.url : "");
- jobject req_string = (*env)->NewStringUTF(env, data->http.request_data ? data->http.request_data : "");
+ jobject url_string = (*env)->NewStringUTF(env, data->url ? data->url : "");
+ jobject req_string = (*env)->NewStringUTF(env, data->request_data ? data->request_data : "");
jobject proto_string = (*env)->NewStringUTF(env, getProtoName(proxy->ndpi, data->l7proto, conn_info->ipproto));
jobject src_string = (*env)->NewStringUTF(env, srcip);
jobject dst_string = (*env)->NewStringUTF(env, dstip);
diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.h b/app/src/main/jni/vpnproxy-jni/vpnproxy.h
index ec1740ae..3923bf98 100644
--- a/app/src/main/jni/vpnproxy-jni/vpnproxy.h
+++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.h
@@ -34,7 +34,7 @@
#define MAX_HOST_LRU_SIZE 128
#define JAVA_PCAP_BUFFER_SIZE (512*1024) // 512K
#define PERIODIC_PURGE_TIMEOUT_MS 5000
-#define MAX_HTTP_REQUEST_LENGTH 2048
+#define MAX_PLAINTEXT_LENGTH 1024
#define DNS_FLAGS_MASK 0x8000
#define DNS_TYPE_REQUEST 0x0000
@@ -68,12 +68,9 @@ typedef struct conn_data {
char *info;
jint uid;
bool pending_notification;
-
- struct {
- char *url;
- char *request_data;
- bool parsing_done;
- } http;
+ bool request_done;
+ char *request_data;
+ char *url;
} conn_data_t;
typedef struct vpn_conn {
diff --git a/app/src/main/res/layout/activity_connection_details.xml b/app/src/main/res/layout/activity_connection_details.xml
index 8c967713..9456e7bf 100644
--- a/app/src/main/res/layout/activity_connection_details.xml
+++ b/app/src/main/res/layout/activity_connection_details.xml
@@ -253,23 +253,23 @@
+ android:text="@string/request_plaintext"/>
Donazioni
Richiesta HTTP
Log Root
+ Richiesta in Chiaro
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d8fe0d3e..b1241673 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -130,5 +130,6 @@
Donate
HTTP Request
Root Log
+ Request Plaintext
diff --git a/submodules/nDPI b/submodules/nDPI
index 9c6e6dad..82a8ffe5 160000
--- a/submodules/nDPI
+++ b/submodules/nDPI
@@ -1 +1 @@
-Subproject commit 9c6e6dadb1c3257de41869030cfffb4242001cc3
+Subproject commit 82a8ffe535253f4bd0d07eee1a0ba9cc2857a488