Prototype.js 1.4.0抛出'拒绝设置不安全的标题"连接"'错误

时间:2015-09-07 13:04:51

标签: javascript

我试图通过prototype.js函数setRequestHeaders添加if()覆盖 continue;,以避免指定标题

for (var i = 0; i < requestHeaders.length; i += 2){
     if("Connection" === requestHeaders[i] || "Connection" === requestHeaders[i+1])
            continue;
     this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
  }

在IE9上,无需更改prototype.js即可正常工作,但在其他浏览器(Chrome,Firefox等)中,标题出现错误。

感谢您的任何建议和帮助! :)

[编辑]

关于重复: 我发现了这个话题,但情况并不相同。在重复的主题中,有一个可以修改的文件,但我无法修改prototype.js的代码。

[EDIT2]

此代码在1.4.0(如标题中所述),约661-685行

setRequestHeaders: function() {
var requestHeaders =
  ['X-Requested-With', 'XMLHttpRequest',
   'X-Prototype-Version', Prototype.Version];

if (this.options.method == 'post') {
  requestHeaders.push('Content-type',
    'application/x-www-form-urlencoded');

  /* Force "Connection: close" for Mozilla browsers to work around
   * a bug where XMLHttpReqeuest sends an incorrect Content-length
   * header. See Mozilla Bugzilla #246651.
   */
  if (this.transport.overrideMimeType)
    requestHeaders.push('Connection', 'close');
}

if (this.options.requestHeaders)
  requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);

for (var i = 0; i < requestHeaders.length; i += 2){
    console.log(requestHeaders[i] + " AND " + requestHeaders[i+1]);
    //My edition - BEGIN;
    if("Connection" === requestHeaders[i] || "Connection" === requestHeaders[i+1])
            continue;
    //END;
  this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
  }
}

谢谢! :)

2 个答案:

答案 0 :(得分:0)

因此,您似乎想要在不触及库代码本身的情况下更改Prototype的行为。

这不是问题,您可以在运行时替换setRequestHeaders函数。

在加载原型的<script>行之后但在您执行任何其他操作之前包含此内容。

// monkey-patch Prototype's Ajax request (the following is for Prototype 1.4!)
Ajax.Request.prototype.setRequestHeaders = function () {
  var requestHeaders =
    ['X-Requested-With', 'XMLHttpRequest',
     'X-Prototype-Version', Prototype.Version];

  if (this.options.method == 'post') {
    requestHeaders.push('Content-type',
      'application/x-www-form-urlencoded');

    /* Force "Connection: close" for Mozilla browsers to work around
     * a bug where XMLHttpReqeuest sends an incorrect Content-length
     * header. See Mozilla Bugzilla #246651.
     */
    if (this.transport.overrideMimeType)
      requestHeaders.push('Connection', 'close');
  }

  if (this.options.requestHeaders)
    requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);

  for (var i = 0; i < requestHeaders.length; i += 2) {
    if (requestHeaders[i].toLowerCase() === "connection") continue;
    this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
  }
};

答案 1 :(得分:0)

prototype.js 的更高版本(1.5+?)仅将 Connection 标头设置为非常旧的 Firefox 浏览器,因此此问题会随着升级而消失。