Expect:使用XmlHTTPRequest的100-Continue标头

时间:2013-08-03 04:43:20

标签: ajax xmlhttprequest http-1.1

如何强制XmlHttpRequest添加Expect:100-continue标头?如何在桌面浏览器世界中使用此功能?

var xmlhttp = new XMLHttpRequest();
var dataToSend = new FormData();
dataToSend.append('some', 'data');
dataToSend.append('token', 'secret-token');

xmlhttp.open("POST", "/post", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Expect", "100-continue");
xmlhttp.setRequestHeader("Custom-Header", "This is custom data");
xmlhttp.send(dataToSend);

这是TCP Dump输出部分

POST /post HTTP/1.1
Host: 127.0.0.1:3000
Connection: keep-alive
Content-Length: 243
Origin: http://127.0.0.1:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Custom-Header: This is custom data
Content-type: application/x-www-form-urlencoded
Accept: */*
Referer: http://127.0.0.1:3000/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: connect.sid=s%3AAKgYIit0sVHMcI7na85UR_Na.o7uSDBEidLEyQ3cTaGyXlMrPiF3vADrwpnCrkCrJBD0

------WebKitFormBoundary9agFn5mlxh7SUBf7
Content-Disposition: form-data; name="some"

data
------WebKitFormBoundary9agFn5mlxh7SUBf7
Content-Disposition: form-data; name="token"

secret-token
------WebKitFormBoundary9agFn5mlxh7SUBf7--

1 个答案:

答案 0 :(得分:4)

出于安全原因,您无法强制XMLHttpRequest.setRequestHeader()方法添加Expect标头,因为您可以阅读W3C XMLHttpRequest specification

  

setRequestHeader(header,value)方法必须运行以下步骤:

     
      
  1. 如果状态未打开,则抛出“InvalidStateError”异常并终止这些步骤。
  2.   
  3. 如果设置了send()标志,则抛出“InvalidStateError”异常并终止这些步骤。
  4.   
  5. 如果标题与字段名称生成不匹配,则抛出“SyntaxError”异常并终止这些步骤。
  6.   
  7. 如果value与字段值生成不匹配,则抛出“SyntaxError”异常并终止这些步骤(注意:空字符串是合法的,表示空标题值)。
  8.   
  9. 如果header是以下标题之一的不区分大小写的匹配项,请终止这些步骤:

         
        
    • 接收字符集
    •   
    • 接受编码
    •   
    • 访问控制请求报头
    •   
    • 访问控制请求-方法
    •   
    • 连接内容长度
    •   
    • Cookie
    •   
    • COOKIE2
    •   
    • 块引用
    •   
    • 日期
    •   
    • DNT
    •   
    • 期待
    •   
    • 主持人
    •   
    • Keep-Alive Origin
    •   
    • Referer
    •   
    • TE
    •   
    • 拖车
    •   
    • 转移编码
    •   
    • 升级
    •   
    • 用户代理
    •   
    • 通过
    •   
  10.         

    ...或者如果标头的开头是Proxy-或Sec-的不区分大小写的匹配(包括标题只是代理或秒 - )。

         

    上述标题由用户代理控制,以便控制传输的这些方面。这在一定程度上保证了数据完整性。不允许将以Sec-开头的标题名称设置为允许创建新的标题,这些标题保证不会来自XMLHttpRequest。

作为进一步的参考:

某些浏览器(例如Chrome)也会在“JavaScript控制台”中显示错误:

Unsafe header