#Garbled response / Gzip issue?

110 messages · Page 1 of 1 (latest)

loud fern
#

I've been having an issue I can't get to the bottom of, so finally asking here.

Context:

  • I have one Railway project, with several services: one frontend (NextJS, App Router, mainly SSR), one backend service (Django), a database (postgres)
  • Frontend tries to connect to the backend via private URL, and falls back to public URL if the initial connection fails (like when in client side, or during build)
  • Frontend calls various APIs, as you'd expect, APIs return JSON
  • There is no auth between services
  • The backend has django.middleware.gzip.GZipMiddleware and corsheaders.middleware.CorsMiddleware
  • The frontend has Cloudflare DNS, which I use to manage the domain
  • I'm using the new proxy

Issue:

  • I made a change to remove pagination in one of my APIs, and removed the associated pagination logic on the frontend
  • After deploy, I get the attached error from my frontend during build

Things I've tried:

  • Calling this API on the cmd line/postman works fine, and I get Content-Encoding = gzip in the response headers
  • Disabling GZipMiddleware in Django, get the same result
  • Mocking the response - returning hardcoded JSON - get same issue
  • When I make the hardcoded JSON smaller, it often works - this makes me think it's a Gzipping issue (which triggers when the response is >200 bytes)
  • Trying the legacy proxy - same result
  • Setting Accept-Encoding = gzip, deflate, br and Content-Type=application/json on the request in Next
  • Adding DEFAULT_RENDERER_CLASSES = rest_framework.renderers.JSONRenderer in Django
  • Praying

c18400df-5dee-4fe7-bc56-a98db8d475bd

scenic tulipBOT
#

Project ID: c18400df-5dee-4fe7-bc56-a98db8d475bd

loud fern
#

Additional:

Another API is called during build that returns an extremely small response (JSON with ~5 entries) and this works fine.

loud pasture
#

do you have an endpoint i could curl to reproduce this issue?

loud fern
#

curl -s -X GET 'https://share-a-podcast-be-prod.up.railway.app/test-new-endpoint/' | jq

loud pasture
#

is that supported to work?

loud fern
#

ha - yes - what are you seeing?

loud pasture
#

json

loud fern
#

yes

loud pasture
#

can i have an endpoint that reproduces the issue, im not sure what i should be doing with an enpoint that works fine

loud fern
#

yes... I mean that's the issue

The endpoint works fine, every time, when called in curl/postman.

But in build it gives the output I shared in the first post. This is what I can't understand.

loud pasture
#

during build of your FE?

loud fern
#

yep

#

are you able to see my build logs?

loud pasture
#

how is this url being called?

loud fern
#

one sec, getting the code

#

forgive the terrible loggin

loud pasture
#

did you say you have disabled GZIP on the BE and still got the same garbage response?

loud fern
#

yep - I thought the logs look like printed gzip

#

so I removed GZipMiddleware, same issue

loud pasture
#

is GZIP currently disabled (removed)?

loud fern
#

no i renabled but can disable it again

loud pasture
#

lets leave it for now

#

just trying to parse through these logs

loud fern
#

good luck

#

LMK if I can help

loud pasture
#

i dont see content-encoding = gzip anywhere in these FE build logs, does response.headers.entries() strip that out?

loud fern
#

take a look at the backend logs - I'm logging the headers on inbound requests:

loud pasture
#

right but content-encoding = gzip should be returned as a response header

loud fern
#

yeah agree it's not there

#

but why?

loud pasture
#
curl -I "https://share-a-podcast-be-prod.up.railway.app/test-new-endpoint/"
HTTP/1.1 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Cross-Origin-Opener-Policy: same-origin
Date: Wed, 11 Sep 2024 16:31:23 GMT
Referrer-Policy: same-origin
Server: railway-edge
Vary: Accept-Encoding, origin, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Railway-Request-Id: nmUVBEMHRwKJVioSmvMM1Q_2020806880

misbehaving middleware?

but you said it was the same with the middleware removed?

loud pasture
#

either way, can you disable / remove the gzip middleware for now?

loud fern
#

dude sorry, back at keys

#

disabling now

loud pasture
#

for context, curl was showing that it got the gzip response header -

C:\Users\Brody>curl --location -I "https://share-a-podcast-be-prod.up.railway.app/test-new-endpoint/" --header "Accept-Encoding: gzip, deflate, br" --header "Content-Type: application/json"
HTTP/1.1 200 OK
Allow: GET, HEAD, OPTIONS
Content-Encoding: gzip
Content-Length: 826
Content-Type: application/json
Cross-Origin-Opener-Policy: same-origin
Date: Wed, 11 Sep 2024 16:40:05 GMT
Referrer-Policy: same-origin
Server: railway-edge
Vary: Accept-Encoding, origin, Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Railway-Request-Id: 1bO2oXJ6Sn-rCTujPm4rCw_882434190
loud fern
#

this is what led me to think it might be something to do with the proxy

#

communicating with the end point directly works

loud pasture
#

the proxy doesnt touch any of these headers afaik

loud fern
#

aware this is now solved, but wondering if related?

loud pasture
loud fern
#

btw, I noticed that when I deploy the backend, I have to commit/push to force a rebuild on my frontend, rather than just trigging a deploy from last commit

loud pasture
loud pasture
loud fern
loud fern
loud pasture
loud fern
#

backend is deployed

#

frontend deploying now with deploy from last commit

loud pasture
#

i can confirm with postman the BE response is no longer gzipped, no encoding header and resonse body is larger

loud fern
#

agreed, see the same

loud pasture
#

interesting

loud fern
#

ok - frontend built correctly with trigger last commit

#

but same issue

loud pasture
#

lets use the private domain then

loud fern
#

in build?

loud pasture
loud fern
#

oooh

#

have you just opted me in

#

fine if you have

loud pasture
#

yeah, just trying to move fast here, i will ask next time

loud fern
#

no don't worry, just wonderd

#

didn't remember doing it and I've been battling this for 1.5 days... starting to forget what life was like before this bug

#

I think it's worked

#

either way - being able to use private urls in build is a win

#

shall I renable gzip on the BE?

loud pasture
#

oh, it worked...

#

i was kinda hoping it wouldnt

loud fern
#

yeah, as is we haven't learnt anything

loud pasture
#

exactly

loud fern
#

just that the new builder works for some reason

#

enabling gzip

loud pasture
#

hold on

#

not yet please

loud fern
#

oops

#

aborted the build

loud pasture
#

oh wait, this is a production site, can you afford to keep this offline as we debug?

loud fern
#

yes

#

all my user will be ok with it

loud pasture
#

are you sure? we could spin up a dev env in railway

loud fern
#

yes don't worry

loud pasture
#

alright, sounds good, but yeah lets keep gzip off for now, it eliminates variables

loud fern
#

anything I can do to help debug?

#

I would like to remove the hard-coded response, and replace with DB query

#

ok for me to try?

#

I'll leave gzip off

loud pasture
#

yeah thats fine

loud fern
#

that's deployed

#

redeploying FE

loud pasture
#

well my fridge doesn't cool anymore, I gotta go AFK while I transfer everything to another fridge outside

loud fern
#

good luck

#

I'm going to try renabling gzip while you're fridging

#

FYI database connection worked

loud pasture
#

they didn't before?

loud fern
#

ah, it was just one of many things I've been trying to debug the issue - hardcoding the json response in my backend

#

was looking for special characters/fixing the size of the repsonse, etc

#

gzip works

loud pasture
#

okay I have some more things I'd like to try when I'm back

loud fern
#

where are we on the fridge outage, Brody? P1? Users affected? Is there an incident channel we should join?

loud pasture
#

there's an incident? I thought we left off in a working state with the new builder?

loud fern
#

was a joke about your fridge, ignore

#

anyway, new builder working - I'm back to coding, thanks for your help

loud pasture
#

oh I thought you were serious 😅

loud fern
#

rarely

loud pasture
#

I thought you were like, screw your fridge, help me with this gzip stuff

loud fern
#

haha

#

would never priotise work above food

loud pasture
#

I'll be back at the computer as soon as I finish eating and moving the food to the other fridge