Commit 21df0484 authored by baire's avatar baire
Browse files

then decode the userinfo

parent e7bb6984
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -7,9 +7,9 @@ namespace t3devlib { namespace gen {

class Regex {
public:
	Regex(const char* regex) {
	Regex(const char* regex, int flags = 0) {

		if (regcomp (&mRegex, regex, 0)) 
		if (regcomp (&mRegex, regex, flags)) 
		{
			std::cerr << "bad regex: " << regex << endl;
			abort();
@@ -23,6 +23,12 @@ public:
		return !regexec (&mRegex, start, 16, mMatches, 0);
	}

	void AssertMatch (Buffer& buffer, Variable* v) throw (DecodeError) {
		if (!Match (buffer)) {
			Error (v, buffer);
		}
	}

	int GetMatchedLength() {
		return (mMatches[0].rm_eo - mMatches[0].rm_so)*8;
	}
@@ -44,17 +50,31 @@ private:
void SipUrl::PreDecodeField (int id, Buffer& buffer) throw (DecodeError)
{

	static Regex reg_scheme ("^sip:");
	static Regex reg_scheme ("^sip:", REG_ICASE);
	static Regex reg_userinfo ("^[&=+$,;?/A-Z0-9\\-_.!~*'():]*@", REG_ICASE);

	switch (id) {
	case id_scheme:
		if (reg_scheme.Match (buffer)) {
		reg_scheme.AssertMatch (buffer, this);
		SetHypFieldLength (id_scheme, reg_scheme.GetMatchedLength());
		break;

	case id_userInfo:
		if (reg_userinfo.Match (buffer)) {
			SetHypFieldIsPresent (id,  1);
			SetHypFieldLength (id, reg_userinfo.GetMatchedLength() - 8);
		} else {
			reg_scheme.Error (this, buffer);
			SetHypFieldIsPresent (id,  0);
		}
		break;

	case id_hostPort:
		if (IsPresent (id_userInfo)) {
			Unsigned(8).Decode(buffer);
		}

		break;

	}
}