最近做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,這個接口是不會去校驗是否合法的,可以吧之前的覆蓋,解決該問題。