segregate 0.5.0 → 0.5.2
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.
- checksums.yaml +4 -4
- data/lib/segregate.rb +60 -17
- data/lib/segregate/http_regular_expressions.rb +1 -1
- data/lib/segregate/version.rb +2 -2
- metadata +5 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 71d89f3c3e90e41fb84af4faeb638c55b1e57f42
         | 
| 4 | 
            +
              data.tar.gz: f0de163082142414642801e392f12c7d13448d38
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6996697e014269c5a661f51ad4dff60b6b11fbc400a849c18ac62987db430b5cba85b168f489cff1eaa7176c7cd1887ef3b1296bf10ab9cdb5d64797331eb4ce
         | 
| 7 | 
            +
              data.tar.gz: 2549fd7247b7acbf4c7d3f8823f3679c4eccc4675bfe23b7ddaf120b4d78f464cb912d9bb1afbf9d06d6eedaeb98d9f80e5f7eb4303bbfb1f11241801ddb01a5
         | 
    
        data/lib/segregate.rb
    CHANGED
    
    | @@ -22,7 +22,14 @@ class Segregate | |
| 22 22 | 
             
                @uri.respond_to?(meth, include_private) || super
         | 
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 | 
            -
              def  | 
| 25 | 
            +
              def debug message
         | 
| 26 | 
            +
                if @debug
         | 
| 27 | 
            +
                  puts "DEBUG: " + message.t_s
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def initialize callback = nil, *args, **kwargs
         | 
| 32 | 
            +
                @debug = kwargs[:debug] ? true : false
         | 
| 26 33 | 
             
                @callback = callback
         | 
| 27 34 | 
             
                @http_version = [nil, nil]
         | 
| 28 35 |  | 
| @@ -35,6 +42,8 @@ class Segregate | |
| 35 42 |  | 
| 36 43 | 
             
                @stashed_data = ""
         | 
| 37 44 | 
             
                @stashed_body = ""
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                @header_order = []
         | 
| 38 47 | 
             
              end
         | 
| 39 48 |  | 
| 40 49 | 
             
              def request?
         | 
| @@ -83,24 +92,46 @@ class Segregate | |
| 83 92 |  | 
| 84 93 | 
             
              def update_content_length
         | 
| 85 94 | 
             
                unless @body.empty?
         | 
| 86 | 
            -
                  @ | 
| 87 | 
            -
             | 
| 95 | 
            +
                  if @body.length > 99999999999
         | 
| 96 | 
            +
                    @headers['transfer-encoding'] = 'chunked'
         | 
| 97 | 
            +
                    @headers.delete 'content-length'
         | 
| 98 | 
            +
                  else
         | 
| 99 | 
            +
                    @headers['content-length'] = @body.length.to_s
         | 
| 100 | 
            +
                    @headers.delete 'transfer-encoding'
         | 
| 101 | 
            +
                  end
         | 
| 88 102 | 
             
                end
         | 
| 89 103 | 
             
              end
         | 
| 90 104 |  | 
| 91 105 | 
             
              def raw_data
         | 
| 92 106 | 
             
                raw_message = ""
         | 
| 93 107 | 
             
                update_content_length
         | 
| 94 | 
            -
             | 
| 108 | 
            +
             | 
| 109 | 
            +
                build_headers raw_message
         | 
| 110 | 
            +
                build_body raw_message
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                return raw_message
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
              def build_headers raw_message
         | 
| 95 116 | 
             
                request? ? raw_message << request_line + "\r\n" : raw_message << status_line + "\r\n"
         | 
| 96 | 
            -
                 | 
| 97 | 
            -
                  raw_message << "%s: %s\r\n" % [header, headers[header]] | 
| 117 | 
            +
                @header_order.each do |header|
         | 
| 118 | 
            +
                  raw_message << "%s: %s\r\n" % [header, headers[header.downcase]]
         | 
| 98 119 | 
             
                end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
                raw_message << "\r\n" + @body + "\r\n" unless @body.empty?
         | 
| 101 120 | 
             
                raw_message << "\r\n"
         | 
| 102 121 | 
             
              end
         | 
| 103 122 |  | 
| 123 | 
            +
              def build_body raw_message
         | 
| 124 | 
            +
                if @headers['content-length']
         | 
| 125 | 
            +
                  raw_message << @body
         | 
| 126 | 
            +
                elsif @headers['transfer-encoding'] == 'chunked'
         | 
| 127 | 
            +
                  @body.scan(/.{1,65535}/).each do |chunk|
         | 
| 128 | 
            +
                    raw_message << "%s\r\n" % chunk.length.to_s(16)
         | 
| 129 | 
            +
                    raw_message << chunk + "\r\n"
         | 
| 130 | 
            +
                  end
         | 
| 131 | 
            +
                  raw_message << "0\r\n\r\n"
         | 
| 132 | 
            +
                end
         | 
| 133 | 
            +
              end
         | 
| 134 | 
            +
             | 
| 104 135 | 
             
              def parse_data data
         | 
| 105 136 | 
             
                data = StringIO.new(@stashed_data + data)
         | 
| 106 137 | 
             
                @stashed_data = ""
         | 
| @@ -109,6 +140,8 @@ class Segregate | |
| 109 140 | 
             
                  line, complete_line = get_next_line data
         | 
| 110 141 | 
             
                  complete_line ? parse_line(line) : @stashed_data = line
         | 
| 111 142 | 
             
                end
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                data.close
         | 
| 112 145 | 
             
              end
         | 
| 113 146 |  | 
| 114 147 | 
             
              def parse_line line
         | 
| @@ -127,8 +160,17 @@ class Segregate | |
| 127 160 | 
             
              private
         | 
| 128 161 |  | 
| 129 162 | 
             
              def get_next_line data
         | 
| 130 | 
            -
                 | 
| 131 | 
            -
             | 
| 163 | 
            +
                if @headers['content-length'] && @state >= :body
         | 
| 164 | 
            +
                  line = data.readline("\r\n")
         | 
| 165 | 
            +
                  @inital_line = line
         | 
| 166 | 
            +
                  [line, true]
         | 
| 167 | 
            +
                else
         | 
| 168 | 
            +
                  line = data.readline("\r\n")
         | 
| 169 | 
            +
                  @inital_line = line
         | 
| 170 | 
            +
                  result = line.end_with?("\r\n")
         | 
| 171 | 
            +
                  line = line[0..-3] if result
         | 
| 172 | 
            +
                  [line, result]
         | 
| 173 | 
            +
                end
         | 
| 132 174 | 
             
              end
         | 
| 133 175 |  | 
| 134 176 | 
             
              def read_in_first_line line
         | 
| @@ -139,9 +181,9 @@ class Segregate | |
| 139 181 | 
             
                elsif line =~ STATUS_LINE
         | 
| 140 182 | 
             
                  parse_status_line line
         | 
| 141 183 | 
             
                elsif line =~ UNKNOWN_REQUEST_LINE
         | 
| 142 | 
            -
                   | 
| 184 | 
            +
                  debug "Unknown http method: %s" % line[/^\S+/]
         | 
| 143 185 | 
             
                else
         | 
| 144 | 
            -
                   | 
| 186 | 
            +
                  debug "Unknown first line: %s" % line
         | 
| 145 187 | 
             
                end
         | 
| 146 188 |  | 
| 147 189 | 
             
                @state.next
         | 
| @@ -169,8 +211,9 @@ class Segregate | |
| 169 211 | 
             
                if line.empty?
         | 
| 170 212 | 
             
                  @state.next
         | 
| 171 213 | 
             
                else
         | 
| 172 | 
            -
                  key, value = line.split(":")
         | 
| 173 | 
            -
                  @ | 
| 214 | 
            +
                  key, value = line.split(": ",2)
         | 
| 215 | 
            +
                  @header_order << key
         | 
| 216 | 
            +
                  @headers[key.downcase] = value
         | 
| 174 217 | 
             
                end
         | 
| 175 218 |  | 
| 176 219 | 
             
                if headers_complete?
         | 
| @@ -193,7 +236,7 @@ class Segregate | |
| 193 236 | 
             
                line = @stashed_body + line
         | 
| 194 237 | 
             
                @stashed_body = ""
         | 
| 195 238 |  | 
| 196 | 
            -
                if line.length  | 
| 239 | 
            +
                if line.length >= headers['content-length'].to_i
         | 
| 197 240 | 
             
                  @body = line
         | 
| 198 241 | 
             
                  @callback.on_body @body if @callback.respond_to?(:on_body)
         | 
| 199 242 | 
             
                  @state.next
         | 
| @@ -226,12 +269,12 @@ class Segregate | |
| 226 269 | 
             
                line = @stashed_body + line
         | 
| 227 270 | 
             
                @stashed_body = ""
         | 
| 228 271 |  | 
| 229 | 
            -
                if line.length  | 
| 272 | 
            +
                if line.length >= @chunk_size
         | 
| 230 273 | 
             
                  @body << line
         | 
| 231 274 | 
             
                  @callback.on_body line if @callback.respond_to?(:on_body)
         | 
| 232 275 | 
             
                  @chunked_body_state.next
         | 
| 233 276 | 
             
                else
         | 
| 234 | 
            -
                  @stashed_body = line
         | 
| 277 | 
            +
                  @stashed_body = @inital_line.end_with?("\r\n") ? (line + "\r\n") : line
         | 
| 235 278 | 
             
                end
         | 
| 236 279 | 
             
              end
         | 
| 237 280 | 
             
            end
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            class Segregate
         | 
| 2 2 | 
             
            	REQUEST_LINE = /^(#{HTTP_METHODS.join("|")})\s(\*|\S+)\sHTTP\/(\d).(\d)$/
         | 
| 3 | 
            -
            	STATUS_LINE = /^HTTP\/(\d).(\d)\s(\d{3})\s([\w\s | 
| 3 | 
            +
            	STATUS_LINE = /^HTTP\/(\d).(\d)\s(\d{3})\s([\w\s-]+)$/
         | 
| 4 4 | 
             
            	UNKNOWN_REQUEST_LINE = /^(\w+)\s(\*|\S+)\sHTTP\/(\d).(\d)$/
         | 
| 5 5 | 
             
            end
         | 
    
        data/lib/segregate/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: segregate
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.5. | 
| 4 | 
            +
              version: 0.5.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ben Slaughter
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014-02- | 
| 11 | 
            +
            date: 2014-02-10 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rake
         | 
| @@ -101,13 +101,13 @@ executables: [] | |
| 101 101 | 
             
            extensions: []
         | 
| 102 102 | 
             
            extra_rdoc_files: []
         | 
| 103 103 | 
             
            files:
         | 
| 104 | 
            -
            - README.md
         | 
| 105 104 | 
             
            - LICENSE
         | 
| 105 | 
            +
            - README.md
         | 
| 106 | 
            +
            - lib/segregate.rb
         | 
| 106 107 | 
             
            - lib/segregate/http_headers.rb
         | 
| 107 108 | 
             
            - lib/segregate/http_methods.rb
         | 
| 108 109 | 
             
            - lib/segregate/http_regular_expressions.rb
         | 
| 109 110 | 
             
            - lib/segregate/version.rb
         | 
| 110 | 
            -
            - lib/segregate.rb
         | 
| 111 111 | 
             
            - spec/segregate_spec.rb
         | 
| 112 112 | 
             
            - spec/spec_helper.rb
         | 
| 113 113 | 
             
            homepage: http://benslaughter.github.io/segregate/
         | 
| @@ -130,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 130 130 | 
             
                  version: '0'
         | 
| 131 131 | 
             
            requirements: []
         | 
| 132 132 | 
             
            rubyforge_project: 
         | 
| 133 | 
            -
            rubygems_version: 2. | 
| 133 | 
            +
            rubygems_version: 2.2.2
         | 
| 134 134 | 
             
            signing_key: 
         | 
| 135 135 | 
             
            specification_version: 4
         | 
| 136 136 | 
             
            summary: Segregate http parser
         |