grafana/k6 · error

WebSocket requires no url fragment, but got %q

Error message

WebSocket requires no url fragment, but got %q

What it means

Fragment guard in the WebSocket constructor's URL parsing: per the WebSocket specification, a URL containing a #fragment is invalid for constructing a WebSocket because fragments are client-side only and never sent to the server. The error reports the offending URL string so the fragment can be located and removed.

Source

Thrown at internal/js/modules/k6/websockets/websockets.go:187

}

// parseURL parses the url from the first constructor calls argument or returns an error
func parseURL(urlValue sobek.Value) (*url.URL, error) {
	if common.IsNullish(urlValue) {
		return nil, errors.New("WebSocket requires a url")
	}

	// TODO: throw the SyntaxError (https://websockets.spec.whatwg.org/#dom-websocket-websocket)
	urlString := urlValue.String()
	url, err := url.Parse(urlString)
	if err != nil {
		return nil, fmt.Errorf("WebSocket requires valid url, but got %q which resulted in %w", urlString, err)
	}
	if url.Scheme != "ws" && url.Scheme != "wss" {
		return nil, fmt.Errorf("WebSocket requires url with scheme ws or wss, but got %q", url.Scheme)
	}
	if url.Fragment != "" {
		return nil, fmt.Errorf("WebSocket requires no url fragment, but got %q", url.Fragment)
	}

	return url, nil
}

const (
	arraybufferBinaryType = "arraybuffer"
	blobBinaryType        = "blob"
)

// defineWebsocket defines all properties and methods for the WebSocket
func defineWebsocket(rt *sobek.Runtime, w *webSocket) {
	must(rt, w.obj.DefineDataProperty(
		"addEventListener", rt.ToValue(w.addEventListener), sobek.FLAG_FALSE, sobek.FLAG_FALSE, sobek.FLAG_TRUE))
	must(rt, w.obj.DefineDataProperty(
		"send", rt.ToValue(w.send), sobek.FLAG_FALSE, sobek.FLAG_FALSE, sobek.FLAG_TRUE))
	must(rt, w.obj.DefineDataProperty(
		"ping", rt.ToValue(w.ping), sobek.FLAG_FALSE, sobek.FLAG_FALSE, sobek.FLAG_TRUE))

View on GitHub (pinned to 165bb3c1a4)

Solutions

  1. Remove the #fragment portion from the WebSocket URL
  2. If appending path or query parameters, use ?query syntax and URL-encode values
  3. Sanitize URLs copied from browser devtools, which may include fragments
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at internal/js/modules/k6/websockets/websockets.go:176 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of grafana/k6@165bb3c1a4 (2026-08-18). Data as JSON: /api/errors/fd70e5cd118c5685. Report an issue: GitHub.