apphttp 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a4cb846a2215c4c862dd838caeb74ecb4af881c6f93b6a14228d9fb16df4bb38
4
+ data.tar.gz: 28ccc08e4bc6df11df826d6d294a6b6d6d19a7b8564da5bb98e0260c8403377e
5
+ SHA512:
6
+ metadata.gz: 0716725be6eac3ac5ce2ed7f5380dbf3ed82b35de5b54546c5cbd0ec121b92eca878e8f686c3e91843c8d3a9d20594a6e0e7423a8a43fa25c0afb985429b6c7a
7
+ data.tar.gz: f15ff123d1e6ba25acfc8273b18cb9f9d055b7443dc6e6de3dff2ce50fb842c98434bb62aae28b6ae0ab2cd54318a4aac59e620d7850fb9b8173435da30572f7
Binary file
Binary file
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: apphttp.rb
4
+
5
+ # desc: Makes it trivial to web enable a Ruby project
6
+
7
+ require 'socket'
8
+ require 'json'
9
+
10
+
11
+ class AppHttp
12
+
13
+ def initialize(app, host: '0.0.0.0', port: '9232', debug: false)
14
+ @app, @host, @port, @debug = app, host, port, debug
15
+ end
16
+
17
+ def start
18
+
19
+ server = TCPServer.new(@host, @port)
20
+
21
+ while (session = server.accept)
22
+
23
+ raw_request = session.gets
24
+ request = raw_request[/.[^\s]+(?= HTTP\/1\.\d)/].strip
25
+
26
+ result,content_type = get(request)
27
+ puts 'content_type: ' + content_type.inspect if @debug
28
+
29
+ if result then
30
+ response = result
31
+ else
32
+ response = "404: page not found"
33
+ content_type = 'text/plain'
34
+ end
35
+
36
+ session.print "HTTP/1.1 200 OK\r\nContent-type: #{content_type}\r\n" +
37
+ "Content-Length: #{response.bytesize}\r\n" +
38
+ "Connection: close\r\n"
39
+ session.print "\r\n"
40
+ session.print response
41
+ session.close
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def get(s)
48
+
49
+ args = []
50
+
51
+ if s.count('/') > 1 then
52
+
53
+ name, args = *s.split('/')[1..-1]
54
+
55
+ else
56
+
57
+ name, raw_params = s[/(?<=^\/).*/].split('?',2)
58
+
59
+ if raw_params then
60
+
61
+ raw_pairs = raw_params.split('&')
62
+
63
+ h = raw_pairs.inject({}) do |r,x|
64
+ key,value = x.split('=',2)
65
+ r.merge(key.to_sym => value) if value
66
+ end
67
+
68
+ return unless h
69
+
70
+ h2 = h.inject({}) do |r,x|
71
+
72
+ if x.first.to_s =~ /^arg/ then
73
+ args << x.last
74
+ else
75
+ r.merge!(x.first => x.last)
76
+ end
77
+ r
78
+ end
79
+
80
+ args << h2 if h2.any?
81
+
82
+ end
83
+
84
+ end
85
+
86
+ if @app.respond_to? name.to_sym then
87
+
88
+ begin
89
+ r = @app.method(name.to_sym).call(*args)
90
+ rescue
91
+ r = ($!).inspect
92
+ end
93
+
94
+ case r.class.to_s
95
+ when "String"
96
+ [r, 'text/plain']
97
+ when "Hash"
98
+ [r.to_json,'application/json']
99
+ else
100
+ [r.to_s, 'text/plain']
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: apphttp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - James Robertson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwOTAzMjIzMTMxWhcN
15
+ MjAwOTAyMjIzMTMxWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC+oSh7
17
+ hdE7JV9vwvzzMaRIegnH2rAtqShRteD9HT+kLnCf1BA9xtiMbw7RzQ/Jjf4Yraxe
18
+ rv+6p6H/F7tJVU7e8Fk1iOdsWrjnmki4/CgTXRkzYCvzPfUljh8YPFTRnhEbCWQF
19
+ x1vlHa4JrW5YAn+oanQk0ERGIKhUpUwrhJUe9g4lv70ZsMMCda2/dF2ahZP3et3K
20
+ IvZhXsterFmnjmd/dj9dw0O0qID4BdHQq800Ef7tCxfUkHbKGtTOOJJAQYpDvLV5
21
+ Xj+QPmIPKZ04X3ahLppdh5dQnzC7RgqBRIQhFHHqbEpXBYm00e+YjqZyx5QWwoOp
22
+ niecdDuF9dmNez9Sh7yDTy2szFfozzBLIE0ZF4HMFHz2kAEA2JDPKLxsNOU+CdP7
23
+ xTmTzgywYAwWD0li/4Ue76u08m81tqRs+tj9s5ST8YMgp8WnVVeXUW0TNooomYlt
24
+ JhhLHREQ/eYYrEAHrLMsbrKKlb49mYasjj6LHDg9x8elpvnVlNMxBIdapEsCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUhQG1SHas
26
+ 32352OSUufs4wfsIubAwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAWn71TPQhpAUPK9v5Qzy3L0EICAUqld9c1Ethx603
29
+ zJ82EQeX2+5MCkc4wrf+ZONogzO9wdxRshtRbom03XZ+fRM0N+nJGueevGQMIrUE
30
+ JbXadst7tOD60KLkhTrwAo28n09E0/gXrqcB5OvOAg+uqCuzDif3UBpZIZCPNAaf
31
+ jLf5KMYiSvUknSpCV8w/bS59aWtCgDjO+9subsyNODBlQaDWT2yu/plhzFRcEzx3
32
+ l8Oyw3F4csZEvUzQMEl4+SMgEzzQBlwHDT10gz7g5SmHAVz009ZckgG1L9aQdDx9
33
+ PnFaaP/XxRWmkF/elrq0JSHPet8jGAqrGaQTAGV1pPsbWwaoR+JyOZET6j7GtTbN
34
+ bJ+iJ3pIgiSIhTfzZ9J9RvOtWPZk2AKklX9KqF0I6JAzGgGiXehfhR1a39JBXC2S
35
+ T3+2ShaC/VvdBeBexhEAFVuJQhbgLRe7VGQLwJerumX7a5DpWRlBFfOCFuWl2yl/
36
+ NkzN8oYgB6CraruZ22EGLX8W
37
+ -----END CERTIFICATE-----
38
+ date: 2019-09-03 00:00:00.000000000 Z
39
+ dependencies: []
40
+ description:
41
+ email: james@jamesrobertson.eu
42
+ executables: []
43
+ extensions: []
44
+ extra_rdoc_files: []
45
+ files:
46
+ - lib/apphttp.rb
47
+ homepage: https://github.com/jrobertson/apphttp
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubygems_version: 3.0.1
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: Makes it trivial to web enable a Ruby project.
70
+ test_files: []
Binary file