Repository: martinbtt/net-http-spy
Branch: master
Commit: 73c30b3b2855
Files: 15
Total size: 12.3 KB
Directory structure:
gitextract__b7ldh8x/
├── Rakefile
├── VERSION
├── examples/
│ ├── fogbugz.rb
│ ├── google.rb
│ ├── twitter-calltrace.rb
│ ├── twitter-customlog.rb
│ ├── twitter-simple.rb
│ ├── twitter-verbose.rb
│ └── twitter-withbody.rb
├── lib/
│ └── net-http-spy.rb
├── net-http-spy.gemspec
├── readme.markdown
└── spec/
├── spec.opts
├── spec_helper.rb
└── spy_spec.rb
================================================
FILE CONTENTS
================================================
================================================
FILE: Rakefile
================================================
require "rubygems"
require "rake/gempackagetask"
require "rake/rdoctask"
begin
require 'jeweler'
Jeweler::Tasks.new do |gemspec|
gemspec.name = "net-http-spy"
gemspec.summary = "Ever wondered what HTTP requests the Ruby gem you are using to connect to a third party API is making? Use HTTP Spy to see what is going on behind the scenes."
gemspec.email = "martin@beyondthetype.com"
gemspec.homepage = "http://github.com/martinbtt/net-http-spy"
gemspec.description = "Ever wondered what HTTP requests the Ruby gem you are using to connect to a third party API is making? Use HTTP Spy to see what is going on behind the scenes."
gemspec.authors = ["Martin Sadler"]
gemspec.files.include Dir["examples/*.rb"] + ["readme.markdown"]
end
rescue LoadError
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
end
task :default => :spec
require "spec"
require "spec/rake/spectask"
Spec::Rake::SpecTask.new do |t|
t.spec_opts = %w(--format specdoc --colour)
t.libs = ["spec"]
end
# Generate documentation
Rake::RDocTask.new do |rd|
rd.main = "readme.markdown"
rd.rdoc_files.include("readme.markdown", "lib/**/*.rb")
rd.rdoc_dir = "rdoc"
end
desc 'Clear out RDoc and generated packages'
task :clean => [:clobber_rdoc, :clobber_package] do
rm "#{spec.name}.gemspec"
end
================================================
FILE: VERSION
================================================
0.2.1
================================================
FILE: examples/fogbugz.rb
================================================
# Just showing an example of something other than Twitter.
require 'rubygems'
require 'fogbugz-api' # sudo gem install austinmoody-fogbugz-api
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','spy'))
config = {:username => "yourusername",
:password => "yourpass",
:domain => "yourdomain.fogbugz.com"
}
Net::HTTP.http_logger_options = {:body => true, :trace => false}
@fogbugz = FogBugz.new(config[:domain],true) # create instance
@fogbugz.logon(config[:username],config[:password]) # logs into FogBugz and sets *token*
================================================
FILE: examples/google.rb
================================================
# Just showing an example of something other than Twitter.
# Garb lets you access the Google Analytics API
require 'rubygems'
require 'garb'
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','net-http-spy'))
Net::HTTP.http_logger_options = {:body => false, :trace => false, :verbose => false}
Garb::Session.login('yourgoogleusername', 'yourpassword')
================================================
FILE: examples/twitter-calltrace.rb
================================================
# See where the external API calls take place within the gem you are using with the :trace option
require 'rubygems'
require 'twitter'
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','net-http-spy'))
Net::HTTP.http_logger_options = {:trace => true}
Twitter::Search.new('httparty').each { |r| r }
================================================
FILE: examples/twitter-customlog.rb
================================================
# By default the logger outputs to STDOUT, it's easy to change this to a file if you like
# Great to capture and then use for testing with tools like FakeWeb when combined with :body => true
require 'rubygems'
require 'twitter'
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','net-http-spy'))
Net::HTTP.http_logger = Logger.new('twitter.log')
Twitter::Search.new('httparty').each { |r| r }
================================================
FILE: examples/twitter-simple.rb
================================================
# Simplist example. All you need to do is include the spy lib for it to start doing the right thing
require 'rubygems'
require 'twitter'
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','net-http-spy'))
Twitter::Search.new('httparty').each { |r| r }
================================================
FILE: examples/twitter-verbose.rb
================================================
# Net::HTTP has it's own logging/debug functionality. Turn on :verbose to show the full raw HTTP communication
require 'rubygems'
require 'twitter'
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','net-http-spy'))
Net::HTTP.http_logger_options = {:verbose => true}
Twitter::Search.new('httparty').each { |r| r }
================================================
FILE: examples/twitter-withbody.rb
================================================
# Display the full response/request body. Usually just the response code is shown.
require 'rubygems'
require 'twitter'
require File.expand_path(File.join(File.dirname(__FILE__),'..','lib','net-http-spy'))
Net::HTTP.http_logger_options = {:body => true}
Twitter::Search.new('httparty').each { |r| r }
================================================
FILE: lib/net-http-spy.rb
================================================
require 'net/https'
require 'logger'
require 'cgi'
# HTTP SPY
module Net
class HTTP
alias :old_initialize :initialize
alias :old_request :request
class << self
attr_accessor :http_logger
attr_accessor :http_logger_options
end
def initialize(*args, &block)
self.class.http_logger_options ||= {}
defaults = {:body => false, :trace => false, :verbose => false, :limit => -1}
self.class.http_logger_options = (self.class.http_logger_options == :default) ? defaults : self.class.http_logger_options
@logger_options = defaults.merge(self.class.http_logger_options)
@params_limit = @logger_options[:params_limit] || @logger_options[:limit]
@body_limit = @logger_options[:body_limit] || @logger_options[:limit]
self.class.http_logger.info "CONNECT: #{args.inspect}" if !@logger_options[:verbose]
old_initialize(*args, &block)
@debug_output = self.class.http_logger if @logger_options[:verbose]
end
def request(*args, &block)
unless started? || @logger_options[:verbose]
req = args[0].class::METHOD
self.class.http_logger.info "#{req} #{args[0].path}"
end
result = old_request(*args, &block)
unless started? || @logger_options[:verbose]
self.class.http_logger.info "PARAMS #{CGI.parse(args[0].body).inspect[0..@params_limit]} " if args[0].body && req != 'CONNECT'
self.class.http_logger.info "TRACE: #{caller.reverse}" if @logger_options[:trace]
self.class.http_logger.info "BODY: #{(@logger_options[:body] ? result.body : result.class.name)[0..@body_limit]}"
end
result
end
end
end
Net::HTTP.http_logger = Logger.new(STDOUT)
================================================
FILE: net-http-spy.gemspec
================================================
# Generated by jeweler
# DO NOT EDIT THIS FILE DIRECTLY
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
# -*- encoding: utf-8 -*-
Gem::Specification.new do |s|
s.name = %q{net-http-spy}
s.version = "0.2.1"
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Martin Sadler"]
s.date = %q{2009-12-05}
s.description = %q{Ever wondered what HTTP requests the Ruby gem you are using to connect to a third party API is making? Use HTTP Spy to see what is going on behind the scenes.}
s.email = %q{martin@beyondthetype.com}
s.files = [
"Rakefile",
"VERSION",
"examples/fogbugz.rb",
"examples/google.rb",
"examples/twitter-calltrace.rb",
"examples/twitter-customlog.rb",
"examples/twitter-simple.rb",
"examples/twitter-verbose.rb",
"examples/twitter-withbody.rb",
"lib/net-http-spy.rb",
"net-http-spy.gemspec",
"readme.markdown",
"spec/spec.opts",
"spec/spec_helper.rb",
"spec/spy_spec.rb"
]
s.homepage = %q{http://github.com/martinbtt/net-http-spy}
s.rdoc_options = ["--charset=UTF-8"]
s.require_paths = ["lib"]
s.rubygems_version = %q{1.3.5}
s.summary = %q{Ever wondered what HTTP requests the Ruby gem you are using to connect to a third party API is making? Use HTTP Spy to see what is going on behind the scenes.}
s.test_files = [
"spec/spec_helper.rb",
"spec/spy_spec.rb",
"examples/fogbugz.rb",
"examples/google.rb",
"examples/twitter-calltrace.rb",
"examples/twitter-customlog.rb",
"examples/twitter-simple.rb",
"examples/twitter-verbose.rb",
"examples/twitter-withbody.rb"
]
if s.respond_to? :specification_version then
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
s.specification_version = 3
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
else
end
else
end
end
================================================
FILE: readme.markdown
================================================
## About
Ever wondered what HTTP requests the Ruby gem you are using to connect to a third party
API is making? Use HTTP Spy to see what is going on behind the scenes.
## Installation
sudo gem install martinbtt-net-http-spy
## Example Usage
require 'rubygems'
require 'twitter'
gem 'net-http-spy'
require 'net-http-spy'
Twitter::Search.new('httparty').each { |r| r }
# Outputs...
-- : CONNECT: ["search.twitter.com", 80]
-- : GET /search.json?q=httparty
-- : BODY: Net::HTTPOK
See the examples folder for more.
## Further Options
Show the call trace to the originating line of code in the third party gem
Net::HTTP.http_logger_options = {:trace => true}
Output the body of the request
Net::HTTP.http_logger_options = {:body => true}
Show the full raw HTTP output
Net::HTTP.http_logger_options = {:verbose => true}
Change the logger. By default HTTP spy logs to STDOUT
Net::HTTP.http_logger = Logger.new('twitter.log')
## Bonus Points
Use it to grab sample data for FakeWeb = testing goodness.
## Notes
This is a pretty early release. I'm sure there is plenty that can be done to improve compatibility
as several libraries call Net::HTTP in a slightly different way.
Feel free to fork and send in pull requests/patches.
## Find Me
Martin Sadler (martin -- at -- beyondthetype.com)
* Blog: http://www.beyondthetype.com
* Follow: http://twitter.com/martinbtt
* Code: http://github.com/martinbtt
* Recommend: http://www.workingwithrails.com/person/5152-martin-sadler
================================================
FILE: spec/spec.opts
================================================
--format
progress
--colour
================================================
FILE: spec/spec_helper.rb
================================================
require 'rubygems'
gem 'rspec'
require 'spec'
require 'net/http'
require 'open-uri'
require 'twitter'
require 'mechanize'
require 'webmock/rspec'
include WebMock
LIVE = ENV['LIVE']
WebMock.allow_net_connect! if LIVE
require File.join(File.dirname(__FILE__), '..', 'lib', 'net-http-spy')
class DummyLogger
attr_accessor :lines
def initialize
reset!
end
def <<(msg)
@lines << msg
end
def info(msg)
@lines << msg
end
def reset!
@lines = []
end
end
================================================
FILE: spec/spy_spec.rb
================================================
require File.join(File.dirname(__FILE__), 'spec_helper')
# Bare bones spec to make sure the core functionality is working
describe "Net:HTTP Spying on" do
before(:all) do
Net::HTTP.http_logger = DummyLogger.new()
end
describe "a get request with default options" do
before(:all) do
stub_request(:any, "search.twitter.com/search.json?q=httparty").to_return(:body => "\{\"results\"\: 1\}", :status => 200) unless LIVE
Net::HTTP.http_logger_options = :default
Twitter::Search.new('httparty').fetch
end
it "should give the connection" do
Net::HTTP.http_logger.lines.should include("CONNECT: [\"search.twitter.com\", 80]")
end
it "should give GET uri and query string" do
Net::HTTP.http_logger.lines.should include("GET /search.json?q=httparty")
end
it "should give the BODY response code" do
Net::HTTP.http_logger.lines.should include("BODY: Net::HTTPOK")
end
end
describe "a get request with body option set to true" do
before(:each) do
stub_request(:any, "search.twitter.com/search.json?q=httparty").to_return(:body => "\{\"results\"\: 1\}", :status => 200) unless LIVE
Net::HTTP.http_logger_options = {:body => true}
end
it "should give the body output" do
Twitter::Search.new('httparty').fetch
Net::HTTP.http_logger.lines
Net::HTTP.http_logger.lines.grep(/BODY: \{\"results\":/).should_not be_empty
end
end
describe "a get request with trace option set to true" do
before(:each) do
Net::HTTP.http_logger_options = {:trace => true}
stub_request(:any, "search.twitter.com/search.json?q=httparty").to_return(:body => "\{\"results\"\: 1\}", :status => 200) unless LIVE
end
it "should give the trace output" do
Twitter::Search.new('httparty').fetch
Net::HTTP.http_logger.lines.grep(/TRACE: /).should_not be_empty
end
end
describe "a post request with default options" do
before(:all) do
Net::HTTP.http_logger_options = {:verbose => false}
stub_request(:any, "search.twitter.com/search").to_return(:body => "\{\"results\"\: 1\}", :status => 200) unless LIVE
@connection = Net::HTTP.new('search.twitter.com')
@connection.post('/search','?q=hello')
end
it "should give the post url" do
Net::HTTP.http_logger.lines.should include("POST /search")
end
if LIVE # only works if real live request
it "should give the post params" do
Net::HTTP.http_logger.lines.should include("PARAMS {\"?q\"=>[\"hello\"]} ")
end
end
it "should give the BODY response code" do
Net::HTTP.http_logger.lines.should include("BODY: Net::HTTPOK")
end
end
after(:all) do
Net::HTTP.http_logger.reset!
end
end
gitextract__b7ldh8x/
├── Rakefile
├── VERSION
├── examples/
│ ├── fogbugz.rb
│ ├── google.rb
│ ├── twitter-calltrace.rb
│ ├── twitter-customlog.rb
│ ├── twitter-simple.rb
│ ├── twitter-verbose.rb
│ └── twitter-withbody.rb
├── lib/
│ └── net-http-spy.rb
├── net-http-spy.gemspec
├── readme.markdown
└── spec/
├── spec.opts
├── spec_helper.rb
└── spy_spec.rb
SYMBOL INDEX (9 symbols across 2 files)
FILE: lib/net-http-spy.rb
type Net (line 6) | module Net
class HTTP (line 7) | class HTTP
method initialize (line 16) | def initialize(*args, &block)
method request (line 31) | def request(*args, &block)
FILE: spec/spec_helper.rb
class DummyLogger (line 19) | class DummyLogger
method initialize (line 23) | def initialize
method << (line 27) | def <<(msg)
method info (line 31) | def info(msg)
method reset! (line 35) | def reset!
Condensed preview — 15 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (14K chars).
[
{
"path": "Rakefile",
"chars": 1374,
"preview": "require \"rubygems\"\nrequire \"rake/gempackagetask\"\nrequire \"rake/rdoctask\"\n\nbegin\n require 'jeweler'\n Jeweler::Tasks.new"
},
{
"path": "VERSION",
"chars": 6,
"preview": "0.2.1\n"
},
{
"path": "examples/fogbugz.rb",
"chars": 584,
"preview": "# Just showing an example of something other than Twitter.\nrequire 'rubygems'\nrequire 'fogbugz-api' # sudo gem install a"
},
{
"path": "examples/google.rb",
"chars": 372,
"preview": "# Just showing an example of something other than Twitter. \n# Garb lets you access the Google Analytics API\nrequire 'rub"
},
{
"path": "examples/twitter-calltrace.rb",
"chars": 319,
"preview": "# See where the external API calls take place within the gem you are using with the :trace option \nrequire 'rubygems'\nre"
},
{
"path": "examples/twitter-customlog.rb",
"chars": 413,
"preview": "# By default the logger outputs to STDOUT, it's easy to change this to a file if you like\n# Great to capture and then us"
},
{
"path": "examples/twitter-simple.rb",
"chars": 271,
"preview": "# Simplist example. All you need to do is include the spy lib for it to start doing the right thing\nrequire 'rubygems'\nr"
},
{
"path": "examples/twitter-verbose.rb",
"chars": 333,
"preview": "# Net::HTTP has it's own logging/debug functionality. Turn on :verbose to show the full raw HTTP communication\nrequire '"
},
{
"path": "examples/twitter-withbody.rb",
"chars": 302,
"preview": "# Display the full response/request body. Usually just the response code is shown.\nrequire 'rubygems'\nrequire 'twitter'\n"
},
{
"path": "lib/net-http-spy.rb",
"chars": 1721,
"preview": "require 'net/https'\nrequire 'logger'\nrequire 'cgi'\n\n# HTTP SPY\nmodule Net\n class HTTP\n alias :old_initialize :initia"
},
{
"path": "net-http-spy.gemspec",
"chars": 1985,
"preview": "# Generated by jeweler\n# DO NOT EDIT THIS FILE DIRECTLY\n# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec "
},
{
"path": "readme.markdown",
"chars": 1567,
"preview": "## About\n\nEver wondered what HTTP requests the Ruby gem you are using to connect to a third party\nAPI is making? Use HTT"
},
{
"path": "spec/spec.opts",
"chars": 29,
"preview": "--format\n progress\n--colour\n"
},
{
"path": "spec/spec_helper.rb",
"chars": 503,
"preview": "require 'rubygems'\ngem 'rspec'\nrequire 'spec'\nrequire 'net/http'\nrequire 'open-uri'\nrequire 'twitter'\nrequire 'mechanize"
},
{
"path": "spec/spy_spec.rb",
"chars": 2769,
"preview": "require File.join(File.dirname(__FILE__), 'spec_helper')\n\n# Bare bones spec to make sure the core functionality is worki"
}
]
About this extraction
This page contains the full source code of the martinbtt/net-http-spy GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 15 files (12.3 KB), approximately 3.7k tokens, and a symbol index with 9 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.