github.com/cs3org/reva/v2@v2.27.7/pkg/mentix/exchangers/importers/reqimporter.go (about) 1 // Copyright 2018-2021 CERN 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // In applying this license, CERN does not waive the privileges and immunities 16 // granted to it by virtue of its status as an Intergovernmental Organization 17 // or submit itself to any jurisdiction. 18 19 package importers 20 21 import ( 22 "io" 23 "net/http" 24 "net/url" 25 26 "github.com/rs/zerolog" 27 28 "github.com/cs3org/reva/v2/pkg/mentix/config" 29 "github.com/cs3org/reva/v2/pkg/mentix/exchangers" 30 "github.com/cs3org/reva/v2/pkg/mentix/meshdata" 31 ) 32 33 // BaseRequestImporter implements basic importer functionality common to all request importers. 34 type BaseRequestImporter struct { 35 BaseImporter 36 exchangers.BaseRequestExchanger 37 } 38 39 // HandleRequest handles the actual HTTP request. 40 func (importer *BaseRequestImporter) HandleRequest(resp http.ResponseWriter, req *http.Request, conf *config.Configuration, log *zerolog.Logger) { 41 body, _ := io.ReadAll(req.Body) 42 meshDataSet, status, respData, err := importer.handleQuery(body, req.URL.Query(), conf, log) 43 if err == nil { 44 if len(meshDataSet) > 0 { 45 importer.mergeImportedMeshDataSet(meshDataSet) 46 } 47 } else { 48 respData = []byte(err.Error()) 49 } 50 resp.WriteHeader(status) 51 _, _ = resp.Write(respData) 52 } 53 54 func (importer *BaseRequestImporter) mergeImportedMeshDataSet(meshDataSet meshdata.Vector) { 55 // Merge the newly imported data with any existing data stored in the importer 56 if importer.meshDataUpdates != nil { 57 // Need to manually lock the data for writing 58 importer.updatesLocker.Lock() 59 defer importer.updatesLocker.Unlock() 60 61 importer.meshDataUpdates = append(importer.meshDataUpdates, meshDataSet...) 62 } else { 63 importer.setMeshDataUpdates(meshDataSet) // SetMeshData will do the locking itself 64 } 65 } 66 67 func (importer *BaseRequestImporter) handleQuery(data []byte, params url.Values, conf *config.Configuration, log *zerolog.Logger) (meshdata.Vector, int, []byte, error) { 68 // Data is read, so lock it for writing 69 importer.Locker().RLock() 70 defer importer.Locker().RUnlock() 71 72 return importer.HandleAction(importer.MeshData(), data, params, true, conf, log) 73 }