socketry / cloudflare

An asynchronous Ruby wrapper for the CloudFlare V4 API.
MIT License
139 stars 88 forks source link

Async::REST::Error: Unknown content type: application/octet-stream! on reading from KV #63

Closed dorongutman closed 3 years ago

dorongutman commented 4 years ago

I have the following example code:

Cloudflare.connect(key: CLOUDFLARE_KEY, email: CLOUDFLARE_EMAIL) do |connection|
  puts "we have a connection: #{connection}"
  account = connection.accounts.to_a[0]
  puts "account is: #{account}"

  namespaces = account.kv_namespaces
  puts "namespaces are: #{namespaces}"

  namespace = namespaces.find_by_id(NAMESPACE_ID)
  puts "namespace is: #{namespace}"

  namespace.write_value('my-test', 'asd')
  puts "value is: #{namespace.read_value('my-test')}"

end

Running it in rails c gives the following:

we have a connection: #<Cloudflare::Connection:0x00005640ad3743c8>
account is: #<Cloudflare::Account:0x00005640a81dab70>
namespaces are: #<Cloudflare::KV::Namespaces:0x00005640a72ad6c0>
namespace is: #<Cloudflare::KV::Namespace:0x00005640a604f7d0>
    error: Async::Task [oid=0x624d0] [pid=242] [2020-07-31 10:16:12 +0000]
               |   Async::REST::Error: Unknown content type: application/octet-stream!
               |   → /srv/vendor/bundle/ruby/2.7.0/gems/async-rest-0.10.1/lib/async/rest/wrapper/json.rb:75 in `process_response'
               |     /srv/vendor/bundle/ruby/2.7.0/gems/async-rest-0.10.1/lib/async/rest/representation.rb:67 in `process_response'
               |     /srv/vendor/bundle/ruby/2.7.0/gems/cloudflare-4.2.0/lib/cloudflare/representation.rb:82 in `process_response'
               |     /srv/vendor/bundle/ruby/2.7.0/gems/async-rest-0.10.1/lib/async/rest/representation.rb:80 in `block (2 levels) in <class
               |     /srv/vendor/bundle/ruby/2.7.0/gems/async-rest-0.10.1/lib/async/rest/representation.rb:92 in `value!'
               |     /srv/vendor/bundle/ruby/2.7.0/gems/async-rest-0.10.1/lib/async/rest/representation.rb:107 in `value'
               |     /srv/vendor/bundle/ruby/2.7.0/gems/cloudflare-4.2.0/lib/cloudflare/kv/namespaces.rb:39 in `read_value'
               |     (irb):256 in `block in irb_binding'
               |     /srv/vendor/bundle/ruby/2.7.0/gems/cloudflare-4.2.0/lib/cloudflare.rb:41 in `block in connect'
               |     /srv/vendor/bundle/ruby/2.7.0/gems/async-1.26.1/lib/async/task.rb:258 in `block in make_fiber'
ioquatix commented 4 years ago

It probably means that Cloudflare have changed their API and something is broken and returning a non-JSON error message.

ioquatix commented 4 years ago

You could try printing it out in lib/cloudflare/representation.rb:82 in 'process_response'

dorongutman commented 4 years ago

@ioquatix I don't think so, because using Postman (or plain old curl) returns successful results but the headers of the response still return as application/octet-stream;

HTTP/1.1 200 OK
Date: Fri, 31 Jul 2020 12:35:27 GMT
Content-Type: application/octet-stream
Content-Length: 22
Connection: keep-alive
CF-Ray: REDACTED
Accept-Ranges: bytes
Cache-Control: no-store, no-cache, must-revalidate
CF-Cache-Status: DYNAMIC
cf-request-id: REDACTED
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
x-envoy-upstream-service-time: 209
Server: cloudflare
ioquatix commented 4 years ago

What is the content of the response, is it JSON?

dorongutman commented 4 years ago

in this specific case it's the string asd (as you can see in the example code in the issue description), but it's the same results if it's a json string.

ioquatix commented 4 years ago

Ah I see so we should really allow a non-json response from this endpoint.