SIP servlet 异常 the given content type " + contentType + " is not allowed

最近做28181网关的时候用到 sip servlet的协议栈

因为21818里面向MESSAGE 的 content-type类型是 Application/MANSCDP+xml

所以要在报文头你添加这个content-type

 

这里踩了两个坑

1. void setContent(java.lang.Object content, java.lang.String contentType) throws java.io.UnsupportedEncodingException;

这个接口用来设置报文内容,他的第二个字段会帮你填上content-type的头。

还有一个void addHeader(java.lang.String name, java.lang.String value);接口用来添加头;

刚开始我的我是先addHeader一个正确的头,然后调用的setContent,但是这个接口我填的错误,导致我正确类型总是被覆盖。

 

2.为了解决第一个问题,我没在setContent你也传入了Application/MANSCDP+xml,但是发现协议栈报错了the given content type " + contentType + " is not allowed 会抛出一个异常,跟源码发现在这个setContent的接口你会调用一个函数检查传入的contentType,协议栈默认的允许类型如下,而且是区分大小写的,所以Application/MANSCDP+xml传入必定抛异常

IANA_ALLOWED_CONTENT_TYPES.add("application");
        IANA_ALLOWED_CONTENT_TYPES.add("audio");
        IANA_ALLOWED_CONTENT_TYPES.add("example");
        IANA_ALLOWED_CONTENT_TYPES.add("image");
        IANA_ALLOWED_CONTENT_TYPES.add("message");
        IANA_ALLOWED_CONTENT_TYPES.add("model");
        IANA_ALLOWED_CONTENT_TYPES.add("multipart");
        IANA_ALLOWED_CONTENT_TYPES.add("text");
        IANA_ALLOWED_CONTENT_TYPES.add("video");

 

 

解决思路有两个

1:、反编译源码包改为大小写不明感的比较方式;

2.  先调用setContent,此时随便填一个合法的contentType,然后在后面调用addHeader去修改正确的contentType,这个接口是不会去校验是否合法的,可以吧之前的覆盖,解决该问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值