firebase / firebase-functions

Firebase SDK for Cloud Functions
https://firebase.google.com/docs/functions/
MIT License
1.03k stars 204 forks source link

Gen2: Encoding issue with special characters in path parameters #1459

Open Llolow opened 1 year ago

Llolow commented 1 year ago

Version info

node: v18.16.0 firebase-functions: v4.4.1 firebase-tools: v12.5.2 firebase-admin: v11.8.0

Steps to reproduce

This issue was not encountered in gen1, and special characters in path parameters were correctly encoded.

Expected behavior

The planeteId value should be correctly encoded and displayed in UTF-8, preserving special characters such as "é", "è", "à", etc., in the deployed Firebase Cloud Function Gen2.

Actual behavior

After deploying the Firebase Cloud Function Gen2, the planeteId value appears to be incorrectly encoded, resulting in a value like Helvétios becoming Helvétios or Électre becoming Électre.

Were you able to successfully deploy your functions?

Yes, the deployment was successful without any error messages.

google-oss-bot commented 1 year ago

I found a few problems with this issue:

taeold commented 1 year ago

Hi @Llolow. I don't have a solution yet, but I wanted to share an update.

It looks like the issue you've found goes beyond Cloud Functions for Firebase, and I'm in conversations with other teams at GCP to find the underlying issue. Thanks for your patience.

Llolow commented 1 year ago

Hello @taeold, thanks for the answer.

I will use for the moment the fact than gen1 and gen2 functions can coexist

taeold commented 1 year ago

@Llolow Sorry for not responding sooner.

I've learned since then that event.document will contains that's formatted as octal-encoded UTF-8 string. To retrieve the "actual" document path, then, you can convert the bytes as utf-8 string:

const planetId = Buffer.from(event.params.planeteId, "binary").toString("utf-8")

I would agree with you to think that this is pretty tricky. Let me try and see if we can come up with a way to do the conversion in the SDK itself so you don't have to bother with these kind of problems.

mortenbekditlevsen commented 11 months ago

Hi @taeold , We were just hit by this too. It's definitely a regression when migrating from v1 to v2, and it ought to be noted in the migration document that you can no longer rely on the 'params' when using special characters (even non-ascii ansi characters like Å). If we add a workaround like the above - how will that effect a possible future fix? Will the workaround then break?

Also: I definitely don't consider this to be a feature request, but a serious bug that affects real-life usage of Cloud Functions v2.

mortenbekditlevsen commented 11 months ago

Hi again @taeold , In my own testing, the workaround you suggest can be 'dangerous' in case the underlying issue is suddenly fixed:

Taking the string "SDÅV" as an example: Suggested workaround:

d = Buffer.from("SDÅV", "binary").toString("utf-8") 'SDÅV'

Application of the suggested workaround in case the parameter is already in utf-8:

e = Buffer.from("SDÅV", "binary").toString("utf-8") 'SD�V'

adamxi commented 6 months ago

Hey, this is an issue for us as well.

If the document id in event.params doesn't 100% match that of the actual firestore document, then this must surely be a bug in the SDK?

albertopq commented 2 months ago

Same issue here. Definitely a bug if v1 and v2 behave differently.