mochiweb与cowboy使用json

服务器原来的socket实现机制更改为ranch了,这样可以专注维护自己的事情了。其实,之 所以采用ranch是因为我使用bigwig来在网页中对状态进行监控,而bigwig使用的是cowboy 和ranch,cowboy也使用的是ranch,这样,代码中就存在了两个http的框架,mochiweb和 cowboy,而看了ranch的结构,感觉很不错,就将socket服务器也转换为基于ranch架构了。 mochiweb单独一个模块来进行http服务感觉重复,因此就决定将mochiweb从模块中去除,转 为cowboy。

一切基本都很顺利,但服务器和网页的数据交互总是有问题,数据交互使用的是json格式, mochiweb带有自己的将erlang数据转换为json的方法,cowboy使用的jsx,代码分别为

mochijson2:encode([{success, true}, {root, []}]),
jsx:term_to_json([{success, true},{root, []}]),

看上去很一致吧,我也以为不会有什么大问题,然后碰到了下面的格式

Data=[{"ID", 1},
      {<<"name">>, <<"zhangsan">>
}].

mochiweb侧输出的是:

“{\”ID\”:1,\”name\”:\”zhangsan\”}”

而jsx侧输出的是:

“[{\”_type\”:\”tuple\”,\”data\”:[\”ID\”,1]},{\”_type\”:\”tuple\”,\”data\”:[\”name\”,\”zhangsan\”]}]”

如果想要和mochiweb输出表现一致的话,Data需要使用下面的方式:

% 方法1(推荐)
Data=[{<<"ID">>, 1},
      {<<"name">>, <<"zhangsan">>
}].
%方法2
Data2=[{'ID', 1},
      {'name', <<"zhangsan">>
}].

很明显不是我想要的数据,通过调查,发现jsx有以下的限制:

作为json索引的字段名称,不能是字符串list,如果为atom或者binary,则和mochiweb的输出 一致,也基本上和理解上一致,如果为字符串list,则jsx认为这个是一个数组,这可能是 因为erlang并没有真正意义上的字符串,字符串在erlang中是用list表示的吧。

emacs的xml-rpc的小补丁一个,解决无法post到godaddy站点

接到电信总部通知,说根据XX规定,不允许我将域名绑到自己的宽带上,不然就停封帐号

算一算,绑定了好几周,只是最近为了学习org-mode,所以发了一大堆图片,然后就立 刻接到电话了,话说我找他们办事的时候就没这么快。

因此,我在godaddy买了个空间,整个过程还顺利,不一会就将所有的切换到新的空间上了

然后,测下速度,也还算满意,比我自己家里快。然后,接着使用emacs测试下看能否 正常发blog了。

悲剧出现, org2blog在登录的这一步,一直说404错误,而在我的其他的任何一个环境中测试,都很正常

找遍了网络,升级xml-rpc.el,配置服务器这个,配置服务器那个,修改xmlrpc.php,都找不到解决方式, 我甚至都给godaddy发送邮件,询问是不是服务器是不是有什么限制了,趁着等邮件的 时候,研究org2blog的代码调用,研究到xml-rpc.el,打开调试,看最终发送的是什么。然后使用 curl模拟发送,结果没想到curl竟然可以发送成功,然后各种测试,模拟,不管哪个头 标识,curl模拟下来都非常正常,但 emacs死活是不行

我非常的生气,后果很严重,于是,决定看看网络传输的到底是什么数据

下载windump(我在windows机器上,ubuntu 12.04上的那个emacs版本太低,还需要重新 配置),研究windump的使用方式,然后dump数据,分析emacs发送数据和curl的区别,真 的要弄瞎我的近视眼啊

一个字段一个字段的比较下来,都没问题,字段都一样,只是顺序不一样,我觉的这个不是问题

一遍又一遍,甚至我都想要测试回车符有没有影响了,突然,我注意到emacs比curl多了一个字段

“Connection: keep-alive”, 在curl这边,这个值只出现了一次,而在emacs这边,这 个值出现了两次,也就是说,某个地方设置了两次,难道这个?我都在怀疑自己的判断 了。

瞎猫碰死耗子吧,我修改了下xml-rpc.el,结果,它居然正常了。

看来问题就出现在两次”Connection: keep-alive”上,于是,就有了以下的补丁(我用 的是1.6.7,最新的可能是1.6.8)

diff --git a/xml-rpc.el b/xml-rpc.el
index 16c4cb1..bb23ecb 100644
--- a/xml-rpc.el
+++ b/xml-rpc.el
@@ -13,7 +13,7 @@
 ;; Keywords: xml rpc network
 ;; URL: http://emacswiki.org/emacs/xml-rpc.el
 ;; Maintained-at: http://savannah.nongnu.org/bzr/?group=emacsweblogs
-;; Last Modified: <Zhang_Ze 2009-12-15 16:51:25>
+;; Last Modified: <--==RIX==-- 2014-05-24 22:29:52>

 ;; This file is NOT (yet) part of GNU Emacs.

@@ -521,7 +521,7 @@ or nil if called with ASYNC-CALLBACK-FUNCTION."
          (url-request-coding-system xml-rpc-use-coding-system)
          (url-http-attempt-keepalives t)
          (url-request-extra-headers (list
-                                          (cons "Connection" "keep-alive")
+                                          ;(cons "Connection" "keep-alive")
                      (cons "Content-Type"
                                                 "text/xml; charset=utf-8"))))
      (when (> xml-rpc-debug 1)