parsnip 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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in parsnip.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,58 @@
1
+ require 'parsnip/version'
2
+ require 'sinatra/base'
3
+ require 'json'
4
+ require 'nokogiri'
5
+
6
+ module Parsnip
7
+
8
+ class Middleware < Sinatra::Base
9
+
10
+ post '*' do
11
+ parse_nip(request) || pass
12
+ end
13
+
14
+ put '*' do
15
+ parse_nip(request) || pass
16
+ end
17
+
18
+ private
19
+
20
+ def parse_nip(request)
21
+ case request.content_type.downcase
22
+ when /json/
23
+ with_rewind(request) { |body| json_nip(body) }
24
+ when /xml/
25
+ with_rewind(request) { |body| xml_nip(body) }
26
+ end
27
+ end
28
+
29
+ def json_nip(body)
30
+ JSON.parse(body) and nil
31
+ rescue JSON::ParserError => e
32
+ nip({ error: e.to_s }.to_json, 'application/json')
33
+ end
34
+
35
+ def xml_nip(body)
36
+ (Nokogiri::XML(body) { | config | config.strict }) and nil
37
+ rescue Nokogiri::XML::SyntaxError => e
38
+ error = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do | xml |
39
+ xml.error e.to_s
40
+ end
41
+ nip(error.to_xml, 'application/xml')
42
+ end
43
+
44
+ def nip(body, type)
45
+ [ 400, { 'Content-Type' => type }, [ body ] ]
46
+ end
47
+
48
+ def with_rewind(request, &nipper)
49
+ begin
50
+ nipper.call(request.body.read)
51
+ ensure
52
+ request.body.rewind
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,3 @@
1
+ module Parsnip
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'parsnip/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "parsnip"
7
+ s.version = Parsnip::VERSION
8
+ s.authors = ['Sean M. Duncan']
9
+ s.email = ['bitbutcher@gmail.com']
10
+ s.summary = %q{Rack Middleware that nips parsing errors in the bud before they manifest as internal server errors}
11
+
12
+ s.rubyforge_project = "parsnip"
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = [ 'lib' ]
18
+
19
+
20
+ s.add_development_dependency 'rspec'
21
+ s.add_runtime_dependency 'sinatra'
22
+ s.add_runtime_dependency 'json'
23
+ s.add_runtime_dependency 'nokogiri'
24
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: parsnip
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean M. Duncan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &70107460324580 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70107460324580
25
+ - !ruby/object:Gem::Dependency
26
+ name: sinatra
27
+ requirement: &70107460323420 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70107460323420
36
+ - !ruby/object:Gem::Dependency
37
+ name: json
38
+ requirement: &70107460322800 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70107460322800
47
+ - !ruby/object:Gem::Dependency
48
+ name: nokogiri
49
+ requirement: &70107460322200 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70107460322200
58
+ description:
59
+ email:
60
+ - bitbutcher@gmail.com
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files: []
64
+ files:
65
+ - .gitignore
66
+ - Gemfile
67
+ - Rakefile
68
+ - lib/parsnip.rb
69
+ - lib/parsnip/version.rb
70
+ - parsnip.gemspec
71
+ homepage:
72
+ licenses: []
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubyforge_project: parsnip
91
+ rubygems_version: 1.8.15
92
+ signing_key:
93
+ specification_version: 3
94
+ summary: Rack Middleware that nips parsing errors in the bud before they manifest
95
+ as internal server errors
96
+ test_files: []