From 1b339079dd280b5e6d719e8cf80662ecf34bd00a Mon Sep 17 00:00:00 2001
From: Nitin Jain <ntnj@users.noreply.github.com>
Date: Fri, 29 Mar 2024 17:43:07 +0000
Subject: [PATCH] Add matching prefix to decide a target.

This will allow matching protocols starting with a specific string.
---
 prefix.go | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 prefix.go

diff --git a/prefix.go b/prefix.go
new file mode 100644
index 0000000..3bf471a
--- /dev/null
+++ b/prefix.go
@@ -0,0 +1,29 @@
+package tcpproxy
+
+import (
+	"bufio"
+	"bytes"
+)
+
+func (p *Proxy) AddPrefixRoute(ipPort string, prefix []byte, dest Target) {
+	p.addRoute(ipPort, prefixMatch{prefix: prefix, target: dest})
+}
+
+type prefixMatch struct {
+	prefix []byte
+	target Target
+}
+
+func (p prefixMatch) match(br *bufio.Reader) (Target, string) {
+	if len(p.prefix) == 0 {
+		return nil, ""
+	}
+	b, err := br.Peek(len(p.prefix))
+	if err != nil {
+		return nil, ""
+	}
+	if bytes.Equal(b, p.prefix) {
+		return p.target, ""
+	}
+	return nil, ""
+}