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
- On 401/timeout, tear down and re-create the session (new GetToken + GetOffer cycle)
- Ensure the answer SDP is submitted promptly after receiving the offer
- 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)