Browse Source

Merge branch 'develop' into feature/ui2

Martin Edenhofer 11 years ago
parent
commit
3d8353bb2c
4 changed files with 229 additions and 76 deletions
  1. 4 4
      lib/geo_location/gmaps.rb
  2. 30 63
      lib/import/otrs.rb
  3. 3 9
      lib/rss.rb
  4. 192 0
      lib/user_agent.rb

+ 4 - 4
lib/geo_location/gmaps.rb

@@ -4,8 +4,8 @@ class GeoLocation::Gmaps
 
   def self.geocode(address)
     url = "http://maps.googleapis.com/maps/api/geocode/json?address=#{CGI::escape address}&sensor=true"
-    response = Net::HTTP.get_response( URI.parse(url) )
-    return if ! response.kind_of? Net::HTTPSuccess
+    response = UserAgent.request(url)
+    return if !response.success?
 
     result = JSON.parse( response.body )
 
@@ -16,8 +16,8 @@ class GeoLocation::Gmaps
 
   def self.reverse_geocode(lat,lng)
     url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=#{lat},#{lng}&sensor=true"
-    response = Net::HTTP.get_response( URI.parse(url) )
-    return if ! response.kind_of? Net::HTTPSuccess
+    response = UserAgent.request(url)
+    return if !response.success?
 
     result = JSON.parse( response.body )
 

+ 30 - 63
lib/import/otrs.rb

@@ -4,67 +4,34 @@ module Import::OTRS
   def self.request(part)
     url = Setting.get('import_otrs_endpoint') + '/' + part + ';Key=' + Setting.get('import_otrs_endpoint_key')
     puts 'GET: ' + url
-#    response = Net::HTTP.get_response( URI.parse(url), { :use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE } )
-    uri = URI.parse(url)
-    http = Net::HTTP.new(uri.host, uri.port)
-
-    if url =~ /https/i
-      http.use_ssl = true
-      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
-    end
-    request = Net::HTTP::Get.new(uri.request_uri)
-
-    # http basic auth (if needed)
-    user     = Setting.get('import_otrs_user');
-    password = Setting.get('import_otrs_password');
-    if user && user != '' && password && password != ''
-      request.basic_auth user, password
-    end
-
-    begin
-      response = http.request(request)
-#    puts 'R:' + response.body.to_s
-    rescue Exception => e
-      puts "can't get #{url}"
-      puts e.inspect
+    response = UserAgent.request(
+      url,
+      {
+        :user     => Setting.get('import_otrs_user'),
+        :password => Setting.get('import_otrs_password'),
+      },
+    )
+    if !response.success?
+      puts "ERROR: #{response.error}"
       return
     end
-    if !response
-      raise "Can't connect to #{url}, got no response!"
-    end
-    if response.code.to_s != '200'
-      raise "Connection to #{url} failed, '#{response.code.to_s}'!"
-    end
     return response
   end
   def self.post(base, data)
     url = Setting.get('import_otrs_endpoint') + '/' + base
     data['Key'] = Setting.get('import_otrs_endpoint_key')
     puts 'POST: ' + url
-    uri = URI.parse(url)
-    http = Net::HTTP.new(uri.host, uri.port)
-
-    if url =~ /https/i
-      http.use_ssl = true
-      http.verify_mode = OpenSSL::SSL::VERIFY_NONE
-    end
-    request = Net::HTTP::Post.new(uri.request_uri)
-
-    # http basic auth (if needed)
-    user     = Setting.get('import_otrs_user');
-    password = Setting.get('import_otrs_password');
-    if user && user != '' && password && password != ''
-      request.basic_auth user, password
-    end
-
-    request.set_form_data(data)
-    response = http.request(request)
-
-    if !response
-      raise "Can't connect to #{url}, got no response!"
-    end
-    if response.code.to_s != '200'
-      raise "Connection to #{url} failed, '#{response.code.to_s}'!"
+    response = UserAgent.request(
+      url,
+      {
+        :method   => 'post',
+        :user     => Setting.get('import_otrs_user'),
+        :password => Setting.get('import_otrs_password'),
+      },
+    )
+    if !response.success?
+      puts "ERROR: #{response.error}"
+      return
     end
     return response
   end
@@ -77,7 +44,7 @@ module Import::OTRS
   def self.auth(username, password)
     response = post( "public.pl", { :Action => 'Export', :Type => 'Auth', :User => username, :Pw => password } )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
 
     result = json(response)
     return result
@@ -86,7 +53,7 @@ module Import::OTRS
   def self.session(session_id)
     response = post( "public.pl", { :Action => 'Export', :Type => 'SessionCheck', :SessionID => session_id } )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
 
     result = json(response)
     return result
@@ -105,7 +72,7 @@ module Import::OTRS
 
     response = request("public.pl?Action=Export")
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
 
 #self.ticket('156115')
 #return
@@ -189,7 +156,7 @@ module Import::OTRS
     url = "public.pl?Action=Export;Type=TicketDiff;Limit=30"
     response = request( url )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
     result = json(response)
     self._ticket_result(result)
   end
@@ -201,7 +168,7 @@ module Import::OTRS
     }
     response = request( url )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
 
     result = json(response)
     self._ticket_result(result)
@@ -528,7 +495,7 @@ module Import::OTRS
   def self.ticket_state
     response = request( "public.pl?Action=Export;Type=State" )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
 
     result = json(response)
 #    puts result.inspect
@@ -585,7 +552,7 @@ module Import::OTRS
   def self.ticket_priority
     response = request( "public.pl?Action=Export;Type=Priority" )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
 
     result = json(response)
     map = {
@@ -629,7 +596,7 @@ module Import::OTRS
   def self.ticket_group
     response = request( "public.pl?Action=Export;Type=Queue" )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
 
     result = json(response)
     map = {
@@ -673,7 +640,7 @@ module Import::OTRS
   def self.user
     response = request( "public.pl?Action=Export;Type=User" )
     return if !response
-    return if response.code.to_s != '200'
+    return if !response.success?
     result = json(response)
     map = {
       :ChangeTime    => :updated_at,
@@ -739,7 +706,7 @@ module Import::OTRS
       response = request( "public.pl?Action=Export;Type=Customer;Count=100;Offset=#{count}" )
       return if !response
       count = count + 3000
-      return if response.code.to_s != '200'
+      return if !response.success?
       result = json(response)
       map = {
         :ChangeTime    => :updated_at,

+ 3 - 9
lib/rss.rb

@@ -7,14 +7,8 @@ module Rss
 
     begin
       puts 'fetch rss...'
-      response = Net::HTTP.get_response( URI.parse(url) )
-
-      # check if redirect is needed
-      if response.kind_of? Net::HTTPRedirection 
-        url = response.header['location']
-        response = Net::HTTP.get_response( URI.parse( url ) )
-      end
-      if ! response.kind_of? Net::HTTPSuccess
+      response = UserAgent.request(url)
+      if !response.success?
         raise "Can't fetch '#{url}', http code: #{response.code.to_s}"
         return
       end
@@ -42,4 +36,4 @@ module Rss
 
     return items
   end
-end
+end

+ 192 - 0
lib/user_agent.rb

@@ -0,0 +1,192 @@
+# Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
+
+require 'net/http'
+require 'net/https'
+require 'net/ftp'
+require 'tempfile'
+
+class UserAgent
+
+=begin
+
+http/https/ftp calls
+
+  result = UserAgent.request( 'ftp://host/some_dir/some_file.bin' )
+
+  result = UserAgent.request( 'http://host/some_dir/some_file.bin' )
+
+  result = UserAgent.request( 'https://host/some_dir/some_file.bin' )
+
+  result = UserAgent.request( 'http://host/some_dir/some_file.bin', { :method => 'post', :data => { :param1 => 123 } } )
+
+returns
+
+  result # result object
+
+=end
+
+
+  def self.request(url, options = {})
+
+    uri = URI.parse(url)
+    case uri.scheme.downcase
+    when /ftp/
+      ftp(uri, options)
+    when /http|https/
+      http(uri, options, 10)
+    end
+
+  end
+
+  private
+    def self.http(uri, options, count)
+
+      http = Net::HTTP.new(uri.host, uri.port)
+
+      if uri.scheme =~ /https/i
+        http.use_ssl = true
+        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
+      end
+
+      if !options[:method] || options[:method] =~ /^get$/i
+        request = Net::HTTP::Get.new(uri.request_uri)
+
+        # http basic auth (if needed)
+        if options[:user] && options[:user] != '' && options[:password] && options[:password] != ''
+          request.basic_auth user, password
+        end
+
+        begin
+          response = http.request(request)
+        rescue Exception => e
+          return Result.new(
+            :error   => e.inspect,
+            :success => false,
+            :code    => 0,
+          )
+        end
+      elsif options[:method] =~ /^post$/i
+        request = Net::HTTP::Post.new(uri.request_uri)
+
+        # http basic auth (if needed)
+        if options[:user] && options[:user] != '' && options[:password] && options[:password] != ''
+          request.basic_auth user, password
+        end
+
+        begin
+          request.set_form_data( options[:data] )
+          response = http.request(request)
+        rescue Exception => e
+          return Result.new(
+            :error   => e.inspect,
+            :success => false,
+            :code    => 0,
+          )
+        end
+      end
+
+      if !response
+        return Result.new(
+          :error   => "Can't connect to #{uri.to_s}, got no response!",
+          :success => false,
+          :code    => 0,
+        )
+      end
+
+      case response
+      when Net::HTTPNotFound
+        return Result.new(
+          :error   => "No such file #{uri.to_s}, 404!",
+          :success => false,
+          :code    => response.code,
+        )
+
+      when Net::HTTPClientError
+        return Result.new(
+          :error   => "Client Error: #{response.inspect}!",
+          :success => false,
+          :code    => response.code,
+        )
+
+      when Net::HTTPRedirection
+        raise "Too many redirections for the original URL, halting." if count <= 0
+        url = response["location"]
+        uri = URI.parse(url)
+        return http(uri, options, count - 1)
+
+      when Net::HTTPOK
+        return Result.new(
+          :body    => response.body,
+          :success => true,
+          :code    => response.code,
+        )
+      end
+
+      raise "Unknown method '#{option[:method]}'"
+    end
+
+    def self.ftp(uri,options)
+      host       = uri.host
+      filename   = File.basename(uri.path)
+      remote_dir = File.dirname(uri.path)
+
+      temp_file = Tempfile.new("download-#{filename}")
+      temp_file.binmode
+
+      begin
+        Net::FTP.open(host) do |ftp|
+          ftp.passive = true
+          if options[:user] && options[:password]
+            ftp.login( options[:user], options[:password] )
+          else
+            ftp.login
+          end
+          ftp.chdir(remote_dir) unless remote_dir == '.'
+
+          begin
+            ftp.getbinaryfile( filename, temp_file )
+          rescue => e
+            return Result.new(
+              :error   => e.inspect,
+              :success => false,
+              :code    => 550,
+            )
+          end
+        end
+      rescue => e
+        return Result.new(
+          :error   => e.inspect,
+          :success => false,
+        )
+      end
+
+      contents = temp_file.read
+      temp_file.close
+      Result.new(
+        :body    => contents,
+        :success => true,
+        :code    => 200,
+      )
+    end
+
+  class Result
+    def initialize(options)
+      @success = options[:success]
+      @body    = options[:body]
+      @code    = options[:code]
+      @error   = options[:error]
+    end
+    def error
+      @error
+    end
+    def success?
+      @success
+    end
+    def body
+      @body
+    end
+    def code
+      @code
+    end
+  end
+end