automation upload file 攻破 zk 外壳

  做完整个任务,如同做了一个长长的噩梦。

  周二,kelvin 同我讲 automation upload program 需要我们project team handle。我就知道麻烦事来历。但是由于我对http协议比较了解,我猜想所有broswer 做得到的事情都是可以用java 重复实现的。只是公司还没有人坐过这样的任务,所以心里很悬,任务允许的时间很短。我必须在5日内完成。

  周二(Mar 5)算是正式开工做 automation upload program。从需求上了解这个program 必须具备几个功能

 1. 模拟浏览器发送请求到server

 2.必须能够简单分析 response text 从中获知 server 处理文件是否成功 有无 warning message。

 3. 处理的summay 和 logger,同 file handling

4. 能够兼容 http 协议同https 协议

  处于对第四点考了吧,不敢轻易开工。在google 上获知 apache common httpClient 包可以协助我们做到发送和获取浏览器请求的功能,并且能够在http 和https 协议下工作。

  有了强大的lib 支持 是以后工作能够顺利解决问题,完成任务的关键。

  拦路虎1 security 问题

  据我所知,在broswer 同server 沟通主要是按照浏览器的cookie 同server 的session 匹配。cookie 是验证登陆用户的唯一标示。那么只要在header 上假如 cookie ,就可以简单地解决登陆问题。按照这个思路,但是第一次测试不是很顺利,每次request,zk 返回的response error code 410.超时登陆问题。zk 的阻扰 困惑我很久,百思不得其解。

  周二遗留的问题:header里面set了cookier字段,为什么response 回来的text种种迹象标示timeout ,uploadaction 也是返回:

 if(evl(window)){

    exc(timeout());

}

  周三的太阳照常升起,假如cookie 问题不解决,那么所有工作将无法完成。在google同baidu帮助下,我尝试使用不同httpClient实现方式 升值使用了 httpclient register login scheme 但是返回结果都是同样的error

  为了验证我的cookie才行是正确的,我必须从头开始检查我的工作。重新核对了request param同action ur 已经 header 参数。在返回研究 broswer upload file 一系列的action中,确定不止一个action 同upload 有关联,我怀疑zk会识别我request的action来判别action 的可执行与否,我的猜想是正确的。我连同popup upload win action 写入代码段。研究有了进展,popup win action 成功返回text是同浏览器完全一样的text。 由此正式我cookie 猜想是正确无误的。用反例证明,如果我logout 当前cookie user 再次request popup win ction,返回的text 就是redirect到login 页面。 顿时心中一股安定。cookie 方案正确。

  拦路虎2 upload file to server

  周三正式了cookie 是正确的,但是疑云重重,为何只是一只action 有效,其他全部failed。 返回的text 与周二完全没有变化。工作的线索断了。我必须重头开始检查工作,是不是按照我的想法在实现。重新检查 request header, request param,request url。 发现有些参数是会变化的,这是 zk 在 client 段 有函数在搞鬼,每一次post 出去upload 的 uuid 应该是不同的。 从此有了 ZK-SID ,workingUUid,importRowDataId,popupBroserWindowId  这四个重要的参数,他们的变化是有规律的,按照server返回的text去做不同的调整。到了周三,kevlin 已经开始催我其他工作,但是不愿意放低手头的工作,以为一旦放低,意味着要很长时间才能继续,但是如果这项任务失败,我将输得一趟糊涂,不但没有做到 automation 而且 其他工作也被拖累,更重要是自己信心被打败。

  中午吃完饭,在4项参数变化的情况下,action 有一只开始变化,开始显示 error,在追踪server log 显示 zk 找不到 content id。 而这个content id 是由主action upload file 返回来的。这一切说明 我的问题卡在 主action upload file 上面。

  加班到晚10点归家路上非常烦恼,开始反思一天的工作,虽然我已经抓到所有同upload 有关的action 并且set好了param 肉眼看起来是set好了,但是action respose同周二是没有质的区别。我虽然抓到了多个action,但是还不能很清楚地区分他们之间的联系和各自的工作目的 这个也是有疑问的。 我最怀疑的是 server upload file 有问题,吃不进file ,但是 httpClient code 下面我使用多种方式去 post file 依然无果,我相信 httpClient 不会这么傻逼个功能都做不好吧。 开始怀疑 ZK 是否会根据其中的一系列action 接收顺序去处理upload action。或者这是和线程相关,3个action 必须在限定时间内到达zk server 否则 410 timeout,这个解释听起来似乎有点道理。匆匆回家,开始改造post action ,换成线程方式,结果令人伤心,response text 依旧不变。

  周四激情变淡,但是工作还是得继续,我安慰自己,假如中午做不成功,就和kelvin要求resource 或者请求其他高人帮手了。其实这是我最不愿意看到的结果。不停地调试代码,改变实现方式,goole 和百度,都是无果而终。在一次检查 server log时候打开了 tomcat server 自身log,一堆的exception , no boundary found。立即google, 非常兴奋,在header上加上了 boundary,upload file action response text 立即变化,同浏览器一样。激动得想哭。

  然而这个问题的解决不是解决最后的问题。 upload file action return text 是和浏览器一样,但是其他些action 依旧报错。看起来有问题的问题都解决了,但是结果还不是自己想要的,这是最毁灭性的打击。

  

  拦路虎3 空格

  周四有了重大进展,但是file依旧没有upload 成功,由于这个结构钢,我们可以否认前面所有的进展,所有问题的解决都是假象,这条路是行不通的,andy 也担心我行到最终发觉是死胡同,项目的压力越来越大。坚信自己的初衷,浏览器能做的,java一定能做到,做不到就是我的问题了。

  在工作没有进展,没有了线索,就得重复检查进展,以前的解决方案是不是正确。引入 sniff 软件进行 request 包数据的检查,firefox 的firebug 已经满足不了我的需求了。在sniff 帮助下 我改变 整个 httpcilent post action 的参数 header 同url 同浏览器都已经不可区分了,但是action response text 依旧是exception。我要奔溃了。

  周五 不得不做完项目紧急的其他事情,暂缓了 automation 的工作。

  周六连续地匹配 sniff  参数,coding 无果而终。不断地review使我很清晰zk 不同 param中 id 同 这一系列upload的作用了

  周日已经开始厌倦,但这是工作,签名已经很多进展,那种突破难点时候的心情依然激励我。下午2点时候,在review code 时候,发现我set boundary 后面带着个空格。难道我的问题都是这个空格引起的? 在删除空格测试,我激动得要喊出来了,file 成功地upload 到了 server temp folder。

  后面的几个小问题手到擒来,注意了字符串的空间后,成个upload framework 瞬间完成。

  3月11日玩是auto upload program 的初夜,希望你能连续工作8小时以上。度过一晚。

                                                                                                                                   写于3月11日 香港沙田

  

猜你喜欢

转载自shermenn.iteye.com/blog/1831537
今日推荐