Export raw bundles with collection logs and parser field snapshot

This commit is contained in:
Mikhail Chusavitin
2026-02-24 17:36:44 +03:00
parent 810c4b5ff9
commit ce30f943df
4 changed files with 270 additions and 9 deletions

View File

@@ -70,7 +70,22 @@ func (s *Server) handleUpload(w http.ResponseWriter, r *http.Request) {
vendor string
)
if looksLikeJSONSnapshot(header.Filename, payload) {
if rawPkg, ok, err := parseRawExportBundle(payload); err != nil {
jsonError(w, "Failed to parse raw export bundle: "+err.Error(), http.StatusBadRequest)
return
} else if ok {
replayed, replayVendor, replayErr := s.reanalyzeRawExportPackage(rawPkg)
if replayErr != nil {
jsonError(w, "Failed to reanalyze raw export package: "+replayErr.Error(), http.StatusBadRequest)
return
}
result = replayed
vendor = replayVendor
if strings.TrimSpace(vendor) == "" {
vendor = "snapshot"
}
s.SetRawExport(rawPkg)
} else if looksLikeJSONSnapshot(header.Filename, payload) {
if rawPkg, ok, err := parseRawExportPackage(payload); err != nil {
jsonError(w, "Failed to parse raw export package: "+err.Error(), http.StatusBadRequest)
return
@@ -755,20 +770,20 @@ func (s *Server) handleExportCSV(w http.ResponseWriter, r *http.Request) {
func (s *Server) handleExportJSON(w http.ResponseWriter, r *http.Request) {
result := s.GetResult()
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%q", exportFilename(result, "json")))
if rawPkg := s.GetRawExport(); rawPkg != nil {
rawPkg.ExportedAt = time.Now().UTC()
rawPkg.Analysis = nil
encoder := json.NewEncoder(w)
encoder.SetIndent("", " ")
if err := encoder.Encode(rawPkg); err != nil {
bundle, err := buildRawExportBundle(rawPkg, result, s.ClientVersionString())
if err != nil {
jsonError(w, "Failed to build raw export bundle: "+err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/zip")
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%q", exportFilename(result, "zip")))
_, _ = w.Write(bundle)
return
}
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%q", exportFilename(result, "json")))
exp := exporter.New(result)
_ = exp.ExportJSON(w)
}
@@ -840,6 +855,7 @@ func (s *Server) handleCollectStart(w http.ResponseWriter, r *http.Request) {
}
job := s.jobManager.CreateJob(req)
s.jobManager.AppendJobLog(job.ID, "Клиент: "+s.ClientVersionString())
s.startCollectionJob(job.ID, req)
w.Header().Set("Content-Type", "application/json")