代码之家  ›  专栏  ›  技术社区  ›  Kamal Panhwar

如何转换URI中的字符串

  •  1
  • Kamal Panhwar  · 技术社区  · 7 年前

    我设置了OpenSips 2.3代理服务器,所以服务器上的任何调用,我的脚本都会从DB中获取sip URI,并将调用转发到该URI。当我获取值时,我使用AVP获取值并将其保存在$AVP(didnumber)中,如果我使用rewrite手动指定uri,它就会起作用,但当我从DB中获取该值并分配它时,它在rewriteuri()方法中不起作用。

    $ru = "sip:"+$avp(didnumber)
    

    如果我写信

    rewriteuri("[$ru]")
    

    它抛出以下错误

    ERROR:core:parse_sip_msg_uri: bad uri <[$ru>
    ERROR:tm:new_t: uri invalid
    ERROR:tm:t_newtran: new_t failed
    

    我认为这个方法不接受普通变量,所以我添加了引号使其成为字符串变量,现在它在日志上显示得很好,但似乎我必须使用AVP或转换转换变量,我尝试了许多语法,但仍然做不到。请提出建议。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Liviu Chircu    7 年前

    rewrite_uri() 不赞成只使用 $ru 。您的R-URI已被以下语句完全重写:

    $ru = "sip:" + $avp(didnumber);
    

    但是,请注意,上述内容不正确,因为根据SIP RFC 3261,您没有向uri提供“主机端口”部分:

    SIP-URI          =  "sip:" [ userinfo ] hostport
                        uri-parameters [ headers ]
    

    解析器可能会报告错误。有两种修复方法:

    • 要么只重写R-URI“userinfo”部分,如下所示:

      $rU = $avp(didnumber);
      
    • 提供目标主机名:

      $ru = "sip:" + $avp(didnumber) + "@" + $var(destination);
      

    从这里开始,你可以 t_relay() 使用新的R-URI。

    编辑: OpenSIPS URI解析器实际上会容忍诸如“sip:44776772882”之类的URI,但它会将DID解释为主机名,因此如果脚本编写器尝试将消息中继到无效的“44776772882”主机名,则错误可能会在稍后出现。