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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章