缺省的错误回答如下,应该可以更精简,这里列出了所有已知的可能性,如果客户端是自己的,其实没有这个必要.
//--------------------------------------------------
//其他的 iq 回应错误就可以了
//http://wiki.jabbercn.org/RFC3920#IQ.E8.AF.AD.E4.B9.89.E5.AD.A6
//<error type='modify'>
//<feature-not-implemented/> -- 请求的特性未被接收者或服务器实现所以不能处理;相关的错误类型应该(SHOULD)是"cancel".
//<service-unavailable/> -- 服务器或接收者目前无法提供被请求的服务;相关错误类型应该(SHOULD)是"cancel".
//错误 error //还是应该返回没有实现?
//id := get_value1(sLine, 'id=', ' '); //一定要取对
//xmlns := get_value1(sLine, 'xmlns="', '"'); //一定要取对
//if Trim(xmlns) = '' then
//xmlns := get_value1(sLine, 'xmlns=''', ''''); //一定要取对
//http://iluoxuan.iteye.com/blog/1736252
res :=
//<iq to='jane@longbourn.lit/garden'
//type='error'
"<iq type=\"error\"" +
// " from=\"" + GetXmppHost(t_user) + "\"" +
//" to=\"t2@127.0.0.1/Spark\"" +
" to=\"" + t_jid + "\"" +
" id=\"" +id+ "\"" + //id 一定要和原来的一样
">" +
////+'<query xmlns="jabber:iq:roster"/>' //不能放这个,这个会让 spark 重连接
//"<query xmlns=\"" + xmlns + "\"/>" + //对于某些版本的 spark 似乎一定要正确的给回这个
"<error type=\"cancel\">" +
//"<error code='405' type=\"cancel\">" +
// "<query xmlns=\"" + xmlns + "\"/>" + //对于某些版本的 spark 似乎一定要正确的给回这个
// "<error code='503' type=\"cancel\">" + //clq 2018
"<service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>" +
//xmlns 为 bookmark 时,对于 spark 来说,只能是 service-unavailable, feature-not-implemented 是不行的
// "<feature-not-implemented xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>" + //xmlns 一定要有,否则 spark 不认//并且固定是这个
//"<feature-not-implemented xmlns=\"" + xmlns + "\"/>" + //xmlns 一定要有,否则 spark 不认//错误的时候反而不能用原来的 xmlns
//<not-allowed xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/> //这个也没用 spark 就是会卡
"</error>" +
"</iq>"
;
//http://wiki.jabbercn.org/XEP-0030
//如果隐私和安全事项或策略阻止服务器或其他授权实体返回<item-not-found/>错误,取而代之它 应该 返回一个<service-unavailable/>错误:
//
//例4. 服务不可用
//
//<iq type='error'
// from='plays.shakespeare.lit'
// to='romeo@montague.net/orchard'
// id='info1'>
// <query xmlns='http://jabber.org/protocol/disco#info'/>
// <error code='503' type='cancel'>
// <service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
// </error>
//</iq>
//SendCmd(res);
//Exit;
//Continue;//退出也可以,因为还没应答
SendCmd_xmpp(r, w, res);
bRead = false; //如果能读取到完整命令,那暂时还不需要再读取//这是和 delphi 版本不同的地方,一定要在每个命令成功后添加
continue;
}//if <iq