16KB is small enough for disk readahead and large enough for TCP
(name string)
| 94 | const defaultPacketSize = 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP |
| 95 | |
| 96 | func (mc *okHandler) handleInFileRequest(name string) (err error) { |
| 97 | var rdr io.Reader |
| 98 | packetSize := min(mc.maxWriteSize, defaultPacketSize) |
| 99 | |
| 100 | if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader |
| 101 | // The server might return an an absolute path. See issue #355. |
| 102 | name = name[idx+8:] |
| 103 | |
| 104 | readerRegisterLock.RLock() |
| 105 | handler, inMap := readerRegister[name] |
| 106 | readerRegisterLock.RUnlock() |
| 107 | |
| 108 | if inMap { |
| 109 | rdr = handler() |
| 110 | if rdr != nil { |
| 111 | if cl, ok := rdr.(io.Closer); ok { |
| 112 | defer deferredClose(&err, cl) |
| 113 | } |
| 114 | } else { |
| 115 | err = fmt.Errorf("reader '%s' is <nil>", name) |
| 116 | } |
| 117 | } else { |
| 118 | err = fmt.Errorf("reader '%s' is not registered", name) |
| 119 | } |
| 120 | } else { // File |
| 121 | name = strings.Trim(name, `"`) |
| 122 | fileRegisterLock.RLock() |
| 123 | _, exists := fileRegister[name] |
| 124 | fileRegisterLock.RUnlock() |
| 125 | if mc.cfg.AllowAllFiles || exists { |
| 126 | var file *os.File |
| 127 | var fi os.FileInfo |
| 128 | |
| 129 | if file, err = os.Open(name); err == nil { |
| 130 | defer deferredClose(&err, file) |
| 131 | |
| 132 | // get file size |
| 133 | if fi, err = file.Stat(); err == nil { |
| 134 | rdr = file |
| 135 | if fileSize := int(fi.Size()); fileSize < packetSize { |
| 136 | packetSize = fileSize |
| 137 | } |
| 138 | } |
| 139 | } |
| 140 | } else { |
| 141 | err = fmt.Errorf("local file '%s' is not registered", name) |
| 142 | } |
| 143 | } |
| 144 | |
| 145 | // send content packets |
| 146 | var data []byte |
| 147 | |
| 148 | // if packetSize == 0, the Reader contains no data |
| 149 | if err == nil && packetSize > 0 { |
| 150 | data = make([]byte, 4+packetSize) |
| 151 | var n int |
| 152 | for err == nil { |
| 153 | n, err = rdr.Read(data[4:]) |
no test coverage detected