Sheet 1
http-proxy-cache-server
  twisted-proxy prototype
    python细节
      raise语句 主动引发 异常
      atoi & itoa
        int_value = int(str_value)
        str_value = str(int_value)
      with ... as ...
        with controlled_execution() as thing:
some code
          with open("x.txt") as f:
data = f.read()
do something with data
      pass语句:
        空语句，什么也不做
      循环语句语法
        遍历字符串每个字符
          for letter in word:
        遍历数组元素
          for word in words:
        for（int i = 0； i < 10; i += 2）
          for num in range(0, 10, 2):
        index
          for index in range(len(words)):
      str连接方式
        最原始的字符串连接方式：str1 + str2
        python 新字符串连接语法：str1, str2
        奇怪的字符串方式：str1 str2
        % 连接字符串：‘name:%s; sex: ’ % ('tom', 'male')
        字符串列表连接：str.join(some_list)
      FILE I / O
        raw_input([prompt])
          从标准输入读取一个行，并返回一个字符串
        input([prompt])
          raw_input([prompt]) 函数基本可以互换
          input会假设输入是一个有效的Python表达式
            区别
          返回运算结果
        open()
          file object = open(file_name [, access_mode][, buffering])
        fileObject.write(string);
        fileObject.read([count]);
        fo.close()
        position = fo.tell();
          # 查找当前位置
        position = fo.seek(0, 0);
          # 把指针再次重新定位到文件开头
      静态方法 & 类方法描述
        @classmethod #类方法修饰符
        @staticmethod #静态方法描述
      try...except...finally
      dict & json解析
        print dic[key]
        print type(dic)
        print dic['tom']
        dic['lilei'] = 99
        print dic.keys() # 返回dic所有的键
        print dic.values() # 返回dic所有的值
        print dic.items() # 返回dic所有的元素（键值对）
        dic.clear() # 清空dic，dict变为{}
        del dic['tom'] # 删除
      str操作
        去空格及特殊符号
          s.strip() .lstrip() .rstrip(',')
        查找字符
          sStr= 'strchr'
          sStr = 's'
          nPos = sStr1.index(sStr)
          print nPos
        比较字符串
          print cmp(sStr1,sStr)
        扫描字符串是否包含指定的字符
          print len(sStrand sStr)
    twisted相关
      简介
      twisted vs nodejs
      异步编程
        使用Twisted时，避开使用os.system,避免阻塞
      常用twisted回调接口
        Transports
          代表一个可以收发字节的单条连接
            tcp连接
            udp连接
            管道
          为该连接，处理具体的异步I/O操作细节
          常用函数
            client
              getHost
                数据所属的服务器信息
            server
              loseConnection
                关闭连接
              write
                发送数据
        Protocols
          简介
            该对象实现协议内容
            一个Protocols的实现，对应一个具体网络协议的实现
            每一个对象，为每一个具体连接（Transport）提供协议解析
            每建立一条Transport连接，均需要一个protocols实例
          常用回调函数
            client
              makeConnection
                回调被调用时，将传入一个Transports实例，作为参数
                该transport就是protocols将要使用的连接
                流程图
              dataReceived
                收到数据后的回调方法
                该函数调用了底层函数doRead()
                回调过程
            server
              connectionMade
                连接创建后被回调
        Protocol Factories
          简介
            每个连接有自己的protocol
            创建连接的工作要交给twisted来完成
            产生Protocol Factories
          常用回调函数
            client
              buildProtocols
                返回一个新protocol实例
                为新连接创建对应协议
                流程图
        ClientFactory
          简介
            连接在数据接收完毕后，protocols会通知该对象
              激活回调方法connectionLost
                transport连接关闭时
              同时关闭连接
              回调过程
          常用成员变量
            client
              deferred
                一旦我们获取到data后，deferred会以返回data而被激活
                没有连接到服务器上时，deferred会以返回一个failure被激活
          常用回调函数
            connectionLost
              当连接关闭时，该函数被回调
              参数：reason
                说明连接是被安全关闭还是出错关闭
        ServerFactory
          简介
            存储要发送的数据
          常用回调函数
        http web开发
          HTTPChannel
          HTTPFactory
          Request
      twisted server连接图
  http proxy基本原理
    http method:
      get
      connect
  download & cache
    实现方法
      twisted receveBuff & write file
      python调用shell，使用wget或curl命令
      urllib &urllib2
        urllib
          提供urlencode的方法
          可接收url
          不可接收Request对象
        urllib2
          既可接收url，又可接受Request对象
    http range解析
      header range格式
        request
          表示头500个字节：Range: bytes=0-499
          表示第二个500字节：Range: bytes=500-999
          表示最后500个字节：Range: bytes=-500
          表示500字节以后的范围：Range: bytes=500-
          第一个和最后一个字节：Range: bytes=0-0,-1
          同时指定几个范围：Range: bytes=500-600,601-999
        response
          Content-Range: bytes 0-499/1234
      linux http工具
        wget
        curl
          --header
            curl --header "Range: bytes=0-20000" "url" -o part1
            curl --header "Range: bytes=20001-36907" "url" -o part2
            cat part1 part2 >> test1.png
          -r
            curl -r 0-20000 "url" -o part1
            curl -r 20001-36907 "url" -o part2
            cat part1 part2 >> test2.png
  目标分析
    了解twisted框架常用回调函数
    使用python urllib实现一个demo
    将demo整合进twisted中
    将访问的请求写入到一文件中
    每次request时，先扫描文件有木有相同request
  工厂模式
    详见有道云笔记
A CONNECT request urges your proxy to establish an HTTP tunnel to the remote end-point. Usually is it used for SSL connections, though it can be used with HTTP as well (used for the purposes of proxy-chaining and tunneling)
CONNECT www.google.com:443
The above line opens a connection from your proxy to www.google.com on port 443. After this, content that is sent by the client is forwarded by the proxy to www.google.com:443.
If a user tries to retrieve a page http://www.google.com, the proxy can send the exact same request and retrieve response for him, on his behalf.
With SSL(HTTPS), only the two remote end-points understand the requests, and the proxy cannot decipher them. Hence, all it does is open that tunnel using CONNECT, and lets the two end-points (webserver and client) talk to each other directly.