in sessions/sessions.go [263:310]
func (s *collection) Patch(r *http.Request, unifiedID string, sess *resources.Session) (*resources.Session, error) {
s.Lock()
defer s.Unlock()
record, ok := s.sessionsMap[unifiedID]
if !ok {
return nil, fmt.Errorf("session %q not found: %w", unifiedID, util.HTTPError(http.StatusNotFound))
}
backend := record.backend
var err error
var k *resources.Kernel
if sess.Kernel != nil {
backend, k, err = kernels.BackendView(sess.Kernel, []*backends.Backend{s.localBackend, s.remoteBackend})
if err != nil {
err = fmt.Errorf("failure converting the session kernel: %w", err)
util.Log(r, err)
return nil, err
}
sess.Kernel = k
}
fillInMissingFields(record.backendView, sess)
if record.backend != backend {
// Change in location; delete the old session and create a new one.
s.deleteWithLock(unifiedID)
return s.insertWithLock(unifiedID, UnifiedView(sess, backend, ""))
}
// The backend is unchanged, so simply forward the patch request to it.
sess.ID = record.backendView.ID
reqBytes, err := json.Marshal(sess)
if err != nil {
err = fmt.Errorf("failure marshalling the updated session: %w", err)
util.Log(r, err)
return nil, err
}
respBytes, err := backend.Patch("/api/sessions/"+sess.ID, reqBytes)
if err != nil {
err = fmt.Errorf("failure patching the session: %w", err)
util.Log(r, err)
return nil, err
}
var resp resources.Session
if err = json.Unmarshal(respBytes, &resp); err != nil {
err = fmt.Errorf("failure unmarshalling the patched session: %w", err)
util.Log(r, err)
return nil, err
}
record.backendView = &resp
return record.UnifiedView(unifiedID), nil
}