<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: http code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 29 Aug 2008 02:00:04 GMT</pubDate>
    <description>DZone Snippets: http code</description>
    <item>
      <title>HTTP Client for vim</title>
      <link>http://snippets.dzone.com/posts/show/2227</link>
      <description>// HTTP Client for vim&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;" require vimproc( http://tokyo.cool.ne.jp/hopper2/ )"&lt;br /&gt;let g:HTTP = {}&lt;br /&gt;&lt;br /&gt;function g:HTTP.new(host, ...)&lt;br /&gt;  let self.host = a:host&lt;br /&gt;  if a:0 &gt;= 1&lt;br /&gt;    let self.port = a:1&lt;br /&gt;  else&lt;br /&gt;    let self.port = 80&lt;br /&gt;  endif&lt;br /&gt;  let self.headers = {'Host': self.host}&lt;br /&gt;  let self.query = {}&lt;br /&gt;  return deepcopy(self)&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;function g:HTTP.get(path)&lt;br /&gt;  return self.access(a:path, 'GET')&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;function g:HTTP.head(path)&lt;br /&gt;  return self.access(a:path, 'HEAD')&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;function g:HTTP.access(path, method)&lt;br /&gt;  call g:vimproc.load()&lt;br /&gt;  let sock = g:vimproc.socket_open(self.host, self.port)&lt;br /&gt;  call sock.write(self.make_header(a:path, a:method))&lt;br /&gt;  let re = ""&lt;br /&gt;  while !sock.eof&lt;br /&gt;    let re .= sock.read()&lt;br /&gt;  endwhile&lt;br /&gt;  call g:vimproc.unload()&lt;br /&gt;  return g:HTTP.Response.new(re)&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;function g:HTTP.make_header(path, method)&lt;br /&gt;  let hds = []&lt;br /&gt;  call add(hds, a:method . " " . a:path . " HTTP/1.0")&lt;br /&gt;&lt;br /&gt;  for key in keys(self.headers)&lt;br /&gt;    call add(hds, key . ": " . self.headers[key])&lt;br /&gt;  endfor&lt;br /&gt;&lt;br /&gt;  return join(hds, "\r\n") . "\r\n\r\n"&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;let g:HTTP.Response = {}&lt;br /&gt;function g:HTTP.Response.new(str)&lt;br /&gt;  call self.parse(a:str)&lt;br /&gt;  return deepcopy(self)&lt;br /&gt;endfunction&lt;br /&gt;&lt;br /&gt;function g:HTTP.Response.parse(str)&lt;br /&gt;  let lists = split(a:str, "\r\n\r\n")&lt;br /&gt;  let header_lists = split(lists[0], "\r\n")&lt;br /&gt;  let first = remove(header_lists, 0)&lt;br /&gt;  let self.code = matchstr(first, '[1-5]\d\d')&lt;br /&gt;  let self.headers = {}&lt;br /&gt;  for header in header_lists&lt;br /&gt;    let h = split(header, ': ')&lt;br /&gt;    let self.headers[h[0]] = join(h[1:], ': ')&lt;br /&gt;  endfor&lt;br /&gt;  let self.body = join(lists[1:], "\r\n\r\n")&lt;br /&gt;endfunction&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;let h = HTTP.new('www.bigbold.com')&lt;br /&gt;let res = h.get('/snippets/')&lt;br /&gt;echo res.headers&lt;br /&gt;if res.code &lt; 400&lt;br /&gt;  echo res.body&lt;br /&gt;else&lt;br /&gt;  echo 'error ' . res.code&lt;br /&gt;endif&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Thu, 22 Jun 2006 18:49:41 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2227</guid>
      <author>hotchpotch ()</author>
    </item>
  </channel>
</rss>
