Автоматический upload данных по Internet
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Частый Гость
- Сообщения: 26
- Зарегистрирован: 21 фев 2003, 11:42
- Откуда: Toronto
SS,
спасибо громадное за код. Так все гораздо понятнее. Правда на PERL я никогда не писал, поэтому отдельное спасибо за строчку "# this is equal to c-style declration", без нее я вряд ли бы понял что происходит внутри функции.
Попутно два вопроса:
Какой нынче самый популярный интерпретатор PERL для Wni2k?
А бинарные данные таким же образом отправить можно? В изначальном вопросе стоял ASCII, так что это простое любопытство.
спасибо громадное за код. Так все гораздо понятнее. Правда на PERL я никогда не писал, поэтому отдельное спасибо за строчку "# this is equal to c-style declration", без нее я вряд ли бы понял что происходит внутри функции.
Попутно два вопроса:
Какой нынче самый популярный интерпретатор PERL для Wni2k?
А бинарные данные таким же образом отправить можно? В изначальном вопросе стоял ASCII, так что это простое любопытство.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
http://www.activestate.com/Products/ActivePerl/leonid писал(а):Попутно два вопроса:
Какой нынче самый популярный интерпретатор PERL для Wni2k?
я бы не перле отраотал протатип, а потом написал бы на басике или си++.... не гоже клиента форсить перл ставить

-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
2leonid,
ПС. Я ж говорю, leonid. Непростой Вы товарищь, хоть и говорите так о себе, мол, не разбераетесь
Скромняга
Ну, и, кстати в части прохождения через прости ("о косяках" для M$) - тоже неплохо.
base64 encode -> ASCII.А бинарные данные таким же образом отправить можно? В изначальном вопросе стоял ASCII, так что это простое любопытство.

ПС. Я ж говорю, leonid. Непростой Вы товарищь, хоть и говорите так о себе, мол, не разбераетесь


- Marmot
- Графоман
- Сообщения: 39279
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
ОК, уговорили
, тоже самое на Java+ Apache HttpClient

Код: Выделить всё
import java.io.File;
import java.io.FileInputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
public class PostFile {
public static void main(String[] args) throws Exception {
HttpClient client = new HttpClient();
PostMethod httppost = new PostMethod("http://www.yourserver.com/service");
File file = new File(args[0]);
httppost.setRequestBody(new FileInputStream(file));
httppost.setRequestContentLength((int)file.length());
client.executeMethod(httppost);
if (httppost.getStatusCode() == HttpStatus.SC_OK) {
System.out.println(httppost.getResponseBodyAsString());
} else {
System.out.println("Unexpected failure: " + httppost.getStatusLine().toString());
}
httppost.releaseConnection();
}
}
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
2leonid,
Выше Вам SS пропостил, как сделать POST:
Я тоже думаю, что WinInet - хорошая штука. И конечно поддерживаю Мармота. Но для простых задач, ведь WinInet ещё и изучать надо
Ваша задача включает только одну операцию, никаких наворотов нет. Поэтому, я думаю, что в таких случаях, можно просто писать в сокет прокси то, что требует http 1.1. Ниже работающий код, где делается GET, а не POST. По крайней мере, это скомпилировано, проверено мною в разных ракурсах (и с аутинтификацией, и без неё, и с совсем просто и чуть сложнее). С POST мне негде протестировать мой код, к сожалению, сейчас. Замените там GET на РОST + то, что Вам пропостили (....Content-Type: application....). Думаю, Вы получите желаемый результат. И ещё, там ниже некоторые вариации в зависимости от того, разрешён анонимный логон, или нет на прокси из локалки. Здесь всё будет зависеть от админов Ваших кастомеров. Как они заставят юзверей логониться, так и будет.
Если аутентификация на прокси не поддерживается (легко, например, для winproxy, а эта байда тоже может быть у кастомера
), или отключена (по умолчанию отключена у изделий MS, и почему-то не все админы вспоминают включить
), то строчки:
...писать не надо, а вот в конце предыдущих строчек надо обязательно добавить <\r\n>. Т.е. она будет выглядеть:
Короче, пишите на сокетах. Прозрачно. Эффективно. Быстро пишется. Не требует ни могутных библиотек, ни .... Прости, Marmot
ПС. Там для http 1.1 я привёл только минимум, разумеется для GET-та можно былоб дописывать всякую фигню:
Ну, а для POST - сделаете сами. 
Выше Вам SS пропостил, как сделать POST:
Я Вам дал ссылку на "С++"-код с POST с использованием пушки (по воробьям), WinInet. Подрихтуете, исправите ошибки (они там есть). Можно пользоваться. И, кстати, Мармоту будет приятно, если Вы его идею поддержите, насчёт WinInetprint $SOCKET "POST "; print $SOCKET $_[0];
print $SOCKET "\nContent-Type: application/x-www-form-urlencoded\n\n";
print $SOCKET "log_update="; print $SOCKET $_[1];


Код: Выделить всё
int _tmain(int argc, _TCHAR* argv[])
{
WSAData wsaData;
if (WSAStartup(0x202,(WSADATA *)&wsaData ))
{
printf("WSAStart error %d\n",WSAGetLastError());
return -1;
}
// Cоздаём обычный сокет, как для LAN.
SOCKET sock;
sock=socket(AF_INET,SOCK_STREAM,0);
if ( sock < 0 )
{
printf("Socket() error %d\n",WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
// прокси-сервер у нас в локальной сети здесь
#define PROXYSERVER "192.168.55.5"
#define PROXYPORT 3080 // Прокси-изделия M$ по умолчанию слушают 8080. Подрихтуйте;))
sockaddr_in socks_addr;
socks_addr.sin_family = AF_INET;
socks_addr.sin_port = htons(PROXYPORT);
socks_addr.sin_addr.s_addr = inet_addr(PROXYSERVER);
// коннектимся к прокси-серверу
if ( connect( sock,(sockaddr *)&socks_addr, sizeof(socks_addr)) )
{
printf("Connect error %d\n",WSAGetLastError());
closesocket( sock );
WSACleanup();
return -1;
}
printf("Connection with PROXY SEREVER %s Ok\n",PROXYSERVER);
// Разумеется, надо делать не так, а realloc - ком ;)). Иначе сами себя хакнем когда-нибудь ;))
#define BUFSIZE 1024*10
char rqstbuf[BUFSIZE];
char rcvbuf[BUFSIZE];
// Посылаем запрос. В самом конце ещё раз\r\n. Эт важно.
strcpy(rqstbuf, "GET http://www.ya.ru/ HTTP/1.1\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "User-Agent: Leonid Uploader\r\n"); // ;))
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "Host: www.ya.ru\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
// А вот здесь аутентифицируемся на проксе для аутгоинг риквестов.
strcpy(rqstbuf, "Proxy-Authorization: Basic VXNlcjpQYXNzd29yZA==\r\n\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
// Читаем html страничку. В данном случае BUFSIZE хватит с избытком для www.ya.ru
memset( rcvbuf, 0, BUFSIZE);
int rcvbytes = _recv( sock, (_BYTE *) rcvbuf, BUFSIZE, 0, 5);
printf("%s\n",rcvbuf);
shutdown( sock, SD_SEND );
closesocket( sock );
WSACleanup();
printf("\nAny key for exit...");
getch();
return 0;
}


Код: Выделить всё
strcpy(rqstbuf, "Proxy-Authorization: Basic VXNlcjpQYXNzd29yZA==\r\n\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
Код: Выделить всё
strcpy(rqstbuf, "Host: www.ya.ru\r\n\r\n");



ПС. Там для http 1.1 я привёл только минимум, разумеется для GET-та можно былоб дописывать всякую фигню:
Код: Выделить всё
...
strcpy(rqstbuf, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "Accept-Language: ru\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
strcpy(rqstbuf, "Accept-Encoding: gzip, deflate\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
...
strcpy(rqstbuf, "Proxy-Connection: Keep-Alive\r\n");
_send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
...

-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
2Marmot,
А leonidy тоже придётся ставить на W2k Apache HttpClient у кастомеров?
А энтот клиент со всеми проксями дружит? Уверенность есть?
ПС. Как быть с аутинтификацией на прокси, если там требуется NTLM. Легко это может быть в реальной ситуации у кастомеров
Ну, а что впечатляет. Уже хочу изучать Java.ОК, уговорили , тоже самое на Java+ Apache HttpClient



ПС. Как быть с аутинтификацией на прокси, если там требуется NTLM. Легко это может быть в реальной ситуации у кастомеров

- Marmot
- Графоман
- Сообщения: 39279
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
200К файл, и никакой регистрацииvg писал(а):2Marmot,
http://jakarta.apache.org/commons/httpc ... ation.html
Ну, а что впечатляет. Уже хочу изучать Java.А leonidy тоже придётся ставить на W2k Apache HttpClient у кастомеров?
![]()

ага, поддерживает, см. : http://jakarta.apache.org/commons/httpc ... ation.htmlvg писал(а): А энтот клиент со всеми проксями дружит? Уверенность есть?![]()
ПС. Как быть с аутинтификацией на прокси, если там требуется NTLM. Легко это может быть в реальной ситуации у кастомеров
BTW, это хороший пример как приятно рабоатать с Java:
Берём бесплатный компонент, пишем маленькую программку, используем везде, где есть JVM (на сегодняшний день быстрее перечислить где этого нету

- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
то есть без strcpy, strlen строковые константы в _send() ну никак передать нельзя .. ты прям как лепсик зажигаешьvg писал(а):Код: Выделить всё
... strcpy(rqstbuf, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*\r\n"); _send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1); strcpy(rqstbuf, "Accept-Language: ru\r\n"); _send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1); strcpy(rqstbuf, "Accept-Encoding: gzip, deflate\r\n"); _send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1); ... strcpy(rqstbuf, "Proxy-Connection: Keep-Alive\r\n"); _send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1); ...
- Marmot
- Графоман
- Сообщения: 39279
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
Чегой-то я не понял, а как этот код будет проходить через NTLM?vg писал(а):Короче, пишите на сокетах. Прозрачно. Эффективно. Быстро пишется. Не требует ни могутных библиотек, ни .... Прости, Marmot![]()
![]()
![]()
А вдруг у меня логи сверхсекретные и мне захочется их по SSL передать?
В Java (да и в WinInet) достаточно написать https и ... вобщем-то всё

- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
ты видать про WinInet только в msdn читал. я тебе по секрету скажу, что это тааааакой crap, что рассматривать его для хоть сколько-нибудь продакшен кода не серьезно. он ведет себя по разному не только в зависимости от windows flavor, но и от номера сервис пака или подверсии на win9x. https поддержка заимствуется мз IE. а список root CA - из windows certificate repository. ясный пень, что далеко не у всех стоит strong crypto IE и далеко не каждый юзер согласится добавлять урюпинский self-signed CA чисто, чтобы сливать логи каким-то кренделям ... прорисовывается картина ?Marmot писал(а):Чегой-то я не понял, а как этот код будет проходить через NTLM?vg писал(а):Короче, пишите на сокетах. Прозрачно. Эффективно. Быстро пишется. Не требует ни могутных библиотек, ни .... Прости, Marmot![]()
![]()
![]()
А вдруг у меня логи сверхсекретные и мне захочется их по SSL передать?
В Java (да и в WinInet) достаточно написать https и ... вобщем-то всё

(да и еще - ты в курсе, что микрософт только полгода назад пофикил свой сертификат engine, чтобы тот enforce'ил "CA" attribute в x.509 ? то есть фактически можно было получить node certificate от recognized CA и использовать его как CA cert (!) ... скажи мне честно, хочется тебе, зная про такие баги, пользоваться встроенным SSL'ем ? или чем либо еще встроенным for that matter)
в принципе теже яйцы с self-signed CA, как я понимаю, и в джаве. то есть нужно городить какой-нить свой sslsocketfactory, но это уже как бы не "просто написать https и все" ... не ? am I missing something типа ?
- Marmot
- Графоман
- Сообщения: 39279
- Зарегистрирован: 17 фев 2003, 17:58
- Откуда: Caulfeild
- Контактная информация:
Ага, я хотел сказать SSL для encryption, а не для authentication, для encryption-а любой подходящий cert сгодитсяdrain bamage писал(а):ты видать про WinInet только в msdn читал. я тебе по секрету скажу, что это тааааакой crap, что рассматривать его для хоть сколько-нибудь продакшен кода не серьезно. он ведет себя по разному не только в зависимости от windows flavor, но и от номера сервис пака или подверсии на win9x. https поддержка заимствуется мз IE. а список root CA - из windows certificate repository. ясный пень, что далеко не у всех стоит strong crypto IE и далеко не каждый юзер согласится добавлять урюпинский self-signed CA чисто, чтобы сливать логи каким-то кренделям ... прорисовывается картина ?Marmot писал(а):Чегой-то я не понял, а как этот код будет проходить через NTLM?vg писал(а):Короче, пишите на сокетах. Прозрачно. Эффективно. Быстро пишется. Не требует ни могутных библиотек, ни .... Прости, Marmot![]()
![]()
![]()
А вдруг у меня логи сверхсекретные и мне захочется их по SSL передать?
В Java (да и в WinInet) достаточно написать https и ... вобщем-то всё
(да и еще - ты в курсе, что микрософт только полгода назад пофикил свой сертификат engine, чтобы тот enforce'ил "CA" attribute в x.509 ? то есть фактически можно было получить node certificate от recognized CA и использовать его как CA cert (!) ... скажи мне честно, хочется тебе, зная про такие баги, пользоваться встроенным SSL'ем ? или чем либо еще встроенным for that matter)
в принципе теже яйцы с self-signed CA, как я понимаю, и в джаве. то есть нужно городить какой-нить свой sslsocketfactory, но это уже как бы не "просто написать https и все" ... не ? am I missing something типа ?

По краней мере в Java, в этом случае никакой sslsocketfactory не надо.
ЗЫ А вообще, спор перерастает в идеологический: писать всё с нуля или использовать существующие компоненты...
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
- ajkj3em
- Маньяк
- Сообщения: 2063
- Зарегистрирован: 12 ноя 2006, 06:53
во-первых в ssl есть anonymous mode, который java будет поддерживать видимо через пару лет if ever. во-вторых ssl без authentication serves no purpose, и в третьих factory таки нужна (по-крайней мере в апплетах) иначе ssl handshake обламывается с каким-то exception (деталей не знаю, я чисто рядом стоялMarmot писал(а): Ага, я хотел сказать SSL для encryption, а не для authentication, для encryption-а любой подходящий cert сгодится.
По краней мере в Java, в этом случае никакой sslsocketfactory не надо.
