Running with Ruby

Tag: psych

Ruby Geokit invalid trailing UTF-8 octet at line 1 column 1 fix

Today I’ve encountered a small problem with Geokit:

Geokit::Geocoders::IpGeocoder.do_geocode('31.174.47.24')
Psych::SyntaxError: (<unknown>): invalid trailing UTF-8 octet at line 1 column 1

I don’t have time (because it happened on production) to investigate this issue, so I’ve developed a quick temporary fix, which just removes invalid characters:

# Temporary workaround for crazy not UTF-8 characters in response
module Geokit
  module Geocoders
    class IpGeocoder
      require 'iconv'

      def self.parse_body(body)
        yaml = YAML.load(Iconv.conv('ASCII//IGNORE', 'UTF8', body))
        res = GeoLoc.new
        res.provider = 'hostip'
        res.city, res.state = yaml['City'].split(', ')
        country, res.country_code = yaml['Country'].split(' (')
        res.lat = yaml['Latitude']
        res.lng = yaml['Longitude']
        res.country_code.chop!
        res.success = !(res.city =~ /\(.+\)/)
        res
      end
    end
  end
end

Rails 3.0.7, Ruby 1.9.2 + Couldn’t parse YAML at line 41 column 14 (Psych::SyntaxError)

Po reinstalacji systemu, instalacji RVMa oraz gemsetów, natknąłem się na taki oto błąd (niezależnie czy odpalałem testy, rake’a czy też serwer):

Couldn't parse YAML at line 41 column 14 (Psych::SyntaxError)

Nie zamieszczam stacktrace’a, ponieważ i tak nic nie wnosił (nie podawał pliku yaml w którym występował błąd). Na szczęście diagnoza problemu okazała się całkiem prosta. Winny okazał się taki oto fragment yamla:

order: [:year, :month, :day]

Okazuje się, że w nowszych wersjach psych, taki sposób osadzania symboli nie przechodzi i należy rozbić to na oddzielne wiersze:

order:
  :year
  :month
  :day

Poprawki takie należy wprowadzić we wszystkich miejscach gdzie umieszczaliśmy symbole w sposób “tablicowy”. W moim przypadku, na szczęście były to tylko dwa pliki.

Copyright © 2018 Running with Ruby

Theme by Anders NorenUp ↑