BUG/MINOR: htx: Detect when tail_addr meet end_addr to maximize free rooms

When a block's payload is moved during an expansion or when the whole block is
removed, the addresses of free spaces are updated accordingly. We must be
careful to reset them when <tail_addr> becomes equal to <end_addr>. In this
situation, we can maximize the free space between the blocks and their payload
and set the other one to 0. It is also important to be sure to never have
<end_addr> greater than <tail_addr>.
diff --git a/src/htx.c b/src/htx.c
index e83271c..bfd136f 100644
--- a/src/htx.c
+++ b/src/htx.c
@@ -249,11 +249,17 @@
 		}
 		else if ((sz + delta) < headroom) {
 			/* Move the block's payload into the headroom */
-			if (blk->addr == htx->end_addr)
-				htx->end_addr += sz;
 			blk->addr = htx->head_addr;
 			htx->tail_addr -= sz;
 			htx->head_addr += sz + delta;
+			if (blk->addr == htx->end_addr) {
+				if (htx->end_addr == htx->tail_addr) {
+					htx->tail_addr = htx->head_addr;
+					htx->head_addr = htx->end_addr = 0;
+				}
+				else
+					htx->end_addr += sz;
+			}
 			ret = 2;
 		}
 	}
@@ -368,11 +374,13 @@
 			htx->tail_addr = addr;
 		else if (addr+sz == htx->head_addr)
 			htx->head_addr = addr;
-		if (addr == htx->end_addr)
-			htx->end_addr += sz;
-		if (htx->tail_addr == htx->end_addr) {
-			htx->tail_addr = htx->head_addr;
-			htx->head_addr = htx->end_addr = 0;
+		if (addr == htx->end_addr) {
+			if (htx->tail_addr == htx->end_addr) {
+				htx->tail_addr = htx->head_addr;
+				htx->head_addr = htx->end_addr = 0;
+			}
+			else
+				htx->end_addr += sz;
 		}
 	}