【问题标题】:HTTP sending response to OPTIONS request [C]HTTP 向 OPTIONS 请求发送响应 [C]
【发布时间】:2011-04-28 10:36:29
【问题描述】:

接收 HTTP 响应时出现 Response is null 错误。
我正在使用行套接字在C 中开发一个示例小型 HTTP 服务器。

我的应用程序中实际上有 2 台服务器,其中一台是标准的 Apache 服务器,我用它来提供 HTML 页面,而我的小型服务器将只响应 HTML 页面中的 Javascript 发送的 XMLHttpRequest

我从 JavaScript 发送请求如下:

var sendReq = new XMLHttpRequest();
endReq.open("POST", "http://localhost:10000/", true);
sendReq.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
sendReq.onreadystatechange = handleResult;
var param = "REQUEST_TYPE=2002&userName=" + userName.value;
param += "&password=" + password.value;
sendReq.send(param);

当我发送此请求时,我的服务器代码中收到以下请求:

OPTIONS / HTTP/1.1
Host: localhost:10000
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://localhost:7777
Access-Control-Request-Method: POST

我已经使用socket write函数回复了这个请求:

HTTP/1.1 200 OK\n
Access-Control-Allow-Origin: *\n
Server: PSL/1.0 (Unix) (Ubuntu/Linux)\n
Access-Control-Allow-Methods: POST, GET, OPTIONS\n
Accept-Ranges: bytes\n
Content-Length: 438\nConnection: close\n
Content-Type: text/html; charset=UTF-8\n\n

我不知道根据 OPTIONS 请求发送的 HTTP 实际响应应该是什么。
在此之后,我收到了我从 JavaScript 发送的实际 POST 请求,然后我回复了

HTTP/1.1 200 OK\n\n

然后在浏览器端得到错误Response is null

那么如何使用“C”中的行套接字将标头/数据作为 HTTP 响应发送,以及如何响应 OPTIONS 请求。有人可以举一些例子来解释我吗?

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    很难理解您的问题,但我相信您指出这是给您带来麻烦的回答:

    HTTP/1.1 200 OK\n\n
    

    您应该包括其他字段,尤其是 Content-Length 和 Content-Type。如果您要构建自己的 HTTP 服务器,那么您应该查看protocol specifications

    也就是说,完全不清楚为什么需要替换 HTTP 服务器而不是使用 CGI 或其他服务器端语言(PHP、Java 等)。这会大大降低您的可移植性和可维护性。

    最后,您似乎在请求中传输密码。确保这仅通过某种加密 (HTTPS) 或物理安全连接完成。

    【讨论】:

      【解决方案2】:

      我不确定您在问什么,但您可能会发现以下内容很有用:

      HTTP Made Really Easy

      HTTP/1.1 rfc2616.txt

      MAMA - Opera Developer Community

      我在编写 HTTP 客户端时发现它们都非常有用。

      【讨论】:

        【解决方案3】:

        发生此问题是因为在我们的服务器处理 OPTIONS 请求后,出于某种原因,任何后续请求都需要回复“Access-Control-Allow-Origin: *" 以及其他正常的标头和响应正文。

        在我们的回复中提供此行后,我的 javascript 中总是得到所需的 responseText/responseXML。

        【讨论】:

          猜你喜欢
          • 2012-08-09
          • 2012-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-21
          • 2013-01-07
          相关资源
          最近更新 更多