2017-05-13 12 views
0

몇 가지 경로로 매우 간단한 Express 앱을 만들고 있습니다. 제 질문은 앱의 기능에 관한 것이 아니라 특급 경로의 이상한 행동에 관한 것입니다.일부 잘못된 MIME 유형이 "TypeError"를 트리거하고 다른 유효하지 않은 MIME 유형이 오류를 우회하고 무제 다운로드를 트리거합니까?

나는 서버를 시작하고 /search/* 경로 나 매개 변수에 소요 어떤 경로를 사용하고, 나는 응답이 네 가지 컨텐츠 유형 중 하나를 적용 할 때 :

  • res.setHeader('content-type', 'plain/text');
  • res.setHeader('content-type', 'plain/html');
  • res.setHeader('content-type', 'html/plain');
  • res.setHeader('content-type', 'html/text');

매개 변수가 프롬프트없이 파일로 다운로드됩니다. 따라서 search/foobar을 사용하면 크기가 6 바이트이고 지원되지 않는 파일 형식 인 "foobar"라는 파일이 다운로드됩니다. 이제이 네 가지 유형 중 어느 것도 실제 MIME 유형이 아니라는 것을 이해합니다. text/plain 또는 text/html을 사용해야하지만 다운로드가 필요한 이유는 무엇입니까? 그들이해야처럼이 두 MIME 유형은 행동 및 유형하지만 모두가 그들이해야처럼 실패하지 하위 다음과 같은 MIME 유형은, 그들은 모두 TypeError: invalid media type의 오류 반환 :

  • res.setHeader('content-type', 'text');
  • res.setHeader('content-type', 'plain');
  • res.setHeader('content-type', 'html');

일부 잘못된 유형이 오류를 유발하고 다른 잘못된 유형이 오류를 우회하여 다운로드를 트리거하는 이유는 무엇입니까?

내가 지금까지 발견 한 무엇 :

내가 익스프레스 4.x의 워드 프로세서에서 발견 res.download(path [, filename]) 전송하여 AS 경로에서 파일 "첨부 파일"일반적으로 다운로드에 대한 사용자 메시지를 표시합니다, 그러나이 다운로드는 프롬프트되거나 의도적 인 것이 아닙니다.

경로를 실행하면 파일이 자동으로 컴퓨터로 다운로드되는 Express 문서 (또는 여기에있는 SO)에서 이와 같은 상황을 찾을 수 없습니다. 내가 res.send(typeof(res)); 다운로드를 일으키는 라인을 생각 처음

하지만, 한 번에 라인을 주석 처리하고 서버를 다시 실행 한 후, 나는 콘텐츠 형식이 'plain/text'로 설정 한 경우에만 다운로드를한다는 것을 알아낼 수 있었다 우연히 있다. res.send() 안에 무엇이 들어가는 지 상관하지 않습니다. content-type이 plain/text 인 경우 /search/ 뒤에 나오는 텍스트가 내 컴퓨터에 다운로드됩니다. 경로를 재 배열

은 (는 다운로드를 제외한다로 모든 일했다.)

응용 단지 /search/foo 전에 도달 한 어떤 경로에 달려 있지만, 다운로드가 여전히 통해 오는 같은 결과에 도달했다.

내 코드 : Cloud9를 사용

'use strict'; 
var express = require('express'); 
var path = require('path'); 

var app = express(); 

app.get('/', function (req, res) { 
    res.sendFile(path.join(__dirname+'/index.html')); 
}); 


app.get('/search', function(req,res){ 
    res.send('search route'); 
}); 
app.get('/search/*', function(req, res, next) { 
    res.setHeader('content-type', 'plain/text'); 
    var type = typeof(res); 
    var reqParams = req.params; 
    res.send(type); 
}); 


var server = app.listen(process.env.PORT || 3000, function(){ 
    console.log('app listening on port ' + process.env.PORT + '!'); 
}); 

module.exports = server; 

기타 자세한 사항

  • Express 버전 4.15.2
  • 노드 버전 4.7.3
  • 오전 익스프레스 초보자
  • 내 REPO는, 당신은 아마 이후로 기본을 이동하는 '/'경로를 필요 당신이 당신의 경로를 정의하는 순서가 명시 적으로 많은 문제

답변

1

Why do some invalid types trigger an error...

는 MIME 타입은 (RFC 2045에 설명)가 준수해야 형식 및 그 형식과 일치하지 않는 오류를 유발하는 사람이 있기 때문에.

형식은 다음과 같습니다

type "/" subtype *(";" parameter) 

그래서 세미콜론 (;)으로 접두사 필수 유형, 필수 슬래시, 필수 하위 유형 및 선택 매개 변수가 있습니다. 그에서 다음과

...and other invalid types bypass the error and trigger a download?

RFC 2049 기록한다 : MIME 형식은 그 형식과 일치 할 때

그러나, 귀하의 질문의 두 번째 부분에 우리를 가져 오는, 반드시 의미에만 구문, 유효하지입니다 :

Upon encountering any unrecognized Content-Type field, an implementation must treat it as if it had a media type of "application/octet-stream" with no parameter sub-arguments. How such data are handled is up to an implementation, but likely options for handling such unrecognized data include offering the user to write it into a file (decoded from its mail transport format) or offering the user to name a program to which the decoded data should be passed as input.

내가 경로를 정리 해봤

+0

저기있다! 나는 읽고 있던 문서에서 "application/octet-stream"을 알아 차렸고 어떤 타입이 추측되고 있는지 추측하고 있었다. 그러나 이것이 내가 놓친 부분이었다. 정말 고맙습니다. –

0

분기 "so_question"에서, here 인 '/search/* '라우트.

+0

(강조 광산), 조합은해야처럼 작동하지만 여전히 정도로 긴 다운로드를 발생 setHeader 행이 있습니다. 왜 그런지 알기나 해? –

+0

죄송합니다. 왜 'text/html'이 아닌 plain/text가되어야합니까? 또한 'plain/text'보다는 'text/plain'이 될 수 있습니까? –

+0

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types –