HttpResponseStream doesn't work when `end`ing the stream without a `write`
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 3/5
- Tempo estimado
- 1-2 dias
- Facilidade para iniciantes
- 38/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Estagnada
- Stack de tecnologia
- aws, node.js, typescript
Direção de pesquisa
Comece lendo src/HttpResponseStream.js, especialmente o tratamento de onBeforeFirstWrite, e depois rastreie o caminho de finalização de Node ClientRequest descrito na issue. Reproduza tanto o caso responseStream.end("Not Found") quanto o caso responseStream.end() e verifique se o código de status personalizado e os headers são aplicados em ambos os casos.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
When using HttpResponseStream to set the status code and headers on a streaming response, I noticed that if I never call write on the stream, the custom status code and headers don't work.
Example repro:
export const handler = awslambda.streamifyResponse(
async (event, responseStream, context) => {
const metadata = {
statusCode: 404,
headers: { "Content-Type": "text/plain", "X-Foo": "Bar" }
};
responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
// This will cause a 502 with no custom response headers:
responseStream.end("Not Found");
// This will cause a 200 with no custom response headers:
responseStream.end();
}
);
I believe this is because HttpResponseStream relies on the onBeforeFirstWrite callback:
onBeforeFirstWrite is implemented by overriding http.ClientRequest stream's write:
// https://github.com/aws/aws-lambda-base-images/tree/nodejs18.x -> /var/runtime/index.mjs
req.write = function(chunk, encoding, callback) {
vvverbose("ResponseStream::write", chunk.length, "callback:", typeof callback);
if (typeof chunk !== "string" && !Buffer.isBuffer(chunk) && chunk?.constructor !== Uint8Array) {
chunk = JSON.stringify(chunk);
}
if (status === STATUS_READY && typeof this._onBeforeFirstWrite === "function") {
this._onBeforeFirstWrite((ch) => origWrite(ch));
}
const ret = origWrite(chunk, encoding, callback);
// [snip]
But turns out Node's ClientRequest doesn't call write when ending the stream with a final chunk of data, it calls an internal write_ instead:
I guess this could also be considered a Node bug, because their documentation for ClientRequest.end says:
If
datais specified, it is equivalent to callingrequest.write(data, encoding)followed byrequest.end(callback).
But even if it did implement that contract correctly, there's still the case of ending the stream with no data, i.e., responseStream.end().
- Linguagem predominante
- TypeScript
- Estrelas
- 224
- Forks
- 60
- Merge médio
- 26min
- PRs com merge (30d)
- 2
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de aws/aws-lambda-nodejs-runtime-interface-client
-
Dificuldade 5/5 Mais de uma semana Facilidade para iniciantes 20/100
aws/aws-lambda-nodejs-runtime-interface-client#198 · 3 comentários · 6 reações ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
aws/aws-lambda-nodejs-runtime-interface-client#195 · 12 reações ·
-
bug
aws/aws-lambda-nodejs-runtime-interface-client#170 · 15 comentários · 6 reações · 1 responsável ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 38/100
aws/aws-lambda-nodejs-runtime-interface-client#159 · 2 reações ·
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 42/100
aws/aws-lambda-nodejs-runtime-interface-client#145 · 1 comentário · 6 reações ·
Todas as issues de aws/aws-lambda-nodejs-runtime-interface-client
Issues semelhantes
-
Browser Waiting for: Product Owner
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 85/100
getsentry/sentry-javascript#24577 · 1 comentário ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
agilepathway/label-checker#640 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
copse-dev/agent-pane#2953 ·
-
[aw] Upgrade available Abertaagentic-workflows
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 85/100
githubnext/rig#534 ·
-
automation missing-model model-sync provider:pioneer
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
anomalyco/models.dev#7701 ·