func()

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
}