【问题标题】:HTTP Bad Request with openfire MUC service带有 openfire MUC 服务的 HTTP 错误请求
【发布时间】:2014-07-18 07:37:56
【问题描述】:

这是我的代码

$xml_data ='<chatRoom>
        <broadcastPresenceRoles>
            <broadcastPresenceRole>moderator</broadcastPresenceRole>
            <broadcastPresenceRole>participant</broadcastPresenceRole>
            <broadcastPresenceRole>visitor</broadcastPresenceRole>
    </broadcastPresenceRoles>
    <canAnyoneDiscoverJID>false</canAnyoneDiscoverJID>
    <canChangeNickname>false</canChangeNickname>
    <canOccupantsChangeSubject>false</canOccupantsChangeSubject>
    <canOccupantsInvite>false</canOccupantsInvite>
    <creationDate>2014-02-12T15:52:37.592+01:00</creationDate>
    <description>Global Chat Room</description>
    <logEnabled>true</logEnabled>
    <loginRestrictedToNickname>false</loginRestrictedToNickname>
    <maxUsers>30</maxUsers>
    <membersOnly>false</membersOnly>
    <moderated>false</moderated>
    <naturalName>global-1</naturalName>
    <owners>
        <owner>admin@localhost</owner>
    </owners>
    <password>test</password>
    <persistent>true</persistent>
    <publicRoom>true</publicRoom>
    <registrationEnabled>false</registrationEnabled>
    <roomName>global</roomName>
</chatRoom>';

 $opts = array('http' =>
         array(
           'method'  => 'POST',
           'header'  => "Content-Type: text/xml",//\r\n".
           "Authorization: Basic ".base64_encode("admin:admin"),//."\r\n",
           'timeout' => 60
          )
     );

 `$URL = 'http://localhost:9090/plugins/mucservice/chatrooms'`;

        $ch = curl_init($URL);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml', "Authorization: Basic ".base64_encode("admin:admin")."\r\n"));
        curl_setopt($ch, CURLOPT_POSTFIELDS, "$xml_data");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $output = curl_exec($ch);

        echo 'Code : '.$code;
        print_r($output);           
        curl_close($ch);

使用此代码,我正在向 openfire muc 插件发送带有 xml 数据和授权标头的 post 请求,因为此自述文件建议我这样做 [https://www.igniterealtime.org/projects/openfire/plugins/mucservice/readme.html] .. 它说错误请求 400。

Openfire 日志是

            2014.07.18 11:04:26 org.jivesoftware.openfire.container.PluginServlet - 14 
        java.lang.ArrayIndexOutOfBoundsException: 14 
        at javax.xml.bind.DatatypeConverterImpl._parseBase64Binary(Unknown Source) 
        at javax.xml.bind.DatatypeConverterImpl.parseBase64Binary(Unknown Source) 
        at javax.xml.bind.DatatypeConverter.parseBase64Binary(Unknown Source) 
        at org.jivesoftware.openfire.plugin.servlet.BasicAuth.decode(BasicAuth.java:18) 
        at org.jivesoftware.openfire.plugin.servlet.AuthFilter.filter(AuthFilter.java:39) 
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1527) 
        at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473) 
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419) 
        at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) 
        at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409) 
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540) 
        at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715) 
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
        at org.jivesoftware.openfire.container.PluginServlet.handleServlet(PluginServlet.java:316) 
        at org.jivesoftware.openfire.container.PluginServlet.service(PluginServlet.java:111) 
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547) 
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1359) 
        at org.jivesoftware.admin.PluginFilter.doFilter(PluginFilter.java:78) 
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330) 
        at org.jivesoftware.admin.AuthCheckFilter.doFilter(AuthCheckFilter.java:164) 
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330) 
        at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118) 
        at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52) 
        at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1330) 
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:478) 
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119) 
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520) 
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:227) 
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941) 
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409) 
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186) 
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875) 
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117) 
        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250) 
        at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149) 
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110) 
        at org.eclipse.jetty.server.Server.handle(Server.java:349) 
        at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441) 
        at org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919) 
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582) 
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218) 
        at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51) 
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586) 
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44) 
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598) 
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533) 
        at java.lang.Thread.run(Unknown Source

我被这件事困扰很久了..请帮助我..

提前谢谢..

【问题讨论】:

  • 我已经在我的问题中发布了 openfire 日志。如果此日志可以解决任何问题,请帮助我。
  • 看起来它无法解码您的基本授权标头 - 朝那个方向挖掘
  • 它在另一个 GET 请求和内容类型中使用相同的身份验证标头:text/xml .. 那么我应该如何进一步进行?
  • 我建议使用 xmpp 客户端库之一 - 它会为您处理所有低级时刻
  • 我正在尝试在 openfire 中创建空间 .. php 的 xmpp 库不提供创建空间的帮助 :( 如果我弄错了请告诉我

标签: http openfire bad-request


【解决方案1】:

您需要将内容类型设置为“内容类型:应用程序/xml”而不是“内容类型:文本/xml”。 Content Type : text/xml 如果你 GET 某些东西可以工作,但是通过 PUT 和 POST 你需要设置“Content-Type: application/xml”。

另一个可能的问题是以下行:

 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml', "Authorization: Basic ".base64_encode("admin:admin")."\r\n"));

尝试将其更改为:

 curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml', 'Authorization: Basic '.base64_encode("admin:admin")));

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多