MCPcopy Create free account
hub / github.com/MG-RAST/Shock / MultiStream

Method MultiStream

shock-server/request/streamer.go:119–166  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

117}
118
119func (m *MultiStreamer) MultiStream() (err error) {
120 // set headers
121 fileName := fmt.Sprintf(" attachment; filename=%s", m.Filename)
122 m.W.Header().Set("Content-Type", m.ContentType)
123 m.W.Header().Set("Connection", "close")
124 m.W.Header().Set("Access-Control-Allow-Headers", "Authorization")
125 m.W.Header().Set("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS")
126 m.W.Header().Set("Access-Control-Allow-Origin", "*")
127 m.W.Header().Set("Content-Disposition", fileName)
128
129 // pipe each SectionReader into one stream
130 for _, f := range m.Files {
131 pReader, pWriter := io.Pipe()
132 f.Body = pReader
133 go func(lf *file.FileInfo) {
134 for i, sr := range lf.R {
135 _, ioerr := io.Copy(pWriter, sr)
136 if ioerr != nil {
137 lf.E = ioerr
138 lf.ESection = i
139 }
140 }
141 pWriter.Close()
142 }(f)
143 }
144
145 // identify any error files
146 for _, f := range m.Files {
147 if f.E != nil {
148 err = fmt.Errorf("(request.MultiStream: section %d) failed: size=%d; file=%s; error=%s", f.ESection, f.Size, f.Name, f.E.Error())
149 return
150 }
151 }
152
153 // pass pipes through archiver to ResponseWriter
154 aReader := archive.ArchiveReader(m.Archive, m.Files)
155 _, ioerr := io.Copy(m.W, aReader)
156
157 aReader.Close()
158 for _, f := range m.Files {
159 f.Body.Close()
160 }
161
162 if ioerr != nil {
163 err = fmt.Errorf("(request.MultiStream: full stream) failed: file=%s; error=%s", m.Filename, ioerr.Error())
164 }
165 return
166}
167
168func (s *Streamer) StreamSamtools(filePath string, region string, args ...string) (err error) {
169 //involking samtools in command line:

Callers 1

streamDownloadFunction · 0.95

Calls 3

SetMethod · 0.65
CloseMethod · 0.65
ErrorMethod · 0.45

Tested by

no test coverage detected