MINOR: quic: Handle the cases of overlapping STREAM frames

This is the same treatment for bidi and uni STREAM frames. This is a duplication
code which should me remove building a function for both these types of streams.
diff --git a/src/xprt_quic.c b/src/xprt_quic.c
index 8943dfb..7967802 100644
--- a/src/xprt_quic.c
+++ b/src/xprt_quic.c
@@ -2046,7 +2046,7 @@
 {
 	int total;
 	struct qcs *strm;
-	struct eb64_node *strm_node, *frm_node;
+	struct eb64_node *strm_node;
 	struct quic_rx_strm_frm *frm;
 
 	strm_node = qcc_get_qcs(qc->qcc, strm_frm->id);
@@ -2056,12 +2056,20 @@
 	}
 
 	strm = eb64_entry(&strm_node->node, struct qcs, by_id);
-	frm_node = eb64_lookup(&strm->rx.frms, strm_frm->offset.key);
-	/* FIXME: handle the case where this frame overlap others */
-	if (frm_node) {
-		TRACE_PROTO("Already existing stream data",
-		            QUIC_EV_CONN_PSTRM, qc);
-		goto out;
+	if (strm_frm->offset.key < strm->rx.offset) {
+		size_t diff;
+
+		if (strm_frm->offset.key + strm_frm->len <= strm->rx.offset) {
+			TRACE_PROTO("Already received STREAM data",
+			            QUIC_EV_CONN_PSTRM, qc);
+			goto out;
+		}
+
+		TRACE_PROTO("Partially already received STREAM data", QUIC_EV_CONN_PSTRM, qc);
+		diff = strm->rx.offset - strm_frm->offset.key;
+		strm_frm->offset.key = strm->rx.offset;
+		strm_frm->len -= diff;
+		strm_frm->data += diff;
 	}
 
 	total = 0;
@@ -2112,7 +2120,7 @@
                                   struct quic_conn *qc)
 {
 	struct qcs *strm;
-	struct eb64_node *strm_node, *frm_node;
+	struct eb64_node *strm_node;
 	struct quic_rx_strm_frm *frm;
 	size_t strm_frm_len;
 
@@ -2123,12 +2131,20 @@
 	}
 
 	strm = eb64_entry(&strm_node->node, struct qcs, by_id);
-	frm_node = eb64_lookup(&strm->rx.frms, strm_frm->offset.key);
-	/* FIXME: handle the case where this frame overlap others */
-	if (frm_node) {
-		TRACE_PROTO("Already existing stream data",
-		            QUIC_EV_CONN_PSTRM, qc);
-		goto out;
+	if (strm_frm->offset.key < strm->rx.offset) {
+		size_t diff;
+
+		if (strm_frm->offset.key + strm_frm->len <= strm->rx.offset) {
+			TRACE_PROTO("Already received STREAM data",
+			            QUIC_EV_CONN_PSTRM, qc);
+			goto out;
+		}
+
+		TRACE_PROTO("Partially already received STREAM data", QUIC_EV_CONN_PSTRM, qc);
+		diff = strm->rx.offset - strm_frm->offset.key;
+		strm_frm->offset.key = strm->rx.offset;
+		strm_frm->len -= diff;
+		strm_frm->data += diff;
 	}
 
 	strm_frm_len = strm_frm->len;