Skip to content

Commit cf6721d

Browse files
gamcilmilot-mirdita
authored andcommitted
pass through gzipped files as bytes in foldmason
1 parent 19a5297 commit cf6721d

5 files changed

Lines changed: 71 additions & 90 deletions

File tree

backend/foldmasonmsa.go

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,50 @@ package main
33
import (
44
"crypto/sha256"
55
"encoding/base64"
6+
"encoding/json"
67
"os"
78
"path/filepath"
8-
"strings"
9+
"regexp"
910
)
1011

1112
type FoldMasonMSAJob struct {
12-
Queries []string `json:"queries"`
13+
Queries [][]byte `json:"queries"`
1314
FileNames []string `json:"fileNames"`
1415
}
1516

17+
var foldMasonFileName = regexp.MustCompile(`[^a-zA-Z0-9_.-]+`)
18+
19+
func (j *FoldMasonMSAJob) UnmarshalJSON(data []byte) error {
20+
type current FoldMasonMSAJob
21+
var cur current
22+
if err := json.Unmarshal(data, &cur); err == nil {
23+
*j = FoldMasonMSAJob(cur)
24+
return nil
25+
}
26+
27+
type legacy struct {
28+
Queries []string `json:"queries"`
29+
FileNames []string `json:"fileNames"`
30+
}
31+
var old legacy
32+
if err := json.Unmarshal(data, &old); err != nil {
33+
return err
34+
}
35+
36+
j.FileNames = old.FileNames
37+
j.Queries = make([][]byte, len(old.Queries))
38+
for i, query := range old.Queries {
39+
j.Queries[i] = []byte(query)
40+
}
41+
42+
return nil
43+
}
44+
1645
func (r FoldMasonMSAJob) Hash() Id {
1746
h := sha256.New224()
1847
h.Write(([]byte)(JobFoldMasonMSA))
1948
for _, query := range r.Queries {
20-
h.Write([]byte(query))
49+
h.Write(query)
2150
}
2251
bs := h.Sum(nil)
2352
return Id(base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(bs))
@@ -34,15 +63,8 @@ func (r FoldMasonMSAJob) WritePDB(path string) error {
3463
var pdbDir = filepath.Join(path, "pdbs")
3564
os.Mkdir(pdbDir, os.ModePerm)
3665
for idx, query := range r.Queries {
37-
name := cleanPathComponent.ReplaceAllString(r.FileNames[idx], "")
38-
if strings.EqualFold(filepath.Ext(name), ".gz") {
39-
name = strings.TrimSuffix(name, filepath.Ext(name))
40-
}
41-
ext := filepath.Ext(name)
42-
if ext == ".cif" || ext == ".mmcif" {
43-
name = strings.TrimSuffix(name, ext) + ".cif"
44-
}
45-
err := os.WriteFile(filepath.Join(pdbDir, name), []byte(query), 0644)
66+
name := foldMasonFileName.ReplaceAllString(filepath.Base(r.FileNames[idx]), "")
67+
err := os.WriteFile(filepath.Join(pdbDir, name), query, 0644)
4668
if err != nil {
4769
return err
4870
}
@@ -51,7 +73,7 @@ func (r FoldMasonMSAJob) WritePDB(path string) error {
5173
}
5274

5375
func NewFoldMasonMSAJobRequest(
54-
queries []string,
76+
queries [][]byte,
5577
fileNames []string,
5678
gapOpen int64,
5779
gapExtend int64,

backend/server.go

Lines changed: 22 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"bufio"
55
"bytes"
6-
"compress/gzip"
76
"encoding/json"
87
"io"
98
"log"
@@ -24,34 +23,6 @@ import (
2423
"github.com/rs/cors"
2524
)
2625

27-
func readUploadedText(r io.Reader) (string, error) {
28-
data, err := io.ReadAll(r)
29-
if err != nil {
30-
return "", err
31-
}
32-
33-
if !isGzipPayload(data) {
34-
return string(data), nil
35-
}
36-
37-
gr, err := gzip.NewReader(bytes.NewReader(data))
38-
if err != nil {
39-
return "", err
40-
}
41-
defer gr.Close()
42-
43-
decoded, err := io.ReadAll(gr)
44-
if err != nil {
45-
return "", err
46-
}
47-
48-
return string(decoded), nil
49-
}
50-
51-
func isGzipPayload(data []byte) bool {
52-
return len(data) >= 2 && data[0] == 0x1f && data[1] == 0x8b
53-
}
54-
5526
type DatabaseResponse struct {
5627
Databases []Params `json:"databases"`
5728
}
@@ -179,11 +150,9 @@ func server(jobsystem JobSystem, config ConfigRoot) {
179150
}
180151
defer f.Close()
181152

182-
data, err = readUploadedText(f)
183-
if err != nil {
184-
http.Error(w, err.Error(), http.StatusBadRequest)
185-
return
186-
}
153+
buf := new(bytes.Buffer)
154+
buf.ReadFrom(f)
155+
data = buf.String()
187156
} else {
188157
err := req.ParseForm()
189158
if err != nil {
@@ -326,11 +295,9 @@ func server(jobsystem JobSystem, config ConfigRoot) {
326295
}
327296
defer f.Close()
328297

329-
query, err = readUploadedText(f)
330-
if err != nil {
331-
http.Error(w, err.Error(), http.StatusBadRequest)
332-
return
333-
}
298+
buf := new(bytes.Buffer)
299+
buf.ReadFrom(f)
300+
query = buf.String()
334301
dbs = req.Form["database[]"]
335302
mode = req.FormValue("mode")
336303
email = req.FormValue("email")
@@ -415,11 +382,9 @@ func server(jobsystem JobSystem, config ConfigRoot) {
415382
}
416383
defer f.Close()
417384

418-
query, err = readUploadedText(f)
419-
if err != nil {
420-
http.Error(w, err.Error(), http.StatusBadRequest)
421-
return
422-
}
385+
buf := new(bytes.Buffer)
386+
buf.ReadFrom(f)
387+
query = buf.String()
423388
dbs = req.Form["database[]"]
424389
mode = req.FormValue("mode")
425390
email = req.FormValue("email")
@@ -480,11 +445,9 @@ func server(jobsystem JobSystem, config ConfigRoot) {
480445
}
481446
defer f.Close()
482447

483-
query, err = readUploadedText(f)
484-
if err != nil {
485-
http.Error(w, err.Error(), http.StatusBadRequest)
486-
return
487-
}
448+
buf := new(bytes.Buffer)
449+
buf.ReadFrom(f)
450+
query = buf.String()
488451
mode = req.FormValue("mode")
489452
email = req.FormValue("email")
490453
} else {
@@ -517,7 +480,7 @@ func server(jobsystem JobSystem, config ConfigRoot) {
517480
}
518481

519482
ticketFoldMasonMSAHandlerFunc := func(w http.ResponseWriter, req *http.Request) {
520-
var queries []string
483+
var queries [][]byte
521484
var fileNames []string
522485
var gapOpen int64
523486
var gapExtend int64
@@ -543,20 +506,19 @@ func server(jobsystem JobSystem, config ConfigRoot) {
543506
}
544507
defer file.Close()
545508

546-
query, err := readUploadedText(file)
547-
if err != nil {
548-
http.Error(w, err.Error(), http.StatusBadRequest)
549-
return
550-
}
551-
queries = append(queries, query)
509+
buf := new(bytes.Buffer)
510+
buf.ReadFrom(file)
511+
queries = append(queries, buf.Bytes())
552512
}
553513
} else {
554514
err := req.ParseForm()
555515
if err != nil {
556516
http.Error(w, err.Error(), http.StatusBadRequest)
557517
return
558518
}
559-
queries = req.Form["queries[]"]
519+
for _, query := range req.Form["queries[]"] {
520+
queries = append(queries, []byte(query))
521+
}
560522

561523
}
562524
fileNames = req.Form["fileNames[]"]
@@ -601,11 +563,9 @@ func server(jobsystem JobSystem, config ConfigRoot) {
601563
}
602564
defer f.Close()
603565

604-
query, err = readUploadedText(f)
605-
if err != nil {
606-
http.Error(w, err.Error(), http.StatusBadRequest)
607-
return
608-
}
566+
buf := new(bytes.Buffer)
567+
buf.ReadFrom(f)
568+
query = buf.String()
609569
dbs = req.Form["database[]"]
610570
//mode = req.FormValue("mode")
611571
email = req.FormValue("email")

frontend/FoldMasonSearch.vue

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ import { AxiosCompressRequest } from './lib/AxiosCompressRequest.js';
140140
import ApiDialog from './ApiDialog.vue';
141141
import { HistoryMixin } from './lib/HistoryMixin.js';
142142
import Databases from './Databases.vue';
143-
import QueryTextarea from "./QueryTextarea.vue";
144143
import DragUploadBox from "./DragUploadBox.vue";
145144
import { BlobDatabase } from "./lib/BlobDatabase.js";
146145
@@ -159,7 +158,6 @@ export default {
159158
Reference,
160159
ApiDialog,
161160
Databases,
162-
QueryTextarea,
163161
DragUploadBox
164162
},
165163
data() {

frontend/InterfaceSearch.vue

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ import LoadAcessionButton from './LoadAcessionButton.vue';
136136
import Reference from "./Reference.vue";
137137
import { convertToQueryUrl } from './lib/convertToQueryUrl';
138138
import TaxonomyAutocomplete from './TaxonomyAutocomplete.vue';
139-
import { djb2, parseResultsList, checkMultimer } from './Utilities.js';
139+
import { djb2, parseResultsList, checkMultimer, readUploadedText } from './Utilities.js';
140140
import { AxiosCompressRequest } from './lib/AxiosCompressRequest.js';
141141
import ApiDialog from './ApiDialog.vue';
142142
import { StorageWrapper, HistoryMixin } from './lib/HistoryMixin.js';
@@ -282,12 +282,13 @@ export default {
282282
this.inSearch = false;
283283
}
284284
},
285-
upload(files) {
286-
var reader = new FileReader();
287-
reader.onload = e => {
288-
this.query = e.target.result;
289-
};
290-
reader.readAsText(files[0]);
285+
async upload(files) {
286+
try {
287+
this.query = await readUploadedText(files[0]);
288+
} catch (error) {
289+
this.errorMessage = "Error reading uploaded file";
290+
throw error;
291+
}
291292
},
292293
uploadJSON(files) {
293294
let file = files[0];

frontend/QueryTextarea.vue

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
</template>
1717

1818
<script>
19+
import { readUploadedText } from "./Utilities.js";
20+
1921
export default {
2022
name: 'QueryTextarea',
2123
props: {
@@ -28,11 +30,9 @@ export default {
2830
event.stopPropagation();
2931
var dataTransfer = event.dataTransfer || event.target;
3032
if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {
31-
var reader = new FileReader();
32-
reader.onload = e => {
33-
this.$emit('input', e.target.result);
34-
};
35-
reader.readAsText(dataTransfer.files[0]);
33+
readUploadedText(dataTransfer.files[0]).then((text) => {
34+
this.$emit('input', text);
35+
});
3636
}
3737
}
3838
}
@@ -59,4 +59,4 @@ export default {
5959
align-self: stretch;
6060
}
6161
62-
</style>
62+
</style>

0 commit comments

Comments
 (0)