Created
November 28, 2013 12:19
-
-
Save tylergannon/7690997 to your computer and use it in GitHub Desktop.
Use HTTParty gem for making HTTP requests over unix domain sockets.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
########################################################### | |
# net/socket_http.rb | |
########################################################### | |
module Net | |
# Overrides the connect method to simply connect to a unix domain socket. | |
class SocketHttp < HTTP | |
attr_reader :socket_path | |
# URI should be a relative URI giving the path on the HTTP server. | |
# socket_path is the filesystem path to the socket the server is listening to. | |
def initialize(uri, socket_path) | |
@socket_path = socket_path | |
super(uri) | |
end | |
# Create the socket object. | |
def connect | |
@socket = Net::BufferedIO.new UNIXSocket.new socket_path | |
on_connect | |
end | |
# Override to prevent errors concatenating relative URI objects. | |
def addr_port | |
File.basename(socket_path) | |
end | |
end | |
end | |
########################################################### | |
# sock_party.rb, a ConnectionAdapter class | |
########################################################### | |
require "net/http" | |
require "socket" | |
class SockParty < HTTParty::ConnectionAdapter | |
# Override the base class connection method. | |
# Only difference is that we'll create a Net::SocketHttp rather than a Net::HTTP. | |
# Relies on :socket_path in the | |
def connection | |
http = Net::SocketHttp.new(uri, options[:socket_path]) | |
if options[:timeout] && (options[:timeout].is_a?(Integer) || options[:timeout].is_a?(Float)) | |
http.open_timeout = options[:timeout] | |
http.read_timeout = options[:timeout] | |
end | |
if options[:debug_output] | |
http.set_debug_output(options[:debug_output]) | |
end | |
if options[:ciphers] | |
http.ciphers = options[:ciphers] | |
end | |
return http | |
end | |
end | |
########################################################### | |
# class MockSockParty, a really *nix-y HTTParty | |
########################################################### | |
class MockSockParty | |
include HTTParty | |
self.default_options = {connection_adapter: SockParty, socket_path: '/tmp/thin.sock'} | |
def party_hard | |
self.class.get('/client').body | |
end | |
end | |
########################################################### | |
# sock_party_spec.rb | |
########################################################### | |
require 'spec_helper' | |
describe SockParty do | |
it "should party until its socks fall off." do | |
puts MockSockParty.new.party_hard | |
end | |
end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@tylergannon, this is really useful! Would you mind telling me under what kind of licensing scheme (if any) you have made this code available? (i.e. public domain, MIT, GPL, etc.)? Thanks a lot!