NodeJS - Wie stream beantragen Körper, ohne Pufferung

In dem code unten kann ich nicht herausfinden, warum req.Rohr(res) nicht funktioniert, und noch nicht einen Fehler auslösen, entweder. Eine Ahnung sagt mir, es ist wegen nodejs' asynch Verhalten, aber dies ist ein sehr einfacher Fall, ohne einen Rückruf.

Was bin ich?

http.createServer(function (req, res) {

  res.writeHead(200, { 'Content-Type': 'text/plain' });

  res.write('Echo service: \nUrl:  ' + req.url);
  res.write('\nHeaders:\n' + JSON.stringify(req.headers, true, 2));

  res.write('\nBody:\n'); 

  req.pipe(res); //does not work

  res.end();

}).listen(8000);

Hier ist die LOCKE:

  ldap-auth-gateway git:(master)  curl -v -X POST --data "test.payload" --header "Cookie:  token=12345678" --header "Content-Type:text/plain" localhost:9002 

Hier ist die debug-Ausgabe (sehen, dass Körper hochgeladen wurde):

  About to connect() to localhost port 9002 (#0)
  Trying 127.0.0.1...
    connected
    Connected to localhost (127.0.0.1) port 9002 (#0)
  POST / HTTP/1.1
  User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5
  Host: localhost:9002
  Accept: */*
  Cookie:  token=12345678
  Content-Type:text/plain
  Content-Length: 243360
  Expect: 100-continue

  HTTP/1.1 100 Continue
  HTTP/1.1 200 OK
  Content-Type: text/plain
  Date: Sun, 04 Aug 2013 17:12:39 GMT
  Connection: keep-alive
  Transfer-Encoding: chunked

Und der service antwortet, ohne echo der request-body:

Echo service: 
Url:  /
Headers:
{
  "user-agent": "curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8x zlib/1.2.5",
  "host": "localhost:9002",
  "accept": "*/*",
  "cookie": "token=12345678",
  "content-type": "text/plain",
  "content-length": "243360",
  "expect": "100-continue"
}

... und der Letzte curl debug ist

Body:
 Connection #0 to host localhost left intact
 Closing connection #0

Außerdem, wenn ich stress test mit der großen bitte Körper, ich erhalte eine Fehler EPIPE. Wie kann ich diese vermeiden?

-- EDIT: Durch Versuch und Irrtum habe ich diese zu arbeiten, und es immer noch Punkte, um ein timing-Problem. Aber es ist trotzdem seltsam, da der timeout bewirkt, dass die Nutzlast zurückgegeben werden, aber die timeout-Dauer nicht gemerkt. In anderen Worten, ob ich den timeout auf 5 Sekunden oder 500 Sekunden, die Nutzlast ordnungsgemäß geleitet wieder auf den Antrag und die Verbindung ist beendet.

Hier der edit:

http.createServer(function (req, res) {

    try {
      res.writeHead(200, { 'Content-Type': 'text/plain' });
      res.write('Echo service: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
      res.write('\nBody:"\n');
      req.pipe(res);
    } catch(ex) {
      console.log(ex);
      //how to change response code to error here?  since headers have already been written?
    } finally {
      setTimeout((function() {
        res.end();
      }), 500000);
    }

}).listen(TARGET_SERVER.port);

?

  • Hinweis: Sie werden sehen, dass eine Anforderung vorgenommen wird, um 9002. Dies ist ein reverse-proxy (einfach Knoten-http-proxy zu 8000, das Ziel). Das Ziel zu treffen direkt ergibt die gleichen Ergebnisse.
Schreibe einen Kommentar