Title: Redirecting from socket hangs with large data · Issue #2323 · nodejs/node · GitHub
Open Graph Title: Redirecting from socket hangs with large data · Issue #2323 · nodejs/node
X Title: Redirecting from socket hangs with large data · Issue #2323 · nodejs/node
Description: I also posted this to nodejs bug tracker (nodejs/node-v0.x-archive#25823), but the issue is also present in iojs 3.0.0 so it felt appropriate to report it here as well I've been spending lots of time tracking this down for multer, and fo...
Open Graph Description: I also posted this to nodejs bug tracker (nodejs/node-v0.x-archive#25823), but the issue is also present in iojs 3.0.0 so it felt appropriate to report it here as well I've been spending lots of ti...
X Description: I also posted this to nodejs bug tracker (nodejs/node-v0.x-archive#25823), but the issue is also present in iojs 3.0.0 so it felt appropriate to report it here as well I've been spending lots o...
Opengraph URL: https://github.com/nodejs/node/issues/2323
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Redirecting from socket hangs with large data","articleBody":"_I also posted this to nodejs bug tracker (joyent/node#25823), but the issue is also present in iojs 3.0.0 so it felt appropriate to report it here as well_\n\nI've been spending lots of time tracking this down for [multer](https://github.com/expressjs/multer), and form-data/multipart file uploader for express. Basically what we want to do is; whenever there is an error 1) `unpipe` the request 2) `.resume()` the request so that the browser will consider the request done.\n\nThis is implemented something like the code below. `req` is an http request from a browser.\n\n``` javascript\nfunction abort (err) {\n req.unpipe(parser)\n req.resume()\n next(err)\n}\n```\n\nIt has been working great, most of the times. It seems like there is a problem when the stream contains too much data. For some reason it just doesn't emit any more `data` events, and the browser is stuck on `uploading (xx%)`.\n\nI've managed to track this down and have a small test-case that is easily replicated. The problem goes all the way down to `net.Socket`.\n\nCalling `req.resume` after `socket.pipe(out2)` doesn't help.\n\nIf the size of each buffer (`560000`) is lowered it starts working. The break point on my machine is at 16 KiB, a.k.a `1024 * 16` doesn't work, but `1024 * 16 - 1` works.\n### The test case\n\n``` javascript\nvar net = require('net')\nvar stream = require('stream')\n\nvar port = 5433\nvar app = net.createServer()\n\nfunction logStream (name) {\n var out = new stream.Writable()\n\n out._write = function (chunk, encoding, cb) {\n console.log('[server][' + name + '] received chunk of data')\n this.emit('chunk-received')\n cb(null)\n }\n\n return out\n}\n\napp.on('connection', function (socket) {\n var out1 = logStream('out 1')\n var out2 = logStream('out 2')\n\n out1.once('chunk-received', function redirect () {\n console.log('[server] redirecting to `out 2`')\n socket.unpipe(out1)\n socket.pipe(out2)\n })\n\n socket.pipe(out1)\n})\n\napp.listen(port, function () {\n var socket = new net.Socket({ allowHalfOpen: true })\n\n socket.connect(port, function () {\n setInterval(function () {\n socket.write(new Buffer(560000))\n }, 100)\n })\n})\n```\n### Actual output\n\n``` text\n[server][out 1] received chunk of data\n[server] redirecting to `out 2`\n```\n### Expected output\n\n``` text\n[server][out 1] received chunk of data\n[server] redirecting to `out 2`\n[server][out 2] received chunk of data\n[server][out 2] received chunk of data\n[server][out 2] received chunk of data\n[server][out 2] received chunk of data\n[server][out 2] received chunk of data\n[server][out 2] received chunk of data\n...\n```\n","author":{"url":"https://github.com/LinusU","@type":"Person","name":"LinusU"},"datePublished":"2015-08-07T12:01:22.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":8},"url":"https://github.com/2323/node/issues/2323"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:8dd07e7e-588f-89af-b1b0-2c56736581c1 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 933C:3092B8:E596E1:EAA525:6A4DC238 |
| html-safe-nonce | bbad58a572a7c14764b9d35906506e969ab10d53a131bce2c6200a3bc933a53f |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5MzNDOjMwOTJCODpFNTk2RTE6RUFBNTI1OjZBNERDMjM4IiwidmlzaXRvcl9pZCI6IjQ0MDkxMzMxODA2ODgxMjI0MjUiLCJyZWdpb25fZWRnZSI6InNlYSIsInJlZ2lvbl9yZW5kZXIiOiJzZWEifQ== |
| visitor-hmac | 13212e889fe11f19f60aca145764b19fb2beda1b6ed1d0bdd17828bbc69897f1 |
| hovercard-subject-tag | issue:99635368 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/nodejs/node/2323/issue_layout |
| twitter:image | https://opengraph.githubassets.com/dc1e11282bc30dfa3ed8c543b18a68b271b549b425306448df496b9a8f19c26c/nodejs/node/issues/2323 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/dc1e11282bc30dfa3ed8c543b18a68b271b549b425306448df496b9a8f19c26c/nodejs/node/issues/2323 |
| og:image:alt | I also posted this to nodejs bug tracker (nodejs/node-v0.x-archive#25823), but the issue is also present in iojs 3.0.0 so it felt appropriate to report it here as well I've been spending lots of ti... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | LinusU |
| hostname | github.com |
| expected-hostname | github.com |
| None | 06b8a6144231bf3a234f1c2e9993861e07ce98a905912b114aa386c2d7e84b33 |
| turbo-cache-control | no-preview |
| go-import | github.com/nodejs/node git https://github.com/nodejs/node.git |
| octolytics-dimension-user_id | 9950313 |
| octolytics-dimension-user_login | nodejs |
| octolytics-dimension-repository_id | 27193779 |
| octolytics-dimension-repository_nwo | nodejs/node |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 27193779 |
| octolytics-dimension-repository_network_root_nwo | nodejs/node |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 1d344bdb7547fe6bca17a59bb2b8aac3dc9532a0 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width