AlexxIT/go2rtc · error

milesone: patch session:

Error message

milesone: patch session: 

What it means

Milestone SetAnswer's HTTP status guard: the PATCH to /REST/v1/WebRTC/Session/<id> completing the signaling handshake returned non-200 (status appended). The locally generated answer was rejected by the Milestone server, typically because the session expired between offer and answer or the session state is inconsistent.

Solutions

  1. On 401/timeout, tear down and re-create the session (new GetToken + GetOffer cycle)
  2. Ensure the answer SDP is submitted promptly after receiving the offer
  3. Check camera-side session limits on the Milestone server
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at internal/webrtc/milestone.go:172 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of AlexxIT/go2rtc@c245815e75 (2026-09-07). Data as JSON: /api/errors/44002d6e5d565d0d. Report an issue: GitHub.

Appendix: source

Thrown at internal/webrtc/milestone.go:172

	if data, err = json.Marshal(request); err != nil {
		return err
	}

	req, err := http.NewRequest("PATCH", m.url+"/REST/v1/WebRTC/Session/"+m.sessionID, bytes.NewBuffer(data))
	if err != nil {
		return err
	}
	req.Header.Set("Authorization", "Bearer "+m.token)
	req.Header.Set("Content-Type", "application/json")

	res, err := tcp.Do(req)
	if err != nil {
		return err
	}
	defer res.Body.Close()

	if res.StatusCode != http.StatusOK {
		return errors.New("milesone: patch session: " + res.Status)
	}

	return nil
}

func milestoneClient(rawURL string, query url.Values) (core.Producer, error) {
	mc := &milestoneAPI{url: rawURL, query: query}
	if err := mc.GetToken(); err != nil {
		return nil, err
	}

	api, err := webrtc.NewAPI()
	if err != nil {
		return nil, err
	}

	conf := pion.Configuration{}
	pc, err := api.NewPeerConnection(conf)

View on GitHub (pinned to c245815e75)