Search code examples
httphttp-headershttpresponsehttp-error

Write HTTP trailer headers manually


This question was motivated by the answers here: What to do with errors when streaming the body of an Http request

In this case, I have already written a HTTP 200 OK header, then I need to amend this if there is an error, by writing a trail header that says there was an error after writing a success header.

I have this Node.js code:

const writeResponse = function(file: string, socket: Socket){

   socket.write([
    'HTTP/1.1 200 OK',
    'Content-Type: text/javascript; charset=UTF-8',
    'Content-Encoding: UTF-8',
    'Accept-Ranges: bytes',
    'Connection: keep-alive',
   ].join('\n') + '\n\n');
        
  getStream(file)
    .pipe(socket)  
    .once('error', function (e: any) {

        // there was an error
        // how can I write trail headers here ?

        s.write('some bad shit happened\n')

    });

}

how do I write a useful trail header to the response that can be displayed well by the browser?

I think this is the relevant spec for trail headers: https://www.rfc-editor.org/rfc/rfc2616#section-14.40

I think they should be called "trailing headers", but whatever.


Solution

  • Firstly:

    I think this is the relevant spec for trail headers: https://www.rfc-editor.org/rfc/rfc2616#section-14.40

    RFC 2616 has been obsoleted by RFC 7230. The current spec for trailers is RFC 7230 § 4.1.2.

    Secondly:

    ].join('\n') + '\n\n'

    Lines in HTTP message framing are terminated with \r\n, not \n.

    Thirdly:

    Content-Encoding: UTF-8

    Content-Encoding is for content codings (like gzip), not charsets (like UTF-8). You probably don’t need to indicate charset separately from Content-Type.

    And lastly:

    how do I write a useful trail header to the response that can be displayed well by the browser?

    You don’t. Mainstream Web browsers do not care about trailers.

    See also (by the same user?): How to write malformed HTTP response to “guarantee” something akin to HTTP 500