Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for parsing Content-Type with non-UTF-8 charset directive #95

Open
chalkpe opened this issue Apr 8, 2022 · 1 comment
Open
Labels
feature New functionality or improvement

Comments

@chalkpe
Copy link

chalkpe commented Apr 8, 2022

Support plan

  • is this issue currently blocking your project? (yes/no): yes
  • is this issue affecting a production system? (yes/no): no

Context

  • node version: 17.9.0
  • module version: 7.0.3
  • environment (e.g. node, browser, native): node
  • used with (e.g. hapi application, another framework, standalone, ...): hapi application
  • any other relevant information:

What problem are you trying to solve?

Parser doesn't do anything with Content-Type header with charset directive. It only parses payload buffer by utf8, hardcoded. Only way to process non-UTF-8 payload is disable internal parser via route.options.payload.parse: false and decode raw buffer manually, losing all benefits from hapi framework.

import { Server } from '@hapi/hapi'
import { encode } from 'iconv-lite'

async function test(text, charset = 'euc-kr') {
  const server = new Server({})
  server.route({
    method: 'POST',
    path: '/',
    options: { handler: (req) => req.payload }
  })

  await server.start()
  const { payload } = await server.inject({
    method: 'POST',
    url: '/',
    payload: encode(text, charset),
    headers: { 'content-type': `application/json; charset=${charset}` }
  })

  await server.stop()
  return { expected: text, got: payload }
}

test('{"한글":"인코딩"}').then(console.log).catch(console.error)
// { expected: '{"한글":"인코딩"}', got '{"�ѱ�":"���ڵ�"}' }

Do you have a new or modified API suggestion to solve the problem?

  • Add support for payload decoding with charset directive, or create an option for custom payload decoder.
  • Current behaviour of internals.object is ignoring charset part of Content-Type header and stick with stringify payload buffer by utf8 encoding (text, json, form)
@chalkpe chalkpe added the feature New functionality or improvement label Apr 8, 2022
@kanongil
Copy link
Contributor

kanongil commented Apr 8, 2022

This sounds like a very sensible request, especially since you sometime can't control what charsets are used to upload text.

I would probably limit it to 'utf8' by default, but allow other charsets through a boolean option, and possibly an allow list.

FYI, this will also require @hapi/content to be updated, to actually parse and return the charset parameter.

I don't know if there is anyone that are available to implement such a feature. But I would be happy to review a PR from you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature New functionality or improvement
Projects
None yet
Development

No branches or pull requests

2 participants