shl 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/lib/shl.rb +42 -0
  2. data/lib/shl/request.rb +46 -0
  3. data/lib/shl/response.rb +23 -0
  4. metadata +80 -0
@@ -0,0 +1,42 @@
1
+ require 'uri'
2
+ require 'socket'
3
+
4
+ module SHL
5
+ HTTP_VERSION = "HTTP/1.1"
6
+ NEWLINE = "\r\n"
7
+
8
+ class OrderedHash < Hash
9
+ def initialize(initial_values)
10
+ initial_values.each do |key, value|
11
+ self[key] = value
12
+ end
13
+ end
14
+
15
+ def []=(key, value)
16
+ @order ||= []
17
+ @order << key
18
+ super
19
+ end
20
+
21
+ def each(&block)
22
+ @order.each do |key|
23
+ block.call(key, self[key])
24
+ end
25
+ end
26
+ end
27
+
28
+ module AttributeInitializer
29
+ def initialize(attributes={})
30
+ attributes.each do |key, value|
31
+ send("#{key}=", value)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ require 'shl/request'
38
+ require 'shl/response'
39
+
40
+ def SHL(attributes={})
41
+ SHL::Request.new(attributes).run
42
+ end
@@ -0,0 +1,46 @@
1
+ module SHL
2
+ class Request
3
+ attr_accessor :verb, :url, :headers, :body
4
+
5
+ include AttributeInitializer
6
+
7
+ def url=(url)
8
+ @url = URI.parse(url)
9
+ end
10
+
11
+ def path
12
+ @url.path == '' ? '/' : @url.path
13
+ end
14
+
15
+ def connection
16
+ @connection ||= TCPSocket.new(@url.host, @url.port)
17
+ end
18
+
19
+ def request_line
20
+ "#{verb.to_s.upcase} #{path} #{HTTP_VERSION}"
21
+ end
22
+
23
+ def headers
24
+ @headers||=OrderedHash.new([
25
+ ['Host',@url.host],
26
+ ['Connection','close']
27
+ ])
28
+ end
29
+
30
+ def serialized_headers
31
+ headers.map do |key, value|
32
+ "#{key}: #{value}"
33
+ end.join(NEWLINE)
34
+ end
35
+
36
+ def serialized_body
37
+ @body.to_s + NEWLINE
38
+ end
39
+
40
+ def run
41
+ connection.write([request_line,serialized_headers,serialized_body].join(NEWLINE))
42
+ connection.flush
43
+ Response.new(:io=>connection)
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,23 @@
1
+ module SHL
2
+ class Response
3
+ BUFFER_LENGTH = 4096
4
+
5
+ attr_accessor :io
6
+
7
+ include AttributeInitializer
8
+
9
+ def parsed
10
+ if @parsed.nil?
11
+ buffer = ''
12
+ while(data = io.read(BUFFER_LENGTH))
13
+ buffer << data
14
+ end
15
+ @parsed = buffer.split(NEWLINE*2)
16
+ end; @parsed
17
+ end
18
+
19
+ def body
20
+ parsed[1]
21
+ end
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shl
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Manfred Stienstra
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-04-18 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rake
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :development
33
+ version_requirements: *id001
34
+ description: " SHL is a really simple HTTP library.\n"
35
+ email: manfred@fngtps.com
36
+ executables: []
37
+
38
+ extensions: []
39
+
40
+ extra_rdoc_files: []
41
+
42
+ files:
43
+ - lib/shl.rb
44
+ - lib/shl/request.rb
45
+ - lib/shl/response.rb
46
+ homepage:
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options:
51
+ - --charset=utf-8
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
71
+ version: "0"
72
+ requirements: []
73
+
74
+ rubyforge_project:
75
+ rubygems_version: 1.8.15
76
+ signing_key:
77
+ specification_version: 3
78
+ summary: SHL is a really simple HTTP library.
79
+ test_files: []
80
+