[Haskell-beginners] Re: A problem with network.curl and a possible solution

Michael Litchard michael at schmong.org
Fri Oct 22 18:52:07 EDT 2010


SOLVED

it was a problem with the example code, which I put here for other
hapless newbs.
change
CurlPostFields [ "login=" ++ user, "password=" ++ pass ] : method_POST
to
method_POST ++ [CurlPostFields [ "login=" ++ user, "password=" ++ pass ]]

Thanks to aristid from #freenode for the help.
I'm sticking with Network.Curl

On Fri, Oct 22, 2010 at 1:44 PM, Michael Litchard <michael at schmong.org> wrote:
> I'm using the code from the following blog as a template to create a
> session on a work server using ssl. To begin with, I am sticking with
> the example site github.com. I have noticed that the code that does a
> POST, does a GET request instead. I suspect this is a problem with the
> underlying libcurl. I have decided to test out another library,
> network.browser. If I get the same behavior, then I know I'm the one
> screwing up. If I get the right behavior, I will move over to
> network.browser. The problem is, I am having difficulty writing the
> same functionality with network.browser. I don't know how to
> "activate", or manage the cookie jar. And I don't know how to send
> data with a POST request. The url, and sample code are below. I would
> like a demonstration of how to accomplish the same this using
> Network.Browser. With the help of the blog example, Network.Curl is
> accessible enough , but I just can't get the POST request to work.
>
>
> http://flygdynamikern.blogspot.com/2009/03/extended-sessions-with-haskell-curl.html
>
>> import Network.Curl
>> import System (getArgs)
>> import Text.Regex.Posix
>
>> -- | Standard options used for all requests. Uncomment the @CurlVerbose@
>> -- option for lots of info on STDOUT.
>
> I like the verbose output, and the way the cookie jar is automagically
> made. I will manage the cookie jar if I have to, I just need to know
> how.
>
>> opts = [ CurlCookieJar "cookies" {- , CurlVerbose True -} ]
>
>> -- | Additional options to simulate submitting the login form.
>> loginOptions user pass =
>>   CurlPostFields [ "login=" ++ user, "password=" ++ pass ] : method_POST
>
>> main = withCurlDo $ do
>>   -- Get username and password from command line arguments (will cause
>>   -- pattern match failure if incorrect number of args provided).
>>   [user, pass] <- getArgs
>
>>   -- Initialize curl instance.
>>   curl <- initialize
>>   setopts curl opts
>
>
>>   -- POST request to login.
>>   r <- do_curl_ curl "https://github.com/session" (loginOptions user pass)
>>     :: IO CurlResponse
>>   if respCurlCode r /= CurlOK || respStatus r /= 302
>>     then error $ "Failed to log in: "
>>                ++ show (respCurlCode r) ++ " -- " ++ respStatusLine r
>>     else do
>>       -- GET request to fetch account page.
>>       r <- do_curl_ curl ("https://github.com/account") method_GET
>>         :: IO CurlResponse
>>       if respCurlCode r /= CurlOK || respStatus r /= 200
>>         then error $ "Failed to retrieve account page: "
>>                    ++ show (respCurlCode r) ++ " -- " ++ respStatusLine r
>>         else putStrLn $ extractToken $ respBody r
>> -- | Extracts the token from GitHub account HTML page.
>
>
> The code below is not important for my purposes,
>> extractToken body = head' "GitHub token not found" xs
>>   where
>>     head' msg l = if null l then error msg else head l
>>     (_,_,_,xs)  = body =~ "github\\.token (.+)"
>>                :: (String, String, String,[String])
>


More information about the Beginners mailing list