Как подключиться к Evernote API в Haskell (с httpClient и BinaryProtocol)? - PullRequest
1 голос
/ 05 августа 2020

Я пытаюсь реализовать клиент Evernote Syn c в Haskell. Для первоначального тестирования я хочу подключиться к Userstore с токеном аутентификации разработчика. Приведенный ниже код вызывает исключение: ProtocolExn PE_BAD_VERSION "Missing version identifier"

import Thrift.Transport.HttpClient
import Thrift.Protocol.Binary
import Network.URI
import Data.Text.Lazy
import System.Exit
import UserStore_Client
import UserStore_Consts

-- hardcoded parameters to establish test connnection
auth_token = -- developer-token-for-my-sandbox-account
user_endpoint = "https://sandbox.evernote.com/edam/user"

main :: IO()
main = do
  -- parse url and open thrift http_client
  let uri = parseURI user_endpoint
  http_client <- case uri of
                    (Nothing)         -> die "Not a valid uri"
                    (Just uri_string) -> do http_cl <- (openHttpClient uri_string)
                                            return http_cl
  -- create a binary protocol that will be passed to store methods
  let user_prot = BinaryProtocol http_client

  -- try to use protocol to call a user_store method
  version_ok <- checkVersion (user_prot, user_prot) (pack auth_token) eDAM_VERSION_MAJOR eDAM_VERSION_MINOR

Я предполагаю, что он выбрасывается в функции readMessage в реализации BinaryProtocol. Выдержка из Thrift.Protocol.Binary:

readMessage p = (readMessageBegin p >>=)
      where
        readMessageBegin p = runParser p $ do
          TI32 ver <- parseBinaryValue T_I32
          if ver .&. versionMask /= version1
            then throw $ ProtocolExn PE_BAD_VERSION "Missing version identifier" -- This is the error I get
            else do
              TString s <- parseBinaryValue T_STRING
              TI32 sz <- parseBinaryValue T_I32
              return (decodeUtf8 s, toEnum $ fromIntegral $ ver .&. 0xFF, sz)

    writeVal p = tWrite (getTransport p) . toLazyByteString . buildBinaryValue
    readVal p = runParser p . parseBinaryValue

Нужно ли мне настраивать BinaryProtocol по-другому? Или это может быть из-за разницы версий / несоответствия типов данных и т.д. c между сервером и клиентом?

Модуль UserStore автоматически создается Thrift (версия 0.13.0) из файлов Evernote Thrift.

Любые указания о том, как я могу дальше отлаживать свой код, чтобы понять, что происходит не так, были бы очень признательны.

1 Ответ

1 голос
/ 07 августа 2020

Исключение выбрасывается, потому что сервер возвращает ошибку 403. Это связано с тем, что HttpClient по умолчанию подключается к порту 80.

...