1

StreamSocket 経由で HTTP リクエストを送信しようとしていますが、レスポンスが次のように切り捨てられます

「failedWinRTError: オブジェクトは閉じられました。」


これが私のコードです:

  var count, hostName, raw_request, raw_response, reader, socketProtection, startReader, streamSocket, writer;
  streamSocket = new Windows.Networking.Sockets.StreamSocket();

  hostName = new Windows.Networking.HostName("www.reddit.com", "80");

  raw_response = "";

  count = 0;

  startReader = function() {
    return reader.loadAsync(8 * 1000).done(function(bytesRead) {

      raw_response += reader.readString(reader.unconsumedBufferLength);
      if (raw_response.indexOf("</html>") > 0) {
        return;
      } else {
        startReader();
      }
    }, function(error) {

      raw_response += reader.readString(reader.unconsumedBufferLength);
      window.raw_response = raw_response;
      return;
    });
  };

  streamSocket.connectAsync(hostName, "80", 0).done(function(response) {
    var string;

    reader = new Windows.Storage.Streams.DataReader(streamSocket.inputStream);
    reader.inputStreamOptions = 1;

    writer = new Windows.Storage.Streams.DataWriter(streamSocket.outputStream);
    string = "Hello world";
    writer.writeString(raw_request);
    return writer.storeAsync().done(function() {
      writer.flushAsync();
      writer.detachStream();
      return startReader();
    });
  });

応答の先頭も切り捨てられていることに気付きました。

これは、HTTP 応答の最初に得られるものです。

/1.1 200 OK

また奇妙なことに... HTTPS リクエストは完全に機能します。


私が間違っていることは何か分かりますか?ありがとう :)

4

1 に答える 1

2

ホスト名からhttp://を削除すると、2 番目のパラメーターは不要になります。

var hostName = new Windows.Networking.HostName("www.reddit.com");

ConnectAsyncでこのオブジェクトを使用します。ホスト名とサービス名のパラメーターのみが必要です。

streamSocket.connectAsync(hostName, "80").done(function (response) {
    // ....
}, function (error) {
    console.log(error);
});

更新:わかりました。接続が閉じられている場合は、おそらくサーバーが閉じています。適切な形式のリクエストを送信していますか? 次に例を示します。

var raw_request, raw_response, reader, writer;
var streamSocket = new Windows.Networking.Sockets.StreamSocket();

function doRequest() {
    var hostName = new Windows.Networking.HostName("www.reddit.com");
    streamSocket.connectAsync(hostName, "808").then(function () {
        reader = new Windows.Storage.Streams.DataReader(streamSocket.inputStream);
        reader.inputStreamOptions = Windows.Storage.Streams.InputStreamOptions.partial;
        writer = new Windows.Storage.Streams.DataWriter(streamSocket.outputStream);

        raw_request = "GET / HTTP/1.1\r\nHost: www.reddit.com/\r\nConnection: close\r\n\r\n";
        writer.writeString(raw_request);
        return writer.storeAsync();
    }).then(function () {
        raw_response = "";
        return startReader();
    }, function (error) {
        console.log(error);
    });
}

function startReader() {
    return reader.loadAsync(99999999).then(function (bytesRead) {
        raw_response += reader.readString(reader.unconsumedBufferLength);
        if (bytesRead === 0) {
            window.raw_response.value = raw_response;
            return;
        }
        return startReader();
    });
};
于 2013-01-20T20:38:03.423 に答える