Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > MacOSX и HTTP


Автор: tyko 16.1.2008, 15:07
как залогинится на сайт POST запросом?
использую Carbon, желательно без Cocoa (если с ней с объясните, плиз, почему).
параметрами передаются три значения: логин, пароль, и версия.
три дня весь нет перерываю, ничего вразумительного найти не могу. 

Автор: archimed7592 16.1.2008, 15:32
Смотря что понимать под "залогиниться" smile. К примеру, при залогинивании на данный форум при создании запроса не нужно передавать никаких логино-паролей.

Цитата(tyko @  16.1.2008,  15:07 Найти цитируемый пост)
параметрами передаются три значения: логин, пароль, и версия.

Куда передаются?

Автор: tyko 16.1.2008, 15:45
не совсем понял...
имется страница с формой, где заполняются три вышеперечисленных поля и нажимается Submit.
Мне нужно это сделать програмно.

Добавлено через 1 минуту и 17 секунд
таким образом проверяю имеет ли пользователь свой акаунт...

Автор: tyko 16.1.2008, 16:29
попробую сузить вопрос.
Первый запрос делаю методом GET, поулчаю ответ.
если кто-нибуть подскажет как из ответа севера вытащить значение PHPSESSID, то дальше я разберусь.
Как формировать POST разобрался.

Автор: tyko 17.1.2008, 10:38
Вот код
Код

...
    messageRef = CFHTTPMessageCreateRequest( kCFAllocatorDefault, CFSTR("GET"), urlRef, kCFHTTPVersion1_1 );
    if ( messageRef == NULL ) goto Bail;

    // Create the stream for the request.
    readStreamRef   = CFReadStreamCreateForHTTPRequest( kCFAllocatorDefault, messageRef );
    if ( readStreamRef == NULL ) goto Bail;
   
        if ( CFReadStreamSetProperty(readStreamRef, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue) == false )
        goto Bail;

    // Set the client notifier
    if ( CFReadStreamSetClient( readStreamRef, kNetworkEvents, ReadStreamClientCallBack, &ctxt ) == false )
        goto Bail;
    
    // Schedule the stream
    CFReadStreamScheduleWithRunLoop( readStreamRef, CFRunLoopGetCurrent(), kCFRunLoopCommonModes );
    
    // Start the HTTP connection
    if ( CFReadStreamOpen( readStreamRef ) == false )
        goto Bail;
    
    //  Set up a watch dog timer to terminate the download after 5 seconds
    if ( networkTimeoutTimerUPP == NULL )   networkTimeoutTimerUPP  = NewEventLoopTimerUPP( NetworkTimeoutTimerProc );
    if ( gNetworkTimeoutTimerRef != NULL ) RemoveEventLoopTimer( gNetworkTimeoutTimerRef );
    InstallEventLoopTimer( GetCurrentEventLoop(), kEventDurationSecond * 10, 0, networkTimeoutTimerUPP, (void*)readStreamRef, &gNetworkTimeoutTimerRef );
...

сама функция ReadStreamClientCallBack
Код

static void ReadStreamClientCallBack( CFReadStreamRef stream, CFStreamEventType type, void *clientCallBackInfo )
{
    #pragma unused (clientCallBackInfo)
    UInt8       buffer[16 * 1024];              //  Create a 16K buffer
    CFIndex     bytesRead;
    
        switch ( type )
        {
            case kCFStreamEventHasBytesAvailable:
              bytesRead = CFReadStreamRead( stream, buffer, sizeof(buffer) );
                
                  CFHTTPMessageRef myResponseHeader = NULL;
                  myResponseHeader = CFReadStreamCopyProperty ( stream, kCFStreamPropertyHTTPResponseHeader );
          CFStringRef sheader;
          sheader = CFHTTPMessageCopyHeaderFieldValue(stream, CFSTR("Set-Cookie")); // <-- НИЧЕГО
          
                  // пробую так
          CFDictionaryRef dict=NULL;
          dict = CFHTTPMessageCopyAllHeaderFields(stream);
          CFIndex ind = CFDictionaryGetCount(dict); // <-- тоже ничего, ind=0
...

что не так делаю 

да, кстати, запрос возвращает ожидаемый html код с формой.
Проблема в получении куки сенса... 

Автор: tyko 17.1.2008, 12:44
проблема решена

если кому интересно
в фукции 
     sheader = CFHTTPMessageCopyHeaderFieldValue(stream, CFSTR("Set-Cookie")); // <-- НИЧЕГО
вместо stream нужно было поставить myResponseHeader

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)