小编Sco*_*ott的帖子

是否有任何浏览器支持以分块编码响应发送的预告片?

HTTP/1.1指定发送的响应Transfer-Encoding: chunked可以包括可选的预告片(即通常作为标题发送的内容,但出于任何原因无法在内容之前计算,因此它们可以附加到结尾),例如:

请求:

GET /trailers.html HTTP/1.1
TE: chunked, trailers
Run Code Online (Sandbox Code Playgroud)

响应:

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Trailer: My-Test-Trailer
D\r\n
All your base\r\n
B\r\n;
 are belong\r\n
6\r\n
 to us\r\n
0\r\n
My-Test-Trailer: something\r\n
\r\n
Run Code Online (Sandbox Code Playgroud)

此请求在TE标头中指定它期望chunked响应,并将trailers在最后一个块之后查找.

响应在指定Trailer标题拖车它将被发送的列表(在这种情况下,只有一个:My-Test-Trailer)

每个块都发送为:

  • 以十六进制表示的块大小(D= 13),然后是aCRLF
  • 块数据(All your base),后跟一个CRLF

零大小的块(0\r\n)表示身体的末端.

然后指定预告片(My-Test-Trailer: something\r\n),然后是决赛CRLF.

现在,从我到目前为止所阅读的所有内容来看,很少(如果有的话)使用预告片.这里和其他地方关于预告片的大多数讨论通常以"但你为什么还要使用预告片?"开头.

暂且不谈为什么,出于好奇,我一直试图模拟使用预告片的HTTP请求/响应交换; 但到目前为止,我还没有能够让它工作,我不确定我生成的响应是否有问题,或者是否(正如一些人所建议的那样)没有客户端寻找尾随的标题.

我试过的客户包括:curl,wfetch,Chrome + jQuery.

在所有情况下,客户端都会接收并正确地重建分块响应(All your base are …

sample http-1.1 chunked-encoding http-headers trailing

30
推荐指数
2
解决办法
5951
查看次数

正确的方法来处理304未在jQuery ajax中修改

从jQuery 1.5开始,根据XMLHTTPRequest的W3C规范,ajax方法现在可以通过调用success()处理程序正确处理304 Not Modified响应.这允许您的应用程序将请求视为成功,即使服务器实际上没有返回任何数据(因为您已经缓存了最新数据).

对于正常(未缓存)的GET请求,使用以下args调用成功处理程序:

  • data:{来自服务器的数据}
  • 状态:好的
  • jqXHR:
    • 状态:200
    • statusText:好的
    • responseText:{来自服务器的数据}

对于缓存的GET请求,使用以下args调用成功处理程序:

  • 数据:未定义
  • 状态:未修改
  • jqXHR:
    • 状态:304
    • statusText:notmodified
    • responseText:{来自缓存的数据}

(至少,这是在IOS 4.2中返回的方式,对于通过清单文件使用应用程序缓存的Web应用程序.我认为这对于大多数平台/浏览器上的常规浏览器缓存是一致的).

您可以看到,如果请求为200 OK,则仅填充"data"参数; 其中jqXHR.responseText总是填充数据,无论该数据是来自服务器(200 OK)还是来自缓存(304 Not Modified).

鉴于此,在大多数GET请求中,您的成功处理程序将要对您获得的数据执行某些操作,而不管它来自哪里,对于您的成功代码来说,最好总是使用jqXHR.responseText,而不是做这样的事情:

if ("notmodified" === status) {
  // do something with jqXHR.responseText
} else {
  // do something with data
}
Run Code Online (Sandbox Code Playgroud)

或者是否有一种情况,jqXHR.responseText 不会在成功处理程序中填充,但数据arg

我必须通过我的代码库并更改所有成功处理程序(以前我在jQuery 1.4.2上,它总是返回数据,甚至从缓存中返回); 所以我只是想确保我以正确的方式处理它.(不要想达到目的,然后意识到我应该以另一种方式做到这一点).

jquery browser-cache

18
推荐指数
2
解决办法
2万
查看次数

在require.js中模拟全局窗口对象

  1. 我有一个使用window.applicationCache进行离线访问的Web应用程序.
  2. 我管理appCache的所有代码(例如,检查/更新/交换缓存)都封装在"缓存控制器"对象中.
  3. 我有单元测试来测试我的"缓存控制器"功能.为了测试,我暂时用我自己的模拟版本替换原生window.applicationCache对象(因为我只想测试我的代码,而不是浏览器appCache实现),例如.

    window.applicationCache = { /* my appCache mock */ };
    // unit tests run here. Code under test references window.applicationCache.
    
    Run Code Online (Sandbox Code Playgroud)

不久之前(大约是Chrome 16),这种方法非常有效.然后,Mac和Windows平台上的Chrome 17都删除了修补浏览器默认window.applicationCache属性的功能(虽然奇怪的是,它适用于Chrome for Linux适用于所有版本,包括Chrome 26).当时,我为此记录了一个Chromium bug ; 但不幸的是,错误报告仍被列为"未经证实".

无论如何,我只是将我的应用程序从传统的'browser globals'(即通过脚本标签加载*.js文件;所有JS对象都是全局的)移植到AMD风格的模块,使用require.js作为模块加载器.

AMD(或CommonJS)的一个好处是依赖注入,其中您的代码获取对任何依赖对象的本地引用,而不是依赖于全局引用,例如.

require(['foo'], function(Foo) {
  var bar = new Foo();
});
Run Code Online (Sandbox Code Playgroud)

...这使得对象模拟变得容易,因为您可以配置模块加载器在测试模式下为'foo'传递模拟对象.

我希望通过转移依赖注入,我可以解决我的applicationCache问题(因为传递到我的模块的'window'引用可以是全局窗口对象,也可以是模拟对象).

但是我不确定如何让require.js将'window'作为依赖项注入我的模块中?

是否有可能(可能使用shim配置?)来定义"窗口"模块; 然后可以将其传递给在全局"窗口"对象上运行的任何代码?所以我可以这样做:

require(['???'], function(window) {
  // 'window' here is the real window object, or for testing it's a mock window object
  window.applicationCache.update();
}); …
Run Code Online (Sandbox Code Playgroud)

window mocking requirejs

17
推荐指数
1
解决办法
4507
查看次数

使用粗糙或砂砾的git推的示例

我正在寻找一些代码示例,无论是坚固还是砂砾,都展示了如何做git push.

背景

我有耙任务deploy:stagingdeploy:production我用来部署我的应用程序.

我正在部署到heroku,所以这些任务基本上执行以下操作:

  1. 获取最新标签(例如git describe --abbrev=0)
  2. 将该标记所代表的版本推送到指定的远程(例如git push staging v1.00)
  3. 将版本存储在heroku配置var中(例如heroku config:add APP_VERSION=v1.00)

(还有一些检查,以确保我没有忘记在推之前创建一个新的标签等)

最初我使用来自Rakefile的系统调用来获取这些CLI命令; 然后我开始使用githeroku-api宝石.

然而git gem似乎被抛弃了(过去一年没有提交); 似乎Grit和坚固耐用现在是与Git合作的标准宝石.

不幸的是,由于缺乏文档,我无法弄清楚如何使用这些库中的任何一个进行git推送.

(在以下示例中,假设我正在推送的远程/分支是origin/master,并且已在本地repo中设置为远程)

从坚固开始:

$ irb
2.0.0-p0 :001 > require 'rugged'
 => true 
2.0.0-p0 :002 > repo = Rugged::Repository.new('/path/to/repo')
 => #<Rugged::Repository:0x007fe8b48821c0 @encoding=#<Encoding:UTF-8>> 
2.0.0-p0 :003 > remote = Rugged::Remote.lookup(repo, 'origin')
 NoMethodError: undefined method `lookup' for Rugged::Remote:Class
Run Code Online (Sandbox Code Playgroud)

现在为砂砾:

$ irb
2.0.0-p0 :001 …
Run Code Online (Sandbox Code Playgroud)

grit rugged

7
推荐指数
1
解决办法
1732
查看次数

当反应值是引用类型时,Svelte 输入绑定会中断吗?

(我是 Svelte 的新手,所以很可能我在这里做错了什么)

更新:我添加了第二个稍微不同的 REPL,它可以更好地演示问题。试试这个: https://svelte.dev/repl/ad7a65894f8440ad9081102946472544 ?version=3.20.1


我在尝试将文本输入绑定到反应值时遇到问题。

我正在努力用文字描述这个问题,所以希望所附 REPL 中问题的简化演示会更有意义。

https://svelte.dev/repl/6c8068ed4cc048919f71d87f9d020696?version=3.20.1

该演示在一个页面上包含两个自定义<Selector>组件。


第一个组件传递两个字符串值(“one”和“two”):

<Selector valueOne="one" valueTwo="two"/>
Run Code Online (Sandbox Code Playgroud)

单击输入字段旁边的按钮将设置selectedValue为这些值之一。

这反过来会触发以下反应式声明进行更新:

$: value = selectedValue
Run Code Online (Sandbox Code Playgroud)

输入字段绑定到此反应值:

<input type="text" bind:value>
Run Code Online (Sandbox Code Playgroud)

因此,单击“一”按钮将输入文本设置为“一”,单击“二”按钮将输入字段设置为“二”。

但重要的是,您仍然可以在输入字段中输入任何内容


第二个组件传递两个数组值:

<Selector valueOne={[1, "one"]} valueTwo={[2, "two"]}/>
Run Code Online (Sandbox Code Playgroud)

再次单击按钮设置selectedValue为其中之一。

然而,这次反应式声明取决于数组元素:

$: value = selectedValue[1]
Run Code Online (Sandbox Code Playgroud)

一切都像以前一样工作,只是现在您根本无法再在输入字段中键入内容

所以问题是 - 为什么<input bind:value>这两者的行为不同:

$: value = aString
Run Code Online (Sandbox Code Playgroud)

$: value = anArray[x]
Run Code Online (Sandbox Code Playgroud)

svelte-3

5
推荐指数
1
解决办法
4880
查看次数