Заголовок 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