📄 mm7sender.java
字号:
MMConstants.CONTENT_LENGTH);
int conlen2 = baos.toString().indexOf("\r", conlen1);
contlen3 = Integer.parseInt(baos.toString().substring(
(conlen1 + MMConstants.CONTENT_LENGTH.length() + 1), conlen2)
.trim());
httpseper = baos.toString().indexOf("\r\n\r\n");
if (httpCode.equals("200")) {
// 还要再加判断客户端是否是长连接
ResendCount = 0;
excuteFlag = true;
if (ConnectionFlag.trim().toLowerCase().equals("keep-alive")) {
pool.setNonceCount(Integer.toString(Integer.parseInt(pool
.getNonceCount(), 8) + 1));
connWrap.setDigestInfor(setDigestAuth(authInfor));
continue;
}
}
}
// 开始接收http体
if (totalresline == httpseper + contlen3 + 4) {
/*
* if(this.TimeOutFlag==true){
* SevereBuffer.append("baos.tostring()=="+baos.toString()); }
*/
if (pool.getKeepAlive().equals("off")) {
sender.close();
receiver.close();
client.close();
}
else {
connWrap.setUserfulFlag(true);
connWrap.setFree(true);
}
flag = true;
bReceive = true;
break;
}
}
}
else if (baos.toString().indexOf("Basic") != -1) {
if (log.isDebugEnabled())
log.debug("进行了Basic加密,对其进行解析");
if (ResendCount < mm7Config.getReSendCount()) {
ResendCount = ResendCount + 1;
receiveMessge();
}
else {
bReceive = false;
break;
}
}
}
else {
bReceive = false;
break;
}
}
else {
int index1 = baos.toString().toLowerCase().indexOf(MMConstants.CONTENT_LENGTH);
int index2 = baos.toString().indexOf("\r", index1);
int contlength = 0;
if (index1 == -1 || index2 == -1) {
if (log.isDebugEnabled())
log.debug("index1=" + index1 + ",index2=" + index2 + ",这个应该不会出现!!!");
int encodingindex = baos.toString().toLowerCase().indexOf("transfer-encoding:");
if (log.isDebugEnabled())
log.debug("encodingindex=" + encodingindex);
if (encodingindex >= 0) {
int encodingend = baos.toString().indexOf("\r\n", encodingindex);
if (encodingend >= 0) {
String strenc = baos.toString().substring(
encodingindex + "transfer-encoding:".length(), encodingend).trim();
if (strenc.equalsIgnoreCase("chunked")) {
// //在这里可以增加chunked的处理
int endencindex2 = baos.toString().indexOf("\r\n", encodingend + 1);
if (endencindex2 >= 0) {
int xmlbeg = baos.toString().indexOf(MMConstants.BEGINXMLFLAG,
endencindex2 + 1);
if (xmlbeg > 0) {
String strTempContLen = baos.toString().substring(endencindex2,
xmlbeg).trim();
contlength = Integer.parseInt(strTempContLen, 16);
}
}
}
else {
bReceive = false;
break;
}
}
else {
bReceive = false;
break;
}
}
else {
continue;
}
if (totalline >= httpsepindex + contlength + 8) {
SevereBuffer.append("receive end");
SevereBuffer.append("baos.toString()==" + baos.toString());
if (pool.getKeepAlive().equals("off")) {
sender.close();
receiver.close();
client.close();
}
else {
connWrap.setUserfulFlag(true);
connWrap.setFree(true);
}
bReceive = true;
break;
}
}
else {
contlength = Integer.parseInt(baos.toString().substring(
(index1 + MMConstants.CONTENT_LENGTH.length() + 1), index2).trim());
if (log.isDebugEnabled())
log.debug("收到的响应消息的长度为:" + contlength);
// 开始接收http体
if (totalline == httpsepindex + contlength + 4) {
if (log.isDebugEnabled())
log.debug("返回的响应消息正常接收结束!!!");
// System.out.println("正常接收结束");
// add by hudm to test 104 problem
// 2004-06-09
if (this.TimeOutFlag == true)
SevereBuffer.append("baos.tostring()==" + baos.toString());
// end add by hudm
if (pool.getKeepAlive().equals("off")) {
sender.close();
receiver.close();
client.close();
}
else {
connWrap.setUserfulFlag(true);
connWrap.setFree(true);
}
bReceive = true;
break;
}
}
}
}
else {
bReceive = false;
break;
}
}
}
else if (readlineOut == 1) {
log.warn("第一次从流中读数据返回值为-1,返回false");
//将这条链路从连接池中删除掉
pool.deleteURL(this.TimeOutWrap);
return false;
// modified by liuhuafeng on 2006/7/26
// 如果从流中读数据的返回值为-1,则返回false
// System.out.println("第1083行。");
// this.TimeOutFlag = true;
// sendBaos = getSendMessage(this.TimeOutbCount);
// if (sendBaos != null) {
// // System.out.println("第1087行。");
// res = SendandReceiveMessage(sendBaos);
// if (res != null) {
// this.TimeOutFlag = false;
// return true;
// }
// }
// else
// return false;
}else if(System.currentTimeMillis()-now>=5000){
//将这条链路从连接池中删除掉
pool.deleteURL(this.TimeOutWrap);
log.warn("连续5秒读取数据的返回值为-1,返回false");
return false;
}
}
return bReceive;
}
catch (SocketTimeoutException ste) {
log.error("读取返回消息超时:"+ste);
//将这条链路从连接池中删除掉
pool.deleteURL(this.TimeOutWrap);
// System.out.println("第1100行。");
// this.TimeOutFlag = true;
// ReadTimeOutCount++;
// if (ReadTimeOutCount < mm7Config.getReSendCount()) {
// sendBaos = getSendMessage(this.TimeOutbCount);
// if (sendBaos != null) {
// res = SendandReceiveMessage(sendBaos);
// if (res != null) {
// this.TimeOutFlag = false;
// return true;
// }
// /*
// * if (res.getStatusCode() ==
// * MMConstants.RequestStatus.SUCCESS) { this.TimeOutFlag =
// * false; return true; }
// */
// }
// else
// return false;
// }
// this.TimeOutFlag = false;
//modified by liuhuafeng on 2006/7/26,不考虑发送失败重发的情况
res.setStatusCode(-101);
res.setStatusText("超时发送失败!");
SevereBuffer.append("[Comments={-101;" + res.getStatusText() + "}]");
ReadTimeOutCount = 0;
return false;
}
}
/** 输入string,输出经过MD5编码的String */
public String calcMD5(String str) {
try {
MessageDigest alga = MessageDigest.getInstance("MD5");
alga.update(str.getBytes());
byte[] digesta = alga.digest();
return byte2hex(digesta);
}
catch (NoSuchAlgorithmException ex) {
// System.out.println("出错了!!没有这种算法!");
log.error("calcMD5():"+ex);
}
return "NULL";
}
// byte[]数组转成字符串
public String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
if (n < b.length - 1)
hs = hs + "";
}
return hs;
}
private String setDigestAuth(String authinfor) {
String auth = authinfor + "\r\n";
int equal = -1;
int comma = -1;
StringBuffer authBuffer = new StringBuffer();
authBuffer.append("Authorization: Digest ");
String qopValue;
String MD5A2;
String algValue;
String cnonceValue = "";
String ncValue;
String responseValue;
String uri = mm7Config.getMMSCURL();
if (uri == null)
uri = "";
String username = mm7Config.getUserName();
authBuffer.append("uri=\"" + uri + "\",");
authBuffer.append("username=\"" + username + "\",");
String passwd = mm7Config.getPassword();
// 获得realm的值
int realmindex = auth.indexOf(MMConstants.REALM);
equal = auth.indexOf("=", realmindex + 1);
comma = auth.indexOf("\"", equal + 2);
String realmValue = auth.substring(equal + 1, comma);
if (realmValue.startsWith("\""))
realmValue = realmValue.substring(1, realmValue.length());
authBuffer.append("realm=\"" + realmValue + "\",");
String MD5A1;
// 取得nonce的值
int nonceindex = auth.indexOf(MMConstants.NONCE);
equal = auth.indexOf("=", nonceindex + 1);
comma = auth.indexOf("\"", equal + 2);
String nonceValue = auth.substring(equal + 1, comma);
if (nonceValue.startsWith("\""))
nonceValue = nonceValue.substring(1, nonceValue.length());
authBuffer.append("nonce=\"" + nonceValue + "\",");
// 判断有没有opaque,若有,则原封不动地返回给服务器
int opaqueindex = auth.indexOf(MMConstants.OPAQUE);
if (opaqueindex > 0) {
equal = auth.indexOf("=", opaqueindex + 1);
comma = auth.indexOf("\"", equal + 2);
authBuffer.append("opaque=" + auth.substring(equal + 1, comma + 1));
}
// 取得algorithm的值
int algindex = auth.indexOf(MMConstants.ALGORITHM);
if (algindex > 0) {
equal = auth.indexOf("=", algindex);
comma = auth.indexOf(",", equal + 2);
if (comma >= 0) {
algValue = auth.substring(equal + 1, comma);
if (algValue.startsWith("\""))
algValue = algValue.substring(1, algValue.length() - 1);
}
else {
comma = auth.indexOf("/r", equal);
algValue = auth.substring(equal + 1, comma);
if (algValue.startsWith("\""))
algValue = algValue.substring(1, algValue.length());
}
}
else {
algValue = "MD5";
}
// 取得qop的值
int qopindex = auth.indexOf(MMConstants.QOP);
if (algValue.equals("MD5") || algValue.equals("MD5-sess")) {
MD5A1 = calcMD5(username + ":" + realmValue + ":" + passwd);
// 服务器存在qop这个字段
if (qopindex > 0) {
equal = auth.indexOf("=", qopindex);
comma = auth.indexOf("\"", equal + 2);
qopValue = auth.substring(equal + 1, comma);
if (qopValue.startsWith("\""))
qopValue = qopValue.substring(1, qopValue.length());
/**
* 表明服务器给出了两种qop,为auth和auth-int, 这是应该是客户端自己选择采用哪种方式进行鉴权
*/
if (qopValue.indexOf(",") > 0) {
if (mm7Config.getDigest().equals("auth-int")) {
MD5A2 = calcMD5("POST" + ":" + uri + ":" + calcMD5(entityBody.toString()));
}
else {
MD5A2 = calcMD5("POST" + ":" + uri);
}
ncValue = String.valueOf(pool.getNonceCount());
cnonceValue = getBASE64(ncValue);
responseValue = calcMD5(MD5A1 + ":" + nonceValue + ":" + ncValue + ":" + cnonceValue + ":"
+ qopValue + ":" + MD5A2);
authBuffer.append("qop=\"" + mm7Config.getDigest() + "\",");
authBuffer.append("nc=" + ncValue + ",");
authBuffer.append("cnonce=\"" + cnonceValue + "\",");
authBuffer.append("response=\"" + responseValue + "\",");
}
// 服务器端只有一种qop方式。
else {
if (qopValue.equals("auth-int")) {
MD5A2 = calcMD5("POST" + ":" + uri + ":" + calcMD5(entityBody.toString()));
}
else
MD5A2 = calcMD5("POST" + ":" + uri);
ncValue = String.valueOf(pool.getNonceCount());
cnonceValue = getBASE64(ncValue);
responseValue = calcMD5(MD5A1 + ":" + nonceValue + ":" + ncValue + ":" + cnonceValue + ":"
+ qopValue + ":" + MD5A2);
authBuffer.append("qop=\"" + qopValue + "\",");
authBuffer.append("nc=" + ncValue + ",");
authBuffer.append("cnonce=\"" + cnonceValue + "\",");
authBuffer.append("response=\"" + responseValue + "\",");
}
}
// 服务器端不存在对qop的方式的选择
else {
MD5A2 = calcMD5("POST" + ":" + uri);
responseValue = calcMD5(MD5A1 + ":" + nonceValue + ":" + MD5A2);
authBuffer.append("response=\"" + responseValue + "\",");
}
}
// 去掉最后一个逗号
int lastcommaindex = authBuffer.lastIndexOf(",");
authBuffer.delete(lastcommaindex, lastcommaindex + 1);
authBuffer.append("\r\n");
return authBuffer.toString();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -