# File lib/s3/s3_interface.rb, line 413
    def put(bucket, key, data=nil, headers={})
      # On Windows, if someone opens a file in text mode, we must reset it so
      # to binary mode for streaming to work properly
      if (data.respond_to?(:binmode))
        data.binmode
      end
      if data.is_a?(String)
        data = StringIO.new(data)
#        puts "encoding = #{data.external_encoding} - #{data.internal_encoding}"
#        data.set_encoding("UTF-8")
#        puts "encoding = #{data.external_encoding} - #{data.internal_encoding}"
      end

      data_size = data.respond_to?(:lstat) ? data.lstat.size :
#          data.respond_to?(:bytesize) ? data.bytesize :
      (data.respond_to?(:size) ? data.size : 0)
#      puts 'data_size=' + data_size.to_s
      if (data_size >= USE_100_CONTINUE_PUT_SIZE)
        headers['expect'] = '100-continue'
      end
      req_hash = generate_rest_request('PUT', headers.merge(:url             =>"#{bucket}/#{CGI::escape key}",
                                                            :data            =>data,
                                                            'Content-Length' => data_size.to_s))
      request_info(req_hash, RightHttp2xxParser.new)
    rescue
      on_exception
    end