Регистрация

HTTP Basic authentication

Обсуждение вопросов по разработке программ в среде продуктов копорации "Progress Software"
Новичок
Сообщения: 7
Зарегистрирован: Ср сен 19, 2012 6:35 pm

HTTP Basic authentication

Сообщение tokutei » Вт дек 02, 2014 8:50 pm

Доброго времени суток. Пытаюсь скачать ZIP файл с сервера с HTTP Basic authentication. Почитал про этот стандарт - написал програмку, которая передает пару логин/пароль в запросе GET, но желаемого эффекта я не получил. К серверу подключается, но аутентификация не проходит, в следствии чего нет прав для скачивания файла. Как оказалось, сайт должен возвращать cookie-файл, который в последствии нужно использовать. Пожалуйста, ткинте носом в литературу где можно почитать, как обращаться с печеньками. Progress 10.1b WIN7

Код: Выделить всё
DEFINE INPUT PARAMETER  wurl AS CHARACTER FORMAT "X(255)" NO-UNDO.
DEFINE INPUT PARAMETER  vfile AS CHARACTER FORMAT "X(255)" NO-UNDO.
 
DEFINE VARIABLE vhost AS CHARACTER  NO-UNDO.
DEFINE VARIABLE vport AS CHARACTER  NO-UNDO.
DEFINE VARIABLE vpath AS CHARACTER  NO-UNDO.

DEFINE VARIABLE vSocket AS HANDLE    NO-UNDO.
DEFINE VARIABLE wstatus AS LOGICAL   NO-UNDO.
DEFINE VARIABLE vStr    AS CHARACTER NO-UNDO.
DEFINE VARIABLE vBuffer AS MEMPTR    NO-UNDO.
DEFINE VARIABLE wloop   AS LOGICAL   NO-UNDO.

/*----------------------------------------------------------------------------------------------------------------------*/
 
RUN UrlParser(INPUT wurl, OUTPUT vhost, OUTPUT vport, OUTPUT vpath).
RUN HTTPGet(vhost, vport, vpath, vfile).

/*===================================================================*/
PROCEDURE UrlParser:
    DEFINE INPUT PARAMETER purl AS CHARACTER NO-UNDO.
    DEFINE OUTPUT PARAMETER phost AS CHARACTER NO-UNDO.
    DEFINE OUTPUT PARAMETER pport AS CHARACTER NO-UNDO.
    DEFINE OUTPUT PARAMETER ppath AS CHARACTER NO-UNDO.
   
    DEFINE VARIABLE vStr AS CHARACTER NO-UNDO.
   
    IF purl BEGINS "http://" THEN DO:
        vStr = SUBSTRING(purl, 8).
        phost = ENTRY(1, vStr, "/").
        IF NUM-ENTRIES(vStr, "/") = 1 THEN vStr = vStr + "/".
        ppath = SUBSTRING(vStr, INDEX(vStr,"/")).
        IF NUM-ENTRIES(phost, ":") > 1 THEN DO:
            pport = ENTRY(2, phost, ":").
            phost = ENTRY(1, phost, ":").
        END.
        ELSE DO:
            pport = "80".
        END.
    END.
    ELSE DO:
        phost = "".
        pport = "".
        ppath = purl.
    END.
END PROCEDURE.
/*===================================================================*/
PROCEDURE HTTPGet:
    DEFINE INPUT PARAMETER phost AS CHARACTER NO-UNDO.
    DEFINE INPUT PARAMETER pport AS CHARACTER NO-UNDO.
    DEFINE INPUT PARAMETER ppath AS CHARACTER NO-UNDO.
    DEFINE INPUT PARAMETER pfile AS CHARACTER NO-UNDO.
   
    wloop = YES.
    CREATE SOCKET vSocket.
    vSocket:SET-READ-RESPONSE-PROCEDURE ("readHandler",THIS-PROCEDURE).
    wstatus = vSocket:CONNECT("-H " + phost + " -S " + pport) NO-ERROR.
   
    IF wstatus = NO THEN DO:
        MESSAGE "Не удалось подключиться к серверу".
        DELETE OBJECT vSocket.
        RETURN.
    END.

    vStr = "GET " + ppath + " HTTP/1.1 ~n"
               + "Connection: Close ~n"
               + "Authorization: Basic <логин:пароль(в base64)> ~n"
               + "~n".
    SET-SIZE(vBuffer) = LENGTH(vStr) + 1.
    PUT-STRING(vBuffer,1) = vStr.
    vSocket:WRITE(vBuffer, 1, LENGTH(vStr)).
    SET-SIZE(vBuffer) = 0.
    WAIT-FOR CLOSE OF THIS-PROCEDURE.
    vSocket:DISCONNECT().
    DELETE OBJECT vSocket.
END PROCEDURE.
 /*===================================================================*/
PROCEDURE readHandler:
    DEFINE VARIABLE l AS INTEGER NO-UNDO.
    DEFINE VARIABLE b AS MEMPTR NO-UNDO.   
 
    IF SELF:CONNECTED() = FALSE THEN DO:
        APPLY 'CLOSE' TO THIS-PROCEDURE.
        RETURN.
    END.
    l = vSocket:GET-BYTES-AVAILABLE().
    IF l > 0 THEN DO:
        SET-SIZE(b) = l.
        vSocket:READ(b, 1, l, 1).
        COPY-LOB FROM b TO FILE vfile APPEND.
        SET-SIZE(b) = 0.
        wloop = YES.
    END.
    ELSE DO:
        wloop = NO.
    END.
END PROCEDURE.
/*===================================================================*/

Администратор
Аватара пользователя
Сообщения: 1880
Зарегистрирован: Пт мар 25, 2005 6:05 pm
Откуда: Progress Technologies

Re: HTTP Basic authentication

Сообщение Arelav » Ср дек 03, 2014 11:23 am

Вот здесь, по запросу "cookie", выдает много чего, может что и пригодится из того:
http://knowledgebase.progress.com/pkb_H ... 3AOpenEdge

Вернуться в PROGRESS - 4GL - ПРОГРАММИРОВАНИЕ

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5