POST请求时返回HTTP 417错误

某些网络情况下,当执行POST请求时,会收到一个错误:

The remote server returned an error: (417).

当使用HTTP/1.1 协议进行POST请求时,会在request header里默认增加一项Expect:100-continue,以通知http服务器,在post前,先发一个只有header的请求到目标服务器询问是否可以接收POST过去的数据,如果可以,目标服务器返回100来通知客户端可以继续POST数据。

出现此错误的原因是,代理服务器错误识别目标服务器为HTTP1.0协议不支持100-continue特性,会自动给客户端返回417错误。

解决此方法是,

  • 设置代理服务器正确识别目标服务器的http协议版本;
  • 客户端设置不做询问,直接POST数据过去,不管服务器端是否准备好;

设置代理服务器的方式略。说一下客户端设置的解决方式。

事实上客户端只要在header里指定下Expect不等于100-continue,就可以跳过询问过程。

LINUX/PHP下是这样的。

Windows/ASP.NET下可通过web.config配置或C#代码里设置:

web.config:

C#:

httpWebRequest.ServicePoint.Expect100Continue = false;

附Expect:100-continue的http1.1协议说明:

对HTTP/1.1代理服务器的要求:
— 若代理服务器接到一个请求,此请求包含值为”100-continue”的Expect请求头域,并且代理服务器可能知道下一站点的服务器遵循HTTP/1.1或更高版协议,或者不知道下一站点服务器的HTTP版本,那么它必须包含此Expect头域来转发此请求。
— 若代理服务器知道下一站点服务器版本是HTTP/1.0或更低,则它不能转发此请求,并且它必须以417(期望失败)状态响应。
— 代理服务器应当维护一个缓存,以记录最近访问下一站点服务器的HTTP版本号。
— 若接收到的请求来自于版本是HTTP/1.0(或更低)的客户端,并且此请求不含值为”100-continue”的Expect请求头域,那么代理服务器不能转发100(继续)响应。

http之100-continue

1、http 100-continue用于客户端在发送POST数据给服务器前,征询服务器情况,看服务器是否处理POST的数据,如果不处理,客户端则不上传POST数据,如果处理,则POST上传数据。在现实应用中,通过在POST大数据时,才会使用100-continue协议。

2、客户端策略。

1)如果客户端有POST数据要上传,可以考虑使用100-continue协议。加入头{“Expect”:”100-continue”}

2)如果没有POST数据,不能使用100-continue协议,因为这会让服务端造成误解。

3)并不是所有的Server都会正确实现100-continue协议,如果Client发送Expect:100-continue消息后,在timeout时间内无响应,Client需要立马上传POST数据。

4)有些Server会错误实现100-continue协议,在不需要此协议时返回100,此时客户端应该忽略。

3、服务端策略。

1)正确情况下,收到请求后,返回100或错误码。

2)如果在发送100-continue前收到了POST数据(客户端提前发送POST数据),则不发送100响应码(略去)。

 

 

参照/引用:

  1. Expect:100-Continue & HTTP 417 Expectation
  2. http之100-continue
  3. HTTP详解(3)-http1.0 和http1.1 区别
  4. Expect:100-continue
  5. ServicePointManager Class
  6. http1.1协议

MySQL 5.6安装必备

1,停止mysqld服务
/sbin/service mysqld stop

2,复制数据库到新目录
cp -R /usr/local/mysql/data/* /data/mysqldata/

3,赋于mysql目录权限
chown -R mysql:mysql /data/mysqldata/

4,修改mysql配置文件
vim /etc/my.cnf
#datadir = /usr/local/mysql/data/
datadir = /data/mysqldata/

5,启动mysqld服务
/sbin/service mysqld start

用ps -ef |grep mysql 命令查看mysql进程
–datadir已经是新目录了

 

登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下:

1、在[client]字段里加入default-character-set=utf8,如下:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8
2、在[mysqld]字段里加入character-set-server=utf8,如下:
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server=utf8
3、在[mysql]字段里加入default-character-set=utf8,如下:
[mysql]
default-character-set=utf8
使用SHOW VARIABLES LIKE ‘character%’;查看,发现数据库编码全已改成utf8。
创建数据库时指定编码:
create database db_name character set =utf8;

iOS9正式版固件官方下载大全

iPhone

iPhone4,1_9.0_13A344_Restore:iPhone4S:A1387(电信版&国际版);A1431(联通专用型号)

iPhone5,1_9.0_13A344_Restore:iPhone5:A1428 – 3G+4G+GSM

iPhone5,2_9.0_13A344_Restore:iPhone5:A1429;中国电信定制版-A1442 – 3G+4G+GSM+CDMA

iPhone5,3_9.0_13A344_Restore:iPhone5c:A1532 A1456 GSM

iPhone5,4_9.0_13A344_Restore:iPhone5c:A1516 A1526 A1529 A1507国际版

iPhone6,1_9.0_13A344_Restore:iPhone5s:A1453 A1533

iPhone6,2_9.0_13A344_Restore:iPhone5s:A1518 A1528 A1530 A1457国际版

iPhone7,1_9.0_13A344_Restore:iPhone 6 Plus

iPhone7,2_9.0_13A344_Restore:iPhone6

iPad

iPad2,1 (产品型号:A1395 iPad 2 Wi-Fi )

iPad2,2 (产品型号:A1396 iPad 2 Wi-Fi+3G+GSM )

iPad2,3 (产品型号:A1397 iPad 2 Wi-Fi+3G+GSM+CDMA )

iPad2,4 (产品型号: iPad 2 Mid 2012)

iPad2,5 (产品型号:A1432 – iPad mini 1G Wi-Fi )

iPad2,6 (产品型号:A1454 – iPad mini 1G Wi-Fi+3G+4G+GSM )

iPad2,7 (产品型号:A1455 – iPad mini 1G Wi-Fi+3G+4G+GSM+CDMA )

iPad3,1 (产品型号:A1416- iPad 3 Wi-Fi )

iPad3,2 (产品型号:A1403- iPad 3 Wi-Fi+3G+GSM+CDMA )

iPad3,3 (产品型号:A1430- iPad 3 Wi-Fi+3G+GSM )

iPad3,4 (产品型号:A1458 – iPad 4 Wi-Fi )

iPad3,5 (产品型号:A1459 – iPad 4 Wi-Fi+3G+4G+GSM)

iPad3,6 (产品型号:A1460 – iPad 4 Wi-Fi+3G+4G+GSM+CDMA )

iPad4,1 (产品型号:A1474 iPad Air Wi-Fi )

iPad4,2 (产品型号:A1475 iPad Air蜂窝版)

iPad4,3 (产品型号:A1476 iPad Air TD红旗蜂窝版)

iPad4,4 (产品型号:A1489 iPad mini Retina Wi-Fi )

iPad4,5 (产品型号:A1490 iPad mini Retina蜂窝版)

iPad4,6 (产品型号:A1491 iPad mini Retina TD红旗蜂窝版)

iPad4,7 (产品型号:A1599 iPad mini 3 Wi-Fi版)

iPad4,8 (产品型号:A1600  iPad mini 3蜂窝版)

iPad4,9 (产品型号:A1601 iPad mini 3含TD红旗蜂窝版)

iPad5,3 (产品型号:A1566 iPad Air 2 Wi-Fi版)

iPad5,4 (产品型号:A1567 iPad Air 2全网蜂窝版)

iPod

iPod touch 5G

iPod touch 6

idea 14找不到设置tomcat的解决办法

idea 14的设置里默认是找不到Application servers的,如图:

QQ截图20150911191607

原因是idea 14默认把这一设置界面的插件给禁用了(脑残),先开启:

windows按ctrl+shift+A,mac按command + shift+A,弹出输入框

2

 

然后会列出相关的,点击application servers view,进入插件设置页面:

3

你会发现application servers view被禁用了,还有其他很多设置相关的插件,打钩,启用,重启,一切正常了。

idea 14序列号生成(转)

以上代码存为keygen.java,

控制台执行javac keygen.java

再执行 java keygen name

当ctrip.com挂掉时,我在想什么

携程(ctrip.com)在创始人梁建章2013年回归后,一直是一收一路,在资本运作上面与BAT比,有过之而无不及,呈现无坚不摧的趋势。前不久在收购了艺龙后,携程可以说暂时不受BAT控制了,所以可以说,梁建章确实是个牛逼的人。

突然有一天,携程除了首页空白可以访问以外,其他链接全部无法访问了。在这么火热的围观中,google和百度等搜索引擎会做什么?按照网站不稳定会降权来看,针对这种大面积网站瘫痪是不是应该先把ctrip.com这个网站先k掉?至少收录量一天减个80%没问题吧? 8-O 请原谅我深深的恶意……

幸好那些在携程订机票,定酒店的用户在线下可以几乎不受影响;CCTV今天刚爆出旅游网站投诉有3成是携程的,这说明携程挂掉了,其他平台的下单量会暴涨很多,闷声发大财的节奏(有人评论说,CCTV快滚出互联网)。

接着携程在首页挂连接给艺龙网导流,后来艺龙收到这么重的大礼(10G)也出现问题了,这说明市场老大的地位和老二差距蛮大的,老大给老二分点羹老二就被撑死了。

接着数据库被删的说法有了,7级开发总监的说法也有了,因为携程把服务全部迁到了XX云,拉运维仇恨的说法也有了。姑且不论真假,我的感触是,现在的互联网世界,黑客真的是比较成熟了,大部分的网站瘫痪都和黑客没关系。从这方面来讲,黑客做事比员工小心,理性,也更有责任感(此处应该有掌声)。发生这样的事情,难道说明携程的管理水平很低?别忘了携程近2年的逆转,完全是管理层战略上的把控出色;那就是携程的技术人员很业余?但明明他们还刚分享过自动化部署啊,在我们还规定运维必须手动部署截屏的时候,人家已经早就自动化了,要说业余也要先看看自己身后的环境怎么样 :oops: 那就只能证明他们的技术平台有问题了,怎么会这么方便的删除全站?怎么会这么方便的删除全站?怎么会这么方便的删除全站?念三遍,技术的便捷性也辅助造成了这样的结果,所以如果在人性/人事的方面追究责任比较难的话,那windows/.NET只能躺枪了,几个月后开始转型Java不要意外。

“黑天鹅事件”隐喻那些意外事件:它们极为罕见,在通常的预期之外,在发生前,没有任何前例可以证明,但一旦发生,就会产生极端的影响。那这次就是明显的黑天鹅事件。在这个没有信仰、信用缺失、法律又缺乏权威的社会,企业发展没有安全感,对员工KPI的考核有很多种,对人才的选拔测评也有很多种,唯独对员工的情绪检测是空白,是零;管理的本质是管人,当人的情绪出现问题,管理就是失控的;这也说明几乎所有的企业管理无论多么高效和完备,在人上面都是存在黑天鹅风险的。

但是,还是不要删数据库和网站的吧,万一别人刚订房支付中还没跳转呢?  :-x

Python3 安装

关于上面的make -j4参数,网络上有以下解释:

$ make -jn
Here, n is the number of jobs to spawn. Usual practice is to spawn one or  two jobs per   processor. For example, on a 16-core machine, you might do:
$ make -j32 > /dev/null
make -j4 即同时编译并发数,一般等于CPU内核数即可,对于IO密集的可以二倍于CPU内核数。

 

快速使用nuget恢复依赖类库

PM> Install-Package NuGetPowerTools Successfully installed ‘NuGetPowerTools 0.28’. ********************************************************************************** INSTRUCTIONS ********************************************************************************** – To enable building a package from a project use the Enable-PackageBuild command – To enable restoring packages on build use the Enable-PackageRestore command. – When using one of the above commands, a .nuget folder will been added to your solution root. Make sure you check it in! – For for information, see https://github.com/davidfowl/NuGetPowerTools ********************************************************************************** PM> Enable-PackageRestore Attempting to resolve dependency ‘NuGet.CommandLine (≥ 1.4)’. Successfully installed ‘NuGet.CommandLine 1.4.20615.182’. Successfully installed ‘NuGet.Build 0.16’. Copying nuget.exe and msbuild scripts to D:\Code\StarterApps\Mvc3Application\.nuget Successfully uninstalled ‘NuGet.Build 0.16’. Successfully uninstalled ‘NuGet.CommandLine 1.4.20615.182’. Don’t forget to commit the .nuget folder Updated ‘Mvc3Application’ to use ‘NuGet.targets’ Enabled package restore for Mvc3Application

 

 

source:http://blog.davidebbo.com/2011/08/easy-way-to-set-up-nuget-to-restore.html