648540858
2024-05-29 764d04b497356ba6bcbb75fd42b51eca750f7223
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/SIPRequestProcessorParent.java
old mode 100644 new mode 100755
@@ -1,15 +1,11 @@
package com.genersoft.iot.vmp.gb28181.transmit.event.request;
import com.genersoft.iot.vmp.conf.SipConfig;
import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform;
import com.genersoft.iot.vmp.gb28181.transmit.cmd.ISIPCommander;
import com.genersoft.iot.vmp.gb28181.transmit.SIPSender;
import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import gov.nist.javax.sip.SipProviderImpl;
import com.google.common.primitives.Bytes;
import gov.nist.javax.sip.message.SIPRequest;
import gov.nist.javax.sip.message.SIPResponse;
import gov.nist.javax.sip.stack.SIPServerTransactionImpl;
import org.apache.commons.lang3.ArrayUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
@@ -17,14 +13,13 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.parameters.P;
import javax.sip.*;
import javax.sip.address.Address;
import javax.sip.address.AddressFactory;
import javax.sip.address.SipURI;
import javax.sip.header.*;
import javax.sip.header.ContentTypeHeader;
import javax.sip.header.ExpiresHeader;
import javax.sip.header.HeaderFactory;
import javax.sip.message.MessageFactory;
import javax.sip.message.Request;
import javax.sip.message.Response;
@@ -46,20 +41,11 @@
   @Autowired
   private SIPSender sipSender;
   public AddressFactory getAddressFactory() {
      try {
         return SipFactory.getInstance().createAddressFactory();
      } catch (PeerUnavailableException e) {
         e.printStackTrace();
      }
      return null;
   }
   public HeaderFactory getHeaderFactory() {
      try {
         return SipFactory.getInstance().createHeaderFactory();
      } catch (PeerUnavailableException e) {
         e.printStackTrace();
         logger.error("未处理的异常 ", e);
      }
      return null;
   }
@@ -68,7 +54,7 @@
      try {
         return SipFactory.getInstance().createMessageFactory();
      } catch (PeerUnavailableException e) {
         e.printStackTrace();
         logger.error("未处理的异常 ", e);
      }
      return null;
   }
@@ -157,7 +143,10 @@
      responseAckExtraParam.content = sdp;
      responseAckExtraParam.sipURI = sipURI;
      return responseAck(request, Response.OK, null, responseAckExtraParam);
      SIPResponse sipResponse = responseAck(request, Response.OK, null, responseAckExtraParam);
      return sipResponse;
   }
   /**
@@ -182,6 +171,7 @@
      return getRootElement(evt, "gb2312");
   }
   public Element getRootElement(RequestEvent evt, String charset) throws DocumentException {
      if (charset == null) {
         charset = "gb2312";
      }
@@ -190,7 +180,8 @@
      reader.setEncoding(charset);
      // 对海康出现的未转义字符做处理。
      String[] destStrArray = new String[]{"<",">","&","'","""};
      char despChar = '&'; // 或许可扩展兼容其他字符
      // 或许可扩展兼容其他字符
      char despChar = '&';
      byte destBye = (byte) despChar;
      List<Byte> result = new ArrayList<>();
      byte[] rawContent = request.getRawContent();
@@ -213,11 +204,28 @@
            result.add(rawContent[i]);
         }
      }
      Byte[] bytes = new Byte[0];
      byte[] bytesResult = ArrayUtils.toPrimitive(result.toArray(bytes));
      byte[] bytesResult = Bytes.toArray(result);
      Document xml = reader.read(new ByteArrayInputStream(bytesResult));
      Document xml;
      try {
         xml = reader.read(new ByteArrayInputStream(bytesResult));
      }catch (DocumentException e) {
         logger.warn("[xml解析异常]: 原文如下: \r\n{}", new String(bytesResult));
         logger.warn("[xml解析异常]: 原文如下: 尝试兼容性处理");
         String[] xmlLineArray = new String(bytesResult).split("\\r?\\n");
         // 兼容海康的address字段带有<破换xml结构导致无法解析xml的问题
         StringBuilder stringBuilder = new StringBuilder();
         for (String s : xmlLineArray) {
            if (s.startsWith("<Address")) {
               continue;
            }
            stringBuilder.append(s);
         }
         xml = reader.read(new ByteArrayInputStream(stringBuilder.toString().getBytes()));
      }
      return xml.getRootElement();
   }
}