最近做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,这个接口是不会去校验是否合法的,可以吧之前的覆盖,解决该问题。