readFileWithLimit reads a file with size limit and buffer pool for memory efficiency
(file io.Reader, maxSize int64)
| 92 | |
| 93 | // readFileWithLimit reads a file with size limit and buffer pool for memory efficiency |
| 94 | func readFileWithLimit(file io.Reader, maxSize int64) ([]byte, error) { |
| 95 | // Get buffer from pool |
| 96 | buf := bufferPool.Get().([]byte) |
| 97 | defer bufferPool.Put(buf[:0]) // Reset and return to pool |
| 98 | |
| 99 | // Read with limit |
| 100 | limitedReader := io.LimitReader(file, maxSize+1) |
| 101 | data, err := io.ReadAll(limitedReader) |
| 102 | if err != nil { |
| 103 | return nil, err |
| 104 | } |
| 105 | |
| 106 | // Check if file was too large |
| 107 | if int64(len(data)) > maxSize { |
| 108 | return nil, fmt.Errorf("file too large: %d bytes > %d limit", len(data), maxSize) |
| 109 | } |
| 110 | |
| 111 | // Return a copy since we're returning the buffer to the pool |
| 112 | result := make([]byte, len(data)) |
| 113 | copy(result, data) |
| 114 | |
| 115 | return result, nil |
| 116 | } |
| 117 | |
| 118 | // serveFileWithMemoryCache serves a file with in-memory caching for small files |
| 119 | func serveFileWithMemoryCache(c *gin.Context, file io.Reader, fullPath string, fileInfo os.FileInfo, config FileServingConfig) error { |
no test coverage detected