()
| 117 | } |
| 118 | |
| 119 | func (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 | |
| 168 | func (s *Streamer) StreamSamtools(filePath string, region string, args ...string) (err error) { |
| 169 | //involking samtools in command line: |
no test coverage detected