웹 개발 중인 압축,range 범위 요청

2326 단어
압축
//          
compress: /\.(js|css|html|md)/
//      zlib
const {createGzip,createDeflate} = require('zlib')
module.exports = (rs ,req ,res)=>{
   const acceptEncoding = req.headers['accept-encoding']
   if(!acceptEncoding || !acceptEncoding.match(/\bgzip|deflate\b/)){
       return rs
   }else if(acceptEncoding.match(/\bgzip\b/)){
       res.setHeader('Content-Encoding','gzip')
       return rs.pipe(createGzip())
   }else if(acceptEncoding.match(/\bdeflate\b/)){
       res.setHeader('Content-Encoding','deflate')
       return rs.pipe(createDeflate())
   }
}
//         res
const press = require('../handle/compress')
let rs = fs.createReadStream(filePath)
if (filePath.match(compress)) {
   rs = press(rs, req, res)
}
rs.pipe(res)
  • 웹 서버 처리 HTTP 압축의 gzip, deflate 압축
  • [웹 최적화] Yslow 최적화 법칙(4) Gzip 압축 사용
  • range 범위 요청
  • range:bytes=[start]-[end]
  • Accept-Ranges:bytes
  • Content-Range:bytes start-end/total
  • //  range  
    module.exports = (totalSize, req, res) => {
        const range = req.headers['range']
        if (!range) {
            return {code: 200}
        }
    
        const sizes = range.match(/bytes=(\d*)-(\d*)/)
    
        const end = sizes[2] || totalSize - 1
        const start = sizes[1] || totalSize - end
    
        if (start - end < 0 || start < 0 || end > totalSize) {
            return {code: 200}
        }
        res.setHeader('Accept-Ranges', 'bytes')
        res.setHeader('Content-Range', `bytes ${start}-${end}/${totalSize}`)
        res.setHeader('Content-Length', end - start)
    
        return {
            code: 206,
            start: parseInt(start),
            end: parseInt(end)
        }
    
    }
    //  206    res
    const range = require('../handle/range')
    const {code,start,end} = range(stats.size,req,res)
    switch (code){
        case 200:{
            rs = fs.createReadStream(filePath)
            break
        }
        case 416:{
            rs = fs.createReadStream(filePath)
            break
        }
        case 206:{
            rs = fs.createReadStream(filePath,{start,end})
            break
        }
        default:{
            rs = fs.createReadStream(filePath)
        }
    }
    rs.pipe(res)
    
  • 실천 HTTP206 상태: 일부 내용 및 범위 요청
  • RFC7233 HTTP 범위 요청(Range Requests)
  • HTTP 요청 범위 - MDN
  • 좋은 웹페이지 즐겨찾기