Заголовок x-oauth-basic не одинаков в CURL и HTTP.Conduit

Скорее всего, я упускаю какую-то важную информацию или что-то еще, но здесь идет.

В настоящее время я пытаюсь вставить свой собственный заголовок, а именно x-oauth-basic в мой HTTP-запрос, используя библиотеку HTTP.Conduit. Это работает, но не в моем понимании,

submitPostRequest urlString githubKey body =
    case parseUrl urlString of
        Nothing -> return $ "URL Syntax Error"
        Just initReq -> withManager $ \manager -> do
            let req = initReq { secure = False -- Turn on https
                           , method = "POST"
                           , requestHeaders = [("x-oauth-basic", (encodeUtf8 githubKey))]
                                              <> [("User-Agent", "HsCMS")]
                           , requestBody = RequestBodyBS (toStrict body)
                           , checkStatus = \_ _ _ -> Nothing
                           }
            res <- httpLbs req manager
            return $ responseBody res

важный момент

requestHeaders = [("x-oauth-basic", (encodeUtf8 githubKey))]
                 <> [("User-Agent", "HsCMS")]

Используя провал HTTP, я вижу, что заголовок сформирован как HTTP_X_OAUTH_BASIC, Это не должно иметь HTTP немного впереди Тестирование с завитком,

curl -u 78y8713k1j23nkjnkjnuy366366363666gdasddd:x-oauth-basic --request POST --data '{"description":"Updated via API","files":{"file1.txt":{"filename": "newsies.txt", "content":"New Demo"}}' http://www.posttestserver.com/post.php\?dir\=Testing

заголовок там не появляется, что говорит о том, что провал скважины не поднимает x-заголовки. Пример curl также работает с моей предполагаемой конечной точкой - API github, поэтому я знаю, что подход curl правильный, а мой HTTP.Conduit - нет.

Итак, мой вопрос, как мне сделать так, чтобы мой заголовок HTTP.Conduit отображался как x-header, например, кудри, вместо текущего http-x-header что я получаю?

Кроме того, не волнуйтесь, используемый ключ github не является действительным ключом...

Обновление и исправление

Итак, как упоминалось в комментарии к ответу Майкла Снойманса, это было решено с помощью другого заголовка, а именно ("Authorization", "token " <> (encodeUtf8 githubKey)) что, очевидно, было чем-то, что отправлял CURL при выполнении <token>:x-oauth-basic,

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

Спасибо за помощь!

1 ответ

Решение

Я думаю, что проблема с вашим приложением провала. Похоже, что он печатает CGI-версии заголовков. Я не знаю, как выглядит провал, поэтому я реализовал простую в Warp, и действительно, заголовок запроса проходит правильно. Вы можете клонировать проект на FP Haskell Center, чтобы попробовать его самостоятельно. Для полноты вот код ниже:

{-# LANGUAGE OverloadedStrings #-}
import           Control.Concurrent.Async (withAsync)
import           Control.Monad.IO.Class   (liftIO)
import           Data.ByteString          (ByteString)
import qualified Data.ByteString.Lazy     as L
import           Data.Monoid              (mempty, (<>))
import           Data.Text                (Text)
import           Data.Text.Encoding       (encodeUtf8)
import           Network.HTTP.Conduit     (RequestBody (RequestBodyBS),
                                           checkStatus, httpLbs, method,
                                           parseUrl, requestBody,
                                           requestHeaders, responseBody, secure,
                                           withManager)
import           Network.HTTP.Types       (status200)
import qualified Network.Wai              as Wai
import           Network.Wai.Handler.Warp (run)
import           System.Environment       (getEnv)

main :: IO ()
main = do
    port <- fmap read $ getEnv "PORT"
    withAsync (run port app) $ const $ do
        submitPostRequest
            ("http://localhost:" ++ show port)
            "dummy-key"
            "dummy body" >>= print

app :: Wai.Application
app req = do
    liftIO $ mapM_ print $ Wai.requestHeaders req
    return $ Wai.responseLBS status200 [] mempty

submitPostRequest :: String -> Text -> ByteString -> IO L.ByteString
submitPostRequest urlString githubKey body =
    case parseUrl urlString of
        Nothing -> return $ "URL Syntax Error"
        Just initReq -> withManager $ \manager -> do
            let req = initReq { secure = False -- Turn on https
                           , method = "POST"
                           , requestHeaders = [("x-oauth-basic", (encodeUtf8 githubKey))]
                                              <> [("User-Agent", "HsCMS")]
                           , requestBody = RequestBodyBS body
                           , checkStatus = \_ _ _ -> Nothing
                           }
            res <- httpLbs req manager
            return $ responseBody res

Когда я запускаю это, вывод в консоли:

("Host","localhost:8004")
("Accept-Encoding","gzip")
("Content-Length","10")
("x-oauth-basic","dummy-key")
("User-Agent","HsCMS")
Empty
Другие вопросы по тегам