Я пытаюсь реализовать клиент 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.
Любые указания о том, как я могу дальше отлаживать свой код, чтобы понять, что происходит не так, были бы очень признательны.