Commit a697925d authored by urbant's avatar urbant
Browse files

IPv4 and IPv6

parent 85d82243
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ private:
#define SIPCHARS_MARK		"\\-_.!~*'()"
#define SIPCHARS_ALFA		"A-Za-z"
#define SIPCHARS_ALFANUM	"0-9" SIPCHARS_ALFA
#define SIPCHARS_HEXA	"0-9A-F"
#define SIPCHARS_UNRESERVED	SIPCHARS_ALFANUM SIPCHARS_MARK
#define SIPCHARS_USER_UNRESERVED "&=+$,;?/"
#define SIPCHARS_ESCAPED	"(%[0-9A-F]{2})"
@@ -74,6 +75,16 @@ private:
#define SIPCHARS_HOSTNAME	"(" SIPCHARS_DOMAINLABEL "\\.)*" SIPCHARS_TOPLABEL "\\.?"

// IPv4
#define SIPCHARS_IP4	"([0-9]{1,3}\\.){3}[0-9]{1,3}"

// IPv6
#define SIPCHARS_HEX4		"[" SIPCHARS_HEXA "]{1,4}"
#define SIPCHARS_HEXSEQ		SIPCHARS_HEX4 "([:]" SIPCHARS_HEX4 ")*"
#define SIPCHARS_HEXPART	"(((" SIPCHARS_HEXSEQ ")?[:]{2}(" SIPCHARS_HEXSEQ ")?)|(" SIPCHARS_HEXSEQ  "))"
#define SIPCHARS_IP6		"[[]" SIPCHARS_HEXPART "([:]" SIPCHARS_IP4 ")?[]]"

// host
#define SIPCHARS_HOST		"((" SIPCHARS_HOSTNAME ")|(" SIPCHARS_IP4 ")|(" SIPCHARS_IP6 "))"

#define SIPCHARS_PPARAM_UNRESERVED "][/:&+$"
#define SIPCHARS_PPARAM		"([" SIPCHARS_PPARAM_UNRESERVED SIPCHARS_UNRESERVED "]|" SIPCHARS_ESCAPED "])"
@@ -88,7 +99,7 @@ void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)

	static Regex reg_scheme ("^sip:", REG_ICASE);
	static Regex reg_userinfo ("^([:" SIPCHARS_UNRESERVED SIPCHARS_USER_UNRESERVED "]|" SIPCHARS_ESCAPED "])+@", REG_ICASE);
	static Regex reg_hostport ("^[:." SIPCHARS_ALFANUM "\\-]+", REG_ICASE);
	static Regex reg_hostport ("^[][" SIPCHARS_ALFANUM ":.\\-]+", REG_ICASE);
	static Regex reg_urlParams ("^;" SIPCHARS_PPARAM_ALLOWED, REG_ICASE);
	static Regex reg_headers ("^[?]" SIPCHARS_PPARAM_ALLOWED, REG_ICASE);

@@ -163,8 +174,8 @@ void UserInfo::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)

void HostPort::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{
	static Regex reg_host1 (SIPCHARS_HOSTNAME, REG_ICASE);
	static Regex reg_host2 (SIPCHARS_HOSTNAME ":", REG_ICASE);
	static Regex reg_host1 (SIPCHARS_HOST, REG_ICASE);
	static Regex reg_host2 (SIPCHARS_HOST ":", REG_ICASE);
	switch (id) {
	case id_host:
		SetHypFieldIsPresent(id, 1);