Garbled response / Gzip issue?
tony-hunter
HOBBYOP

a year ago

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

109 Replies

tony-hunter
HOBBYOP

a year ago

Additional:

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


a year ago

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


tony-hunter
HOBBYOP

a year ago

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


a year ago

is that supported to work?


tony-hunter
HOBBYOP

a year ago

ha - yes - what are you seeing?


a year ago

json


tony-hunter
HOBBYOP

a year ago

yes


a year ago

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


tony-hunter
HOBBYOP

a year ago

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.


a year ago

during build of your FE?


tony-hunter
HOBBYOP

a year ago

yep


tony-hunter
HOBBYOP

a year ago

are you able to see my build logs?


a year ago

how is this url being called?


tony-hunter
HOBBYOP

a year ago

one sec, getting the code


tony-hunter
HOBBYOP

a year ago


tony-hunter
HOBBYOP

a year ago

forgive the terrible loggin


a year ago

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


tony-hunter
HOBBYOP

a year ago

yep - I thought the logs look like printed gzip


tony-hunter
HOBBYOP

a year ago

so I removed GZipMiddleware, same issue


a year ago

is GZIP currently disabled (removed)?


tony-hunter
HOBBYOP

a year ago

no i renabled but can disable it again


a year ago

lets leave it for now


a year ago

just trying to parse through these logs


tony-hunter
HOBBYOP

a year ago

good luck


tony-hunter
HOBBYOP

a year ago

LMK if I can help


a year ago

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


tony-hunter
HOBBYOP

a year ago

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


a year ago

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


tony-hunter
HOBBYOP

a year ago

yeah agree it's not there


tony-hunter
HOBBYOP

a year ago

but why?


a year ago

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?


a year ago

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


tony-hunter
HOBBYOP

a year ago

dude sorry, back at keys


tony-hunter
HOBBYOP

a year ago

disabling now


a year ago

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

tony-hunter
HOBBYOP

a year ago

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


tony-hunter
HOBBYOP

a year ago

communicating with the end point directly works


a year ago

the proxy doesnt touch any of these headers afaik



tony-hunter
HOBBYOP

a year ago

aware this is now solved, but wondering if related?


a year ago

well besides the headers it does touch, you know what i mean lol


tony-hunter
HOBBYOP

a year ago

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


a year ago

Hello all, we have pushed a change to our proxy, we no longer strip out that header!


a year ago

what happens when you do deploy from last commit?


tony-hunter
HOBBYOP

a year ago

I know, but just wondering if could be a related thing?


tony-hunter
HOBBYOP

a year ago

I'll show you


a year ago

at this time, i dont think so


tony-hunter
HOBBYOP

a year ago

backend is deployed


tony-hunter
HOBBYOP

a year ago

frontend deploying now with deploy from last commit


a year ago

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


tony-hunter
HOBBYOP

a year ago

agreed, see the same


a year ago

interesting


tony-hunter
HOBBYOP

a year ago

ok - frontend built correctly with trigger last commit


tony-hunter
HOBBYOP

a year ago

but same issue


a year ago

lets use the private domain then


tony-hunter
HOBBYOP

a year ago

in build?


a year ago

yeah

1283472067676864500


tony-hunter
HOBBYOP

a year ago

oooh


tony-hunter
HOBBYOP

a year ago

have you just opted me in


tony-hunter
HOBBYOP

a year ago

fine if you have


a year ago

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


tony-hunter
HOBBYOP

a year ago

no don't worry, just wonderd


tony-hunter
HOBBYOP

a year ago

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


tony-hunter
HOBBYOP

a year ago

I think it's worked


tony-hunter
HOBBYOP

a year ago

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


tony-hunter
HOBBYOP

a year ago

shall I renable gzip on the BE?


a year ago

oh, it worked…


a year ago

i was kinda hoping it wouldnt


tony-hunter
HOBBYOP

a year ago

yeah, as is we haven't learnt anything


a year ago

exactly


tony-hunter
HOBBYOP

a year ago

just that the new builder works for some reason


tony-hunter
HOBBYOP

a year ago

enabling gzip


a year ago

hold on


a year ago

not yet please


tony-hunter
HOBBYOP

a year ago

oops


tony-hunter
HOBBYOP

a year ago

aborted the build


a year ago

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


tony-hunter
HOBBYOP

a year ago

yes


tony-hunter
HOBBYOP

a year ago

all my user will be ok with it


a year ago

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


tony-hunter
HOBBYOP

a year ago

yes don't worry


a year ago

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


tony-hunter
HOBBYOP

a year ago

anything I can do to help debug?


tony-hunter
HOBBYOP

a year ago

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


tony-hunter
HOBBYOP

a year ago

ok for me to try?


tony-hunter
HOBBYOP

a year ago

I'll leave gzip off


a year ago

yeah thats fine


tony-hunter
HOBBYOP

a year ago

that's deployed


tony-hunter
HOBBYOP

a year ago

redeploying FE


a year ago

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


tony-hunter
HOBBYOP

a year ago

good luck


tony-hunter
HOBBYOP

a year ago

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


tony-hunter
HOBBYOP

a year ago

FYI database connection worked


a year ago

they didn't before?


tony-hunter
HOBBYOP

a year ago

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


tony-hunter
HOBBYOP

a year ago

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


tony-hunter
HOBBYOP

a year ago

gzip works


a year ago

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


tony-hunter
HOBBYOP

a year ago

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


a year ago

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


tony-hunter
HOBBYOP

a year ago

was a joke about your fridge, ignore


tony-hunter
HOBBYOP

a year ago

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


a year ago

oh I thought you were serious 😅


tony-hunter
HOBBYOP

a year ago

rarely


a year ago

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


tony-hunter
HOBBYOP

a year ago

haha


tony-hunter
HOBBYOP

a year ago

would never priotise work above food


a year ago

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


a year ago

alright, i am back


Loading...