Re: reporting the bytes read and transferred to the worker from the tunnel

2021-05-05 Thread Jim Jagielski
LGTM

> On May 5, 2021, at 5:59 AM, jean-frederic clere  wrote:
> 
> Hi,
> 
> I have noted that when using websocket the bytes read and transfered by the 
> worker when using the tunnel are not taken in account.
> 
> I have a patch attached, for comments ;-)
> 
> Any better ideas how to fix that?
> 
> -- 
> Cheers
> 
> Jean-Frederic
> 



reporting the bytes read and transferred to the worker from the tunnel

2021-05-05 Thread jean-frederic clere

Hi,

I have noted that when using websocket the bytes read and transfered by 
the worker when using the tunnel are not taken in account.


I have a patch attached, for comments ;-)

Any better ideas how to fix that?

--
Cheers

Jean-Frederic
Index: mod_proxy.h
===
--- mod_proxy.h (revision 1889510)
+++ mod_proxy.h (working copy)
@@ -1470,10 +1470,25 @@
apr_bucket_brigade 
*bb_i,
apr_bucket_brigade 
*bb_o,
const char *name,
-   int *sent,
+   apr_off_t *sent,
apr_off_t bsize,
int flags);
 
+/* 
+ * returns number of bytes read from the back end tunnel
+ * @param ptunnel proxy_tunnel_rec use during the tunnelling.
+ * @return  apr_off_t number of bytes read.
+ */
+PROXY_DECLARE (apr_off_t) ap_proxy_tunnel_conn_get_read(
+   proxy_tunnel_rec 
*ptunnel);
+/*
+ * returns number of bytes sent to the back end tunnel
+ * @param ptunnel proxy_tunnel_rec use during the tunnelling.
+ * @return  apr_off_t number of bytes sent.
+ */
+PROXY_DECLARE (apr_off_t) ap_proxy_tunnel_conn_get_transferred(
+   proxy_tunnel_rec 
*ptunnel);
+
 extern module PROXY_DECLARE_DATA proxy_module;
 
 #endif /*MOD_PROXY_H*/
Index: mod_proxy_http.c
===
--- mod_proxy_http.c(revision 1889510)
+++ mod_proxy_http.c(working copy)
@@ -1542,6 +1542,8 @@
 r->status = status;
 }
 
+backend->worker->s->read = backend->worker->s->read + 
ap_proxy_tunnel_conn_get_read(req->tunnel);
+backend->worker->s->transferred = backend->worker->s->transferred 
+ ap_proxy_tunnel_conn_get_transferred(req->tunnel);
 /* We are done with both connections */
 r->connection->keepalive = AP_CONN_CLOSE;
 backend->close = 1;
Index: proxy_util.c
===
--- proxy_util.c(revision 1889510)
+++ proxy_util.c(working copy)
@@ -4404,7 +4404,7 @@
apr_bucket_brigade 
*bb_i,
apr_bucket_brigade 
*bb_o,
const char *name,
-   int *sent,
+   apr_off_t *sent,
apr_off_t bsize,
int flags)
 {
@@ -4411,9 +4411,7 @@
 apr_status_t rv;
 int flush_each = 0;
 unsigned int num_reads = 0;
-#ifdef DEBUGGING
 apr_off_t len;
-#endif
 
 /*
  * Compat: since FLUSH_EACH is default (and zero) for legacy reasons, we
@@ -4456,7 +4454,6 @@
 if (APR_BRIGADE_EMPTY(bb_i)) {
 break;
 }
-#ifdef DEBUGGING
 len = -1;
 apr_brigade_length(bb_i, 0, &len);
 ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(03306)
@@ -4463,9 +4460,8 @@
   "ap_proxy_transfer_between_connections: "
   "read %" APR_OFF_T_FMT
   " bytes from %s", len, name);
-#endif
-if (sent) {
-*sent = 1;
+if (sent && len > 0) {
+*sent = *sent + len;
 }
 ap_proxy_buckets_lifetime_transform(r, bb_i, bb_o);
 if (flush_each) {
@@ -4559,8 +4555,18 @@
 
 unsigned int down_in:1,
  down_out:1;
+apr_off_t exchanged;
 };
 
+PROXY_DECLARE(apr_off_t) ap_proxy_tunnel_conn_get_read(proxy_tunnel_rec 
*ptunnel)
+{
+return ptunnel->origin->exchanged;
+}
+PROXY_DECLARE(apr_off_t) ap_proxy_tunnel_conn_get_transferred(proxy_tunnel_rec 
*ptunnel)
+{
+return ptunnel->client->exchanged;
+}
+
 PROXY_DECLARE(apr_status_t) ap_proxy_tunnel_create(proxy_tunnel_rec **ptunnel,
request_rec *r, conn_rec 
*c_o,
const char *scheme)
@@ -4693,7 +4699,7 @@
 {
 struct proxy_tunnel_conn *out = in->other;
 apr_status_t rv;
-int sent = 0;
+apr_off_t sent = 0;
 
 ap_log_rerror(APLOG_MARK, APLOG_TRACE8, 0, tunnel->r,
   "proxy: %s: %s input ready",
@@ -4709,6 +4715,9 @@
 if (sent && out == tunnel->client) {
 tunnel->replied = 1;
 }
+
+in->exchanged = in->exchanged + sent;
+
 if (rv != APR_SUCCESS) {
 if (APR_STATUS_IS_INCOMPLETE(rv)