Skip to content

Safari: failed to write data frame: WebSocket closed: received close frame: status = StatusProtocolError and reason = "" #390

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

Closed
andig opened this issue May 1, 2023 · 2 comments
Milestone

Comments

@andig
Copy link

andig commented May 1, 2023

I have an application that I'm migrating from gorilla/websocket to nhooyr. Changing the code is straightforward based on the chat example. This is the core send loop:

func (h *SocketHub) subscribe(ctx context.Context, conn *websocket.Conn) error {
	ctx = conn.CloseRead(ctx)

	s := &socketSubscriber{
		send: make(chan []byte, 1024),
		closeSlow: func() {
			conn.Close(websocket.StatusPolicyViolation, "connection too slow to keep up with messages")
		},
	}

	h.addSubscriber(s)
	defer h.deleteSubscriber(s)

	// send welcome message
	s.send <- []byte(`{"bufferSoc":0,"loadpoints.0.phasesConfigured":null,"savingsTotalCharged":12.804,"loadpoints.0.pvAction":"inactive","auth":{"vehicles":{}},"batteryCapacity":13,"smartCostUnit":"gCO2eq","vehicles":["blauer e-Golf","weißes Model 3","grüner Honda e","schwarzes VanMoof","Wärmepumpe"],"loadpoints.0.phasesActive":1,"loadpoints.0.phaseRemaining":0,"loadpoints.1.chargePower":0,"loadpoints.0.connectedDuration":0,"loadpoints.0.guardAction":"inactive","loadpoints.0.vehicleIcon":"","loadpoints.0.mode":"pv","loadpoints.1.phasesEnabled":0,"loadpoints.0.connected":true,"batteryConfigured":true,"residualPower":0,"loadpoints.0.maxCurrent":16,"sponsor":"sponsorship unavailable","loadpoints.0.phasesEnabled":1,"loadpoints.1.vehicleCapacity":80,"loadpoints.0.enabled":true,"loadpoints.1.phaseRemaining":0,"loadpoints.1.guardAction":"inactive","version":"0.0.1-alpha","sponsorTokenExpires":0,"loadpoints.0.minCurrent":6,"loadpoints.0.vehicleCapacity":44,"loadpoints.1.phasesActive":3,"loadpoints.1.phaseAction":"inactive","loadpoints.1.vehiclePresent":true,"loadpoints.1.vehicleIcon":"","loadpoints.1.mode":"off","savingsEffectivePrice":0.082125,"gridConfigured":true,"loadpoints.0.phaseAction":"inactive","loadpoints.0.vehicleTargetSoc":0,"loadpoints.1.minCurrent":6,"loadpoints.1.targetSoc":75,"loadpoints.1.targetEnergy":0,"loadpoints.0.charging":true,"prioritySoc":0,"loadpoints.0.chargerFeatureIntegratedDevice":false,"loadpoints.0.vehicleDetectionActive":false,"loadpoints.1.guardRemaining":0,"loadpoints.0.chargeCurrent":16,"batterySoc":55,"tariffEffectivePrice":0.08,"loadpoints.0.vehicleSoc":62.2,"pv":[{"power":8179.472084980387}],"loadpoints.0.chargePower":3680,"batteryPower":0,"siteTitle":"Zuhause","savingsSince":"2023-03-09T22:59:09+01:00","loadpoints.0.minSoc":0,"loadpoints.0.vehicleTitle":"blauer e-Golf","loadpoints.0.planActive":false,"gridPower":-4175.3,"homePower":324.22,"tariffCo2":675,"savingsSelfConsumptionCharged":12.626,"loadpoints.0.pvRemaining":0,"loadpoints.0.vehicleRange":182,"loadpoints.1.title":"Garage","loadpoints.1.pvAction":"inactive","loadpoints.1.phasesConfigured":0,"loadpoints.1.chargerFeatureIntegratedDevice":false,"loadpoints.1.chargerIcon":"","battery":[{"power":0,"soc":55,"capacity":13.4}],"loadpoints.0.guardRemaining":0,"loadpoints.0.targetEnergy":0,"loadpoints.0.vehiclePresent":true,"loadpoints.1.maxCurrent":16,"loadpoints.0.chargeRemainingDuration":13296,"loadpoints.0.chargeRemainingEnergy":13591,"greenShare":1,"savingsGridCharged":0.17814,"loadpoints.1.vehicleRange":0,"loadpoints.0.chargedEnergy":0.0014228,"tariffFeedIn":0.08,"tariffEffectiveCo2":0,"smartCostLimit":0,"currency":"EUR","loadpoints.1.minSoc":0,"loadpoints.1.vehicleTitle":"weißes Model 3","savingsSelfConsumptionPercent":98.609,"availableVersion":"0.116.7","loadpoints.0.chargerIcon":"","loadpoints.1.vehicleFeatureOffline":false,"pvPower":8179.5,"loadpoints.0.chargeDuration":0,"loadpoints.1.vehicleTargetSoc":0,"tariffGrid":0.399,"savingsAmount":4.0079,"pvConfigured":true,"loadpoints.0.title":"Carport","loadpoints.0.targetSoc":90,"loadpoints.1.pvRemaining":0,"smartCostAvailable":true,"loadpoints.0.vehicleFeatureOffline":false,"loadpoints.1.vehicleSoc":0,"loadpoints.1.vehicleDetectionActive":false}`)

	for {
		select {
		case msg := <-s.send:
			if err := writeTimeout(ctx, socketWriteTimeout, conn, msg); err != nil {
				return err
			}
		case <-ctx.Done():
			return ctx.Err()
		}
	}
}

The welcome message contains a bunch of JSON state that each client obtains on connection. This works with Chrome and Firefox, but not Safari. On Safari, the client apparently receives the data but then disconnects. Server log sometimes shows

failed to write msg: failed to write: failed to write data frame: WebSocket closed: received close frame: status = StatusProtocolError and reason = ""

The error does not happens when no welcome message is sent or the welcome message is small. I did not try yet to determine if the size of message has a clear bound for the error to occur.

Any idea what might be special about Safari in this context?

@andig
Copy link
Author

andig commented May 1, 2023

Breaks at 512 characters. Duplicate of #218?

@nhooyr
Copy link
Contributor

nhooyr commented Sep 28, 2023

Yup I think so. Compression will be disabled by default in the next release anyway. Not very reliable based on the number of issues related to it.

@nhooyr nhooyr closed this as completed Sep 28, 2023
@nhooyr nhooyr added this to the v1.8.8 milestone Sep 28, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants