@@ -171,7 +171,6 @@ def initialize(api_key:, api_url: 'https://engine.lingo.dev', batch_size: 25, id
171171 batch_size : batch_size ,
172172 ideal_batch_item_size : ideal_batch_item_size
173173 )
174- @client = nil
175174 yield @config if block_given?
176175 @config . send ( :validate! )
177176 end
@@ -456,13 +455,13 @@ def recognize_locale(text)
456455 raise ValidationError , 'Text cannot be empty' if text . nil? || text . strip . empty?
457456
458457 begin
459- response = http_client . post (
458+ response = make_request (
460459 "#{ config . api_url } /recognize" ,
461460 json : { text : text }
462461 )
463462
464463 handle_response ( response )
465- data = JSON . parse ( response . body . to_s , symbolize_names : true )
464+ data = JSON . parse ( response . body , symbolize_names : true )
466465 data [ :locale ] || ''
467466 rescue StandardError => e
468467 raise APIError , "Request failed: #{ e . message } "
@@ -478,11 +477,12 @@ def recognize_locale(text)
478477 # # => { email: "user@example.com", id: "user-id" }
479478 def whoami
480479 begin
481- response = http_client . post ( "#{ config . api_url } /whoami" )
480+ response = make_request ( "#{ config . api_url } /whoami" )
482481
483- return nil unless response . status . success?
482+ status_code = response . code . to_i
483+ return nil unless status_code >= 200 && status_code < 300
484484
485- data = JSON . parse ( response . body . to_s , symbolize_names : true )
485+ data = JSON . parse ( response . body , symbolize_names : true )
486486 return nil unless data [ :email ]
487487
488488 { email : data [ :email ] , id : data [ :id ] }
@@ -603,85 +603,19 @@ def self.quick_batch_translate(content, api_key:, target_locales:, source_locale
603603
604604 private
605605
606- def http_client
607- @client ||= NetHTTPAdapter . new ( config . api_key )
608- end
609-
610- # Adapter class to use Net::HTTP instead of HTTP gem
611- # This provides better control over SSL context and avoids CRL verification issues
612- class NetHTTPAdapter
613- def initialize ( api_key )
614- @api_key = api_key
615- end
616-
617- def post ( url , json : nil )
618- uri = URI ( url )
619- http = Net ::HTTP . new ( uri . host , uri . port )
620- http . use_ssl = true
621- http . read_timeout = 60
622- http . open_timeout = 60
623-
624- request = Net ::HTTP ::Post . new ( uri . path )
625- request [ 'Authorization' ] = "Bearer #{ @api_key } "
626- request [ 'Content-Type' ] = 'application/json; charset=utf-8'
627- request . body = JSON . generate ( json ) if json
628-
629- response = http . request ( request )
630-
631- # Wrap response to be compatible with HTTP gem interface
632- ResponseWrapper . new ( response )
633- end
634- end
635-
636- # Wrapper to make Net::HTTP response compatible with HTTP gem interface
637- class ResponseWrapper
638- def initialize ( response )
639- @response = response
640- end
641-
642- def status
643- StatusWrapper . new ( @response . code . to_i )
644- end
606+ def make_request ( url , json : nil )
607+ uri = URI ( url )
608+ http = Net ::HTTP . new ( uri . host , uri . port )
609+ http . use_ssl = true
610+ http . read_timeout = 60
611+ http . open_timeout = 60
645612
646- def body
647- BodyWrapper . new ( @response . body )
648- end
613+ request = Net ::HTTP ::Post . new ( uri . path )
614+ request [ 'Authorization' ] = "Bearer #{ config . api_key } "
615+ request [ 'Content-Type' ] = 'application/json; charset=utf-8'
616+ request . body = JSON . generate ( json ) if json
649617
650- def reason
651- @response . message
652- end
653- end
654-
655- class StatusWrapper
656- def initialize ( code )
657- @code = code
658- end
659-
660- def code
661- @code
662- end
663-
664- def success?
665- @code >= 200 && @code < 300
666- end
667-
668- def server_error?
669- @code >= 500
670- end
671-
672- def to_s
673- @code . to_s
674- end
675- end
676-
677- class BodyWrapper
678- def initialize ( body )
679- @body = body
680- end
681-
682- def to_s
683- @body
684- end
618+ http . request ( request )
685619 end
686620
687621 def localize_raw ( payload , target_locale :, source_locale : nil , fast : nil , reference : nil , concurrent : false , &progress_callback )
@@ -747,14 +681,14 @@ def localize_chunk(chunk, target_locale:, source_locale:, fast:, reference:, wor
747681 end
748682
749683 begin
750- response = http_client . post (
684+ response = make_request (
751685 "#{ config . api_url } /i18n" ,
752686 json : request_body
753687 )
754688
755689 handle_response ( response )
756690
757- data = JSON . parse ( response . body . to_s , symbolize_names : true )
691+ data = JSON . parse ( response . body , symbolize_names : true )
758692
759693 if !data [ :data ] && data [ :error ]
760694 raise APIError , data [ :error ]
@@ -804,16 +738,17 @@ def count_words_in_record(payload)
804738 end
805739
806740 def handle_response ( response )
807- return if response . status . success?
808-
809- if response . status . server_error?
810- raise ServerError , "Server error (#{ response . status } ): #{ response . reason } . #{ response . body } . This may be due to temporary service issues."
811- elsif response . status . code == 400
812- raise ValidationError , "Invalid request (#{ response . status } ): #{ response . reason } "
813- elsif response . status . code == 401
814- raise AuthenticationError , "Authentication failed (#{ response . status } ): #{ response . reason } "
741+ status_code = response . code . to_i
742+ return if status_code >= 200 && status_code < 300
743+
744+ if status_code >= 500
745+ raise ServerError , "Server error (#{ status_code } ): #{ response . message } . #{ response . body } . This may be due to temporary service issues."
746+ elsif status_code == 400
747+ raise ValidationError , "Invalid request (#{ status_code } ): #{ response . message } "
748+ elsif status_code == 401
749+ raise AuthenticationError , "Authentication failed (#{ status_code } ): #{ response . message } "
815750 else
816- raise APIError , response . body . to_s
751+ raise APIError , response . body
817752 end
818753 end
819754 end
0 commit comments