thrift 0.9.0 → 0.9.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.
- checksums.yaml +15 -0
- data/ext/binary_protocol_accelerated.c +19 -3
- data/ext/compact_protocol.c +21 -7
- data/ext/constants.h +1 -5
- data/ext/extconf.rb +1 -1
- data/ext/protocol.c +0 -185
- data/ext/protocol.h +0 -20
- data/ext/struct.c +0 -3
- data/ext/thrift_native.c +1 -11
- data/lib/thrift.rb +1 -0
- data/lib/thrift/exceptions.rb +3 -0
- data/lib/thrift/protocol/base_protocol.rb +87 -10
- data/lib/thrift/protocol/binary_protocol.rb +13 -5
- data/lib/thrift/protocol/compact_protocol.rb +14 -7
- data/lib/thrift/protocol/json_protocol.rb +19 -15
- data/lib/thrift/server/mongrel_http_server.rb +2 -0
- data/lib/thrift/server/thin_http_server.rb +91 -0
- data/lib/thrift/struct.rb +1 -1
- data/lib/thrift/struct_union.rb +2 -2
- data/lib/thrift/transport/http_client_transport.rb +4 -1
- data/spec/base_protocol_spec.rb +65 -7
- data/spec/binary_protocol_spec_shared.rb +30 -0
- data/spec/compact_protocol_spec.rb +1 -3
- data/spec/http_client_spec.rb +49 -0
- data/spec/json_protocol_spec.rb +2 -2
- data/spec/thin_http_server_spec.rb +140 -0
- data/spec/union_spec.rb +13 -1
- metadata +113 -93
- data/benchmark/gen-rb/benchmark_constants.rb +0 -11
- data/benchmark/gen-rb/benchmark_service.rb +0 -80
- data/benchmark/gen-rb/benchmark_types.rb +0 -10
- data/spec/gen-rb/nonblocking_service.rb +0 -272
- data/spec/gen-rb/thrift_spec_constants.rb +0 -11
- data/spec/gen-rb/thrift_spec_types.rb +0 -538
- data/spec/mongrel_http_server_spec.rb +0 -114
- data/test/debug_proto/gen-rb/debug_proto_test_constants.rb +0 -274
- data/test/debug_proto/gen-rb/debug_proto_test_types.rb +0 -761
- data/test/debug_proto/gen-rb/empty_service.rb +0 -24
- data/test/debug_proto/gen-rb/inherited.rb +0 -79
- data/test/debug_proto/gen-rb/reverse_order_service.rb +0 -82
- data/test/debug_proto/gen-rb/service_for_exception_with_a_map.rb +0 -81
- data/test/debug_proto/gen-rb/srv.rb +0 -330
    
        data/lib/thrift.rb
    CHANGED
    
    
    
        data/lib/thrift/exceptions.rb
    CHANGED
    
    
| @@ -125,6 +125,16 @@ module Thrift | |
| 125 125 | 
             
                  raise NotImplementedError
         | 
| 126 126 | 
             
                end
         | 
| 127 127 |  | 
| 128 | 
            +
                # Writes a Thrift Binary (Thrift String with no encoding). In Ruby 1.9+, the String passed
         | 
| 129 | 
            +
                # will forced into BINARY encoding.
         | 
| 130 | 
            +
                #
         | 
| 131 | 
            +
                # buf - The String to write.
         | 
| 132 | 
            +
                #
         | 
| 133 | 
            +
                # Returns nothing.
         | 
| 134 | 
            +
                def write_binary(buf)
         | 
| 135 | 
            +
                  raise NotImplementedError
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
             | 
| 128 138 | 
             
                def read_message_begin
         | 
| 129 139 | 
             
                  raise NotImplementedError
         | 
| 130 140 | 
             
                end
         | 
| @@ -185,21 +195,67 @@ module Thrift | |
| 185 195 | 
             
                  raise NotImplementedError
         | 
| 186 196 | 
             
                end
         | 
| 187 197 |  | 
| 188 | 
            -
                # Reads a Thrift String. In Ruby 1.9+, all  | 
| 198 | 
            +
                # Reads a Thrift String. In Ruby 1.9+, all Strings will be returned with an Encoding of UTF-8.
         | 
| 189 199 | 
             
                #
         | 
| 190 200 | 
             
                # Returns a String.
         | 
| 191 201 | 
             
                def read_string
         | 
| 192 202 | 
             
                  raise NotImplementedError
         | 
| 193 203 | 
             
                end
         | 
| 194 204 |  | 
| 195 | 
            -
                 | 
| 196 | 
            -
             | 
| 197 | 
            -
             | 
| 205 | 
            +
                # Reads a Thrift Binary (Thrift String without encoding). In Ruby 1.9+, all Strings will be returned
         | 
| 206 | 
            +
                # with an Encoding of BINARY.
         | 
| 207 | 
            +
                #
         | 
| 208 | 
            +
                # Returns a String.
         | 
| 209 | 
            +
                def read_binary
         | 
| 210 | 
            +
                  raise NotImplementedError
         | 
| 211 | 
            +
                end
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                # Writes a field based on the field information, field ID and value.
         | 
| 214 | 
            +
                #
         | 
| 215 | 
            +
                # field_info - A Hash containing the definition of the field:
         | 
| 216 | 
            +
                #              :name   - The name of the field.
         | 
| 217 | 
            +
                #              :type   - The type of the field, which must be a Thrift::Types constant.
         | 
| 218 | 
            +
                #              :binary - A Boolean flag that indicates if Thrift::Types::STRING is a binary string (string without encoding).
         | 
| 219 | 
            +
                # fid        - The ID of the field.
         | 
| 220 | 
            +
                # value      - The field's value to write; object type varies based on :type.
         | 
| 221 | 
            +
                #
         | 
| 222 | 
            +
                # Returns nothing.
         | 
| 223 | 
            +
                def write_field(*args)
         | 
| 224 | 
            +
                  if args.size == 3
         | 
| 225 | 
            +
                    # handles the documented method signature - write_field(field_info, fid, value)
         | 
| 226 | 
            +
                    field_info = args[0]
         | 
| 227 | 
            +
                    fid = args[1]
         | 
| 228 | 
            +
                    value = args[2]
         | 
| 229 | 
            +
                  elsif args.size == 4
         | 
| 230 | 
            +
                    # handles the deprecated method signature - write_field(name, type, fid, value)
         | 
| 231 | 
            +
                    field_info = {:name => args[0], :type => args[1]}
         | 
| 232 | 
            +
                    fid = args[2]
         | 
| 233 | 
            +
                    value = args[3]
         | 
| 234 | 
            +
                  else
         | 
| 235 | 
            +
                    raise ArgumentError, "wrong number of arguments (#{args.size} for 3)"
         | 
| 236 | 
            +
                  end
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                  write_field_begin(field_info[:name], field_info[:type], fid)
         | 
| 239 | 
            +
                  write_type(field_info, value)
         | 
| 198 240 | 
             
                  write_field_end
         | 
| 199 241 | 
             
                end
         | 
| 200 242 |  | 
| 201 | 
            -
                 | 
| 202 | 
            -
             | 
| 243 | 
            +
                # Writes a field value based on the field information.
         | 
| 244 | 
            +
                #
         | 
| 245 | 
            +
                # field_info - A Hash containing the definition of the field:
         | 
| 246 | 
            +
                #              :type   - The Thrift::Types constant that determines how the value is written.
         | 
| 247 | 
            +
                #              :binary - A Boolean flag that indicates if Thrift::Types::STRING is a binary string (string without encoding).
         | 
| 248 | 
            +
                # value      - The field's value to write; object type varies based on field_info[:type].
         | 
| 249 | 
            +
                #
         | 
| 250 | 
            +
                # Returns nothing.
         | 
| 251 | 
            +
                def write_type(field_info, value)
         | 
| 252 | 
            +
                  # if field_info is a Fixnum, assume it is a Thrift::Types constant
         | 
| 253 | 
            +
                  # convert it into a field_info Hash for backwards compatibility
         | 
| 254 | 
            +
                  if field_info.is_a? Fixnum
         | 
| 255 | 
            +
                    field_info = {:type => field_info}
         | 
| 256 | 
            +
                  end
         | 
| 257 | 
            +
             | 
| 258 | 
            +
                  case field_info[:type]
         | 
| 203 259 | 
             
                  when Types::BOOL
         | 
| 204 260 | 
             
                    write_bool(value)
         | 
| 205 261 | 
             
                  when Types::BYTE
         | 
| @@ -213,7 +269,11 @@ module Thrift | |
| 213 269 | 
             
                  when Types::I64
         | 
| 214 270 | 
             
                    write_i64(value)
         | 
| 215 271 | 
             
                  when Types::STRING
         | 
| 216 | 
            -
                     | 
| 272 | 
            +
                    if field_info[:binary]
         | 
| 273 | 
            +
                      write_binary(value)
         | 
| 274 | 
            +
                    else
         | 
| 275 | 
            +
                      write_string(value)
         | 
| 276 | 
            +
                    end
         | 
| 217 277 | 
             
                  when Types::STRUCT
         | 
| 218 278 | 
             
                    value.write(self)
         | 
| 219 279 | 
             
                  else
         | 
| @@ -221,8 +281,21 @@ module Thrift | |
| 221 281 | 
             
                  end
         | 
| 222 282 | 
             
                end
         | 
| 223 283 |  | 
| 224 | 
            -
                 | 
| 225 | 
            -
             | 
| 284 | 
            +
                # Reads a field value based on the field information.
         | 
| 285 | 
            +
                #
         | 
| 286 | 
            +
                # field_info - A Hash containing the pertinent data to write:
         | 
| 287 | 
            +
                #              :type   - The Thrift::Types constant that determines how the value is written.
         | 
| 288 | 
            +
                #              :binary - A flag that indicates if Thrift::Types::STRING is a binary string (string without encoding).
         | 
| 289 | 
            +
                #
         | 
| 290 | 
            +
                # Returns the value read; object type varies based on field_info[:type].
         | 
| 291 | 
            +
                def read_type(field_info)
         | 
| 292 | 
            +
                  # if field_info is a Fixnum, assume it is a Thrift::Types constant
         | 
| 293 | 
            +
                  # convert it into a field_info Hash for backwards compatibility
         | 
| 294 | 
            +
                  if field_info.is_a? Fixnum
         | 
| 295 | 
            +
                    field_info = {:type => field_info}
         | 
| 296 | 
            +
                  end
         | 
| 297 | 
            +
             | 
| 298 | 
            +
                  case field_info[:type]
         | 
| 226 299 | 
             
                  when Types::BOOL
         | 
| 227 300 | 
             
                    read_bool
         | 
| 228 301 | 
             
                  when Types::BYTE
         | 
| @@ -236,7 +309,11 @@ module Thrift | |
| 236 309 | 
             
                  when Types::I64
         | 
| 237 310 | 
             
                    read_i64
         | 
| 238 311 | 
             
                  when Types::STRING
         | 
| 239 | 
            -
                     | 
| 312 | 
            +
                    if field_info[:binary]
         | 
| 313 | 
            +
                      read_binary
         | 
| 314 | 
            +
                    else
         | 
| 315 | 
            +
                      read_string
         | 
| 316 | 
            +
                    end
         | 
| 240 317 | 
             
                  else
         | 
| 241 318 | 
             
                    raise NotImplementedError
         | 
| 242 319 | 
             
                  end
         | 
| @@ -107,9 +107,13 @@ module Thrift | |
| 107 107 | 
             
                end
         | 
| 108 108 |  | 
| 109 109 | 
             
                def write_string(str)
         | 
| 110 | 
            -
                   | 
| 111 | 
            -
                   | 
| 112 | 
            -
             | 
| 110 | 
            +
                  buf = Bytes.convert_to_utf8_byte_buffer(str)
         | 
| 111 | 
            +
                  write_binary(buf)
         | 
| 112 | 
            +
                end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                def write_binary(buf)
         | 
| 115 | 
            +
                  write_i32(buf.bytesize)
         | 
| 116 | 
            +
                  trans.write(buf)
         | 
| 113 117 | 
             
                end
         | 
| 114 118 |  | 
| 115 119 | 
             
                def read_message_begin
         | 
| @@ -214,11 +218,15 @@ module Thrift | |
| 214 218 | 
             
                end
         | 
| 215 219 |  | 
| 216 220 | 
             
                def read_string
         | 
| 217 | 
            -
                   | 
| 218 | 
            -
                  buffer = trans.read_all(size)
         | 
| 221 | 
            +
                  buffer = read_binary
         | 
| 219 222 | 
             
                  Bytes.convert_to_string(buffer)
         | 
| 220 223 | 
             
                end
         | 
| 221 224 |  | 
| 225 | 
            +
                def read_binary
         | 
| 226 | 
            +
                  size = read_i32
         | 
| 227 | 
            +
                  trans.read_all(size)
         | 
| 228 | 
            +
                end
         | 
| 229 | 
            +
             | 
| 222 230 | 
             
              end
         | 
| 223 231 |  | 
| 224 232 | 
             
              class BinaryProtocolFactory < BaseProtocolFactory
         | 
| @@ -210,9 +210,13 @@ module Thrift | |
| 210 210 | 
             
                end
         | 
| 211 211 |  | 
| 212 212 | 
             
                def write_string(str)
         | 
| 213 | 
            -
                   | 
| 214 | 
            -
                   | 
| 215 | 
            -
             | 
| 213 | 
            +
                  buf = Bytes.convert_to_utf8_byte_buffer(str)
         | 
| 214 | 
            +
                  write_binary(buf)
         | 
| 215 | 
            +
                end
         | 
| 216 | 
            +
             | 
| 217 | 
            +
                def write_binary(buf)
         | 
| 218 | 
            +
                  write_varint32(buf.bytesize)
         | 
| 219 | 
            +
                  @trans.write(buf)
         | 
| 216 220 | 
             
                end
         | 
| 217 221 |  | 
| 218 222 | 
             
                def read_message_begin
         | 
| @@ -332,12 +336,15 @@ module Thrift | |
| 332 336 | 
             
                end
         | 
| 333 337 |  | 
| 334 338 | 
             
                def read_string
         | 
| 335 | 
            -
                   | 
| 336 | 
            -
                  buffer = trans.read_all(size)
         | 
| 339 | 
            +
                  buffer = read_binary
         | 
| 337 340 | 
             
                  Bytes.convert_to_string(buffer)
         | 
| 338 341 | 
             
                end
         | 
| 339 | 
            -
             | 
| 340 | 
            -
                
         | 
| 342 | 
            +
             | 
| 343 | 
            +
                def read_binary
         | 
| 344 | 
            +
                  size = read_varint32()
         | 
| 345 | 
            +
                  trans.read_all(size)
         | 
| 346 | 
            +
                end
         | 
| 347 | 
            +
             | 
| 341 348 | 
             
                private
         | 
| 342 349 |  | 
| 343 350 | 
             
                # 
         | 
| @@ -18,21 +18,6 @@ | |
| 18 18 | 
             
            # under the License.
         | 
| 19 19 | 
             
            # 
         | 
| 20 20 |  | 
| 21 | 
            -
            @@kJSONObjectStart = '{'
         | 
| 22 | 
            -
            @@kJSONObjectEnd = '}'
         | 
| 23 | 
            -
            @@kJSONArrayStart = '['
         | 
| 24 | 
            -
            @@kJSONArrayEnd = ']'
         | 
| 25 | 
            -
            @@kJSONNewline = '\n'
         | 
| 26 | 
            -
            @@kJSONElemSeparator = ','
         | 
| 27 | 
            -
            @@kJSONPairSeparator = ':'
         | 
| 28 | 
            -
            @@kJSONBackslash = '\\'
         | 
| 29 | 
            -
            @@kJSONStringDelimiter = '"'
         | 
| 30 | 
            -
             | 
| 31 | 
            -
            @@kThriftVersion1 = 1
         | 
| 32 | 
            -
             | 
| 33 | 
            -
            @@kThriftNan = "NaN"
         | 
| 34 | 
            -
            @@kThriftInfinity = "Infinity"
         | 
| 35 | 
            -
            @@kThriftNegativeInfinity = "-Infinity"
         | 
| 36 21 |  | 
| 37 22 | 
             
            module Thrift
         | 
| 38 23 | 
             
              class LookaheadReader
         | 
| @@ -66,6 +51,7 @@ module Thrift | |
| 66 51 | 
             
              # implementations
         | 
| 67 52 | 
             
              #
         | 
| 68 53 | 
             
              class JSONContext
         | 
| 54 | 
            +
                @@kJSONElemSeparator = ','
         | 
| 69 55 | 
             
                #
         | 
| 70 56 | 
             
                # Write context data to the trans. Default is to do nothing.
         | 
| 71 57 | 
             
                #
         | 
| @@ -89,6 +75,8 @@ module Thrift | |
| 89 75 |  | 
| 90 76 | 
             
              # Context class for object member key-value pairs
         | 
| 91 77 | 
             
              class JSONPairContext < JSONContext
         | 
| 78 | 
            +
                @@kJSONPairSeparator = ':'
         | 
| 79 | 
            +
             | 
| 92 80 | 
             
                def initialize
         | 
| 93 81 | 
             
                  @first = true
         | 
| 94 82 | 
             
                  @colon = true
         | 
| @@ -146,6 +134,21 @@ module Thrift | |
| 146 134 | 
             
              end
         | 
| 147 135 |  | 
| 148 136 | 
             
              class JsonProtocol < BaseProtocol
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                @@kJSONObjectStart = '{'
         | 
| 139 | 
            +
                @@kJSONObjectEnd = '}'
         | 
| 140 | 
            +
                @@kJSONArrayStart = '['
         | 
| 141 | 
            +
                @@kJSONArrayEnd = ']'
         | 
| 142 | 
            +
                @@kJSONNewline = '\n'
         | 
| 143 | 
            +
                @@kJSONBackslash = '\\'
         | 
| 144 | 
            +
                @@kJSONStringDelimiter = '"'
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                @@kThriftVersion1 = 1
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                @@kThriftNan = "NaN"
         | 
| 149 | 
            +
                @@kThriftInfinity = "Infinity"
         | 
| 150 | 
            +
                @@kThriftNegativeInfinity = "-Infinity"
         | 
| 151 | 
            +
             | 
| 149 152 | 
             
                def initialize(trans)
         | 
| 150 153 | 
             
                  super(trans)
         | 
| 151 154 | 
             
                  @context = JSONContext.new
         | 
| @@ -717,6 +720,7 @@ module Thrift | |
| 717 720 |  | 
| 718 721 | 
             
                def read_set_begin
         | 
| 719 722 | 
             
                  read_json_array_start
         | 
| 723 | 
            +
                  [get_type_id_for_type_name(read_json_string), read_json_integer]
         | 
| 720 724 | 
             
                end
         | 
| 721 725 |  | 
| 722 726 | 
             
                def read_set_end
         | 
| @@ -20,6 +20,7 @@ | |
| 20 20 | 
             
            require 'mongrel'
         | 
| 21 21 |  | 
| 22 22 | 
             
            ## Sticks a service on a URL, using mongrel to do the HTTP work
         | 
| 23 | 
            +
            # <b>DEPRECATED:</b> Please use <tt>Thrift::ThinHTTPServer</tt> instead.
         | 
| 23 24 | 
             
            module Thrift
         | 
| 24 25 | 
             
              class MongrelHTTPServer < BaseServer
         | 
| 25 26 | 
             
                class Handler < Mongrel::HttpHandler
         | 
| @@ -43,6 +44,7 @@ module Thrift | |
| 43 44 | 
             
                end
         | 
| 44 45 |  | 
| 45 46 | 
             
                def initialize(processor, opts={})
         | 
| 47 | 
            +
                  Kernel.warn "[DEPRECATION WARNING] `Thrift::MongrelHTTPServer` is deprecated.  Please use `Thrift::ThinHTTPServer` instead."
         | 
| 46 48 | 
             
                  port = opts[:port] || 80
         | 
| 47 49 | 
             
                  ip = opts[:ip] || "0.0.0.0"
         | 
| 48 50 | 
             
                  path = opts[:path] || ""
         | 
| @@ -0,0 +1,91 @@ | |
| 1 | 
            +
            #
         | 
| 2 | 
            +
            # Licensed to the Apache Software Foundation (ASF) under one
         | 
| 3 | 
            +
            # or more contributor license agreements. See the NOTICE file
         | 
| 4 | 
            +
            # distributed with this work for additional information
         | 
| 5 | 
            +
            # regarding copyright ownership. The ASF licenses this file
         | 
| 6 | 
            +
            # to you under the Apache License, Version 2.0 (the
         | 
| 7 | 
            +
            # "License"); you may not use this file except in compliance
         | 
| 8 | 
            +
            # with the License. You may obtain a copy of the License at
         | 
| 9 | 
            +
            #
         | 
| 10 | 
            +
            #   http://www.apache.org/licenses/LICENSE-2.0
         | 
| 11 | 
            +
            #
         | 
| 12 | 
            +
            # Unless required by applicable law or agreed to in writing,
         | 
| 13 | 
            +
            # software distributed under the License is distributed on an
         | 
| 14 | 
            +
            # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
         | 
| 15 | 
            +
            # KIND, either express or implied. See the License for the
         | 
| 16 | 
            +
            # specific language governing permissions and limitations
         | 
| 17 | 
            +
            # under the License.
         | 
| 18 | 
            +
            #
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            require 'rack'
         | 
| 21 | 
            +
            require 'thin'
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            ##
         | 
| 24 | 
            +
            # Wraps the Thin web server to provide a Thrift server over HTTP.
         | 
| 25 | 
            +
            module Thrift
         | 
| 26 | 
            +
              class ThinHTTPServer < BaseServer
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                ##
         | 
| 29 | 
            +
                # Accepts a Thrift::Processor
         | 
| 30 | 
            +
                # Options include:
         | 
| 31 | 
            +
                # * :port
         | 
| 32 | 
            +
                # * :ip
         | 
| 33 | 
            +
                # * :path
         | 
| 34 | 
            +
                # * :protocol_factory
         | 
| 35 | 
            +
                def initialize(processor, options={})
         | 
| 36 | 
            +
                  port = options[:port] || 80
         | 
| 37 | 
            +
                  ip = options[:ip] || "0.0.0.0"
         | 
| 38 | 
            +
                  path = options[:path] || "/"
         | 
| 39 | 
            +
                  protocol_factory = options[:protocol_factory] || BinaryProtocolFactory.new
         | 
| 40 | 
            +
                  app = RackApplication.for(path, processor, protocol_factory)
         | 
| 41 | 
            +
                  @server = Thin::Server.new(ip, port, app)
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                ##
         | 
| 45 | 
            +
                # Starts the server
         | 
| 46 | 
            +
                def serve
         | 
| 47 | 
            +
                  @server.start
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                class RackApplication
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  THRIFT_HEADER = "application/x-thrift"
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  def self.for(path, processor, protocol_factory)
         | 
| 55 | 
            +
                    Rack::Builder.new do
         | 
| 56 | 
            +
                      use Rack::CommonLogger
         | 
| 57 | 
            +
                      use Rack::ShowExceptions
         | 
| 58 | 
            +
                      use Rack::Lint
         | 
| 59 | 
            +
                      map path do
         | 
| 60 | 
            +
                        run lambda { |env|
         | 
| 61 | 
            +
                          request = Rack::Request.new(env)
         | 
| 62 | 
            +
                          if RackApplication.valid_thrift_request?(request)
         | 
| 63 | 
            +
                            RackApplication.successful_request(request, processor, protocol_factory)
         | 
| 64 | 
            +
                          else
         | 
| 65 | 
            +
                            RackApplication.failed_request
         | 
| 66 | 
            +
                          end
         | 
| 67 | 
            +
                        }
         | 
| 68 | 
            +
                      end
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  def self.successful_request(rack_request, processor, protocol_factory)
         | 
| 73 | 
            +
                    response = Rack::Response.new([], 200, {'Content-Type' => THRIFT_HEADER})
         | 
| 74 | 
            +
                    transport = IOStreamTransport.new rack_request.body, response
         | 
| 75 | 
            +
                    protocol = protocol_factory.get_protocol transport
         | 
| 76 | 
            +
                    processor.process protocol, protocol
         | 
| 77 | 
            +
                    response
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  def self.failed_request
         | 
| 81 | 
            +
                    Rack::Response.new(['Not Found'], 404, {'Content-Type' => THRIFT_HEADER})
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  def self.valid_thrift_request?(rack_request)
         | 
| 85 | 
            +
                    rack_request.post? && rack_request.env["CONTENT_TYPE"] == THRIFT_HEADER
         | 
| 86 | 
            +
                  end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              end
         | 
| 91 | 
            +
            end
         | 
    
        data/lib/thrift/struct.rb
    CHANGED
    
    
    
        data/lib/thrift/struct_union.rb
    CHANGED
    
    | @@ -101,7 +101,7 @@ module Thrift | |
| 101 101 | 
             
                    end
         | 
| 102 102 | 
             
                    iprot.read_set_end
         | 
| 103 103 | 
             
                  else
         | 
| 104 | 
            -
                    value = iprot.read_type(field | 
| 104 | 
            +
                    value = iprot.read_type(field)
         | 
| 105 105 | 
             
                  end
         | 
| 106 106 | 
             
                  value
         | 
| 107 107 | 
             
                end
         | 
| @@ -110,7 +110,7 @@ module Thrift | |
| 110 110 | 
             
                  if is_container? field[:type]
         | 
| 111 111 | 
             
                    write_container(oprot, value, field)
         | 
| 112 112 | 
             
                  else
         | 
| 113 | 
            -
                    oprot.write_type(field | 
| 113 | 
            +
                    oprot.write_type(field, value)
         | 
| 114 114 | 
             
                  end
         | 
| 115 115 | 
             
                end
         | 
| 116 116 |  | 
| @@ -20,16 +20,18 @@ | |
| 20 20 |  | 
| 21 21 | 
             
            require 'net/http'
         | 
| 22 22 | 
             
            require 'net/https'
         | 
| 23 | 
            +
            require 'openssl'
         | 
| 23 24 | 
             
            require 'uri'
         | 
| 24 25 | 
             
            require 'stringio'
         | 
| 25 26 |  | 
| 26 27 | 
             
            module Thrift
         | 
| 27 28 | 
             
              class HTTPClientTransport < BaseTransport
         | 
| 28 29 |  | 
| 29 | 
            -
                def initialize(url)
         | 
| 30 | 
            +
                def initialize(url, opts = {})
         | 
| 30 31 | 
             
                  @url = URI url
         | 
| 31 32 | 
             
                  @headers = {'Content-Type' => 'application/x-thrift'}
         | 
| 32 33 | 
             
                  @outbuf = Bytes.empty_byte_buffer
         | 
| 34 | 
            +
                  @ssl_verify_mode = opts.fetch(:ssl_verify_mode, OpenSSL::SSL::VERIFY_PEER)
         | 
| 33 35 | 
             
                end
         | 
| 34 36 |  | 
| 35 37 | 
             
                def open?; true end
         | 
| @@ -43,6 +45,7 @@ module Thrift | |
| 43 45 | 
             
                def flush
         | 
| 44 46 | 
             
                  http = Net::HTTP.new @url.host, @url.port
         | 
| 45 47 | 
             
                  http.use_ssl = @url.scheme == 'https'
         | 
| 48 | 
            +
                  http.verify_mode = @ssl_verify_mode if @url.scheme == 'https'
         | 
| 46 49 | 
             
                  resp = http.post(@url.request_uri, @outbuf, @headers)
         | 
| 47 50 | 
             
                  data = resp.body
         | 
| 48 51 | 
             
                  data = Bytes.force_binary_encoding(data)
         |