Автоматический upload данных по Internet

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
leonid
Частый Гость
Сообщения: 26
Зарегистрирован: 21 фев 2003, 11:42
Откуда: Toronto

Сообщение leonid »

SS,

спасибо громадное за код. Так все гораздо понятнее. Правда на PERL я никогда не писал, поэтому отдельное спасибо за строчку "# this is equal to c-style declration", без нее я вряд ли бы понял что происходит внутри функции.

Попутно два вопроса:
Какой нынче самый популярный интерпретатор PERL для Wni2k?
А бинарные данные таким же образом отправить можно? В изначальном вопросе стоял ASCII, так что это простое любопытство.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

leonid писал(а):Попутно два вопроса:
Какой нынче самый популярный интерпретатор PERL для Wni2k?
http://www.activestate.com/Products/ActivePerl/

я бы не перле отраотал протатип, а потом написал бы на басике или си++.... не гоже клиента форсить перл ставить :)
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2SS,
А с аутентификацией на прокси в Вашем коде как быть :wink:

ПС. Хорошо, если Basic. Но там (у кастомера) ведь не только сквид, но и ISA или MS Proxy могут стоять. :D
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2leonid,
А бинарные данные таким же образом отправить можно? В изначальном вопросе стоял ASCII, так что это простое любопытство.
base64 encode -> ASCII. :D

ПС. Я ж говорю, leonid. Непростой Вы товарищь, хоть и говорите так о себе, мол, не разбераетесь :D Скромняга :D Ну, и, кстати в части прохождения через прости ("о косяках" для M$) - тоже неплохо.
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

ОК, уговорили :-), тоже самое на 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();
  }
}
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2leonid,

Выше Вам SS пропостил, как сделать POST:
print $SOCKET "POST "; print $SOCKET $_[0];
print $SOCKET "\nContent-Type: application/x-www-form-urlencoded\n\n";
print $SOCKET "log_update="; print $SOCKET $_[1];
Я Вам дал ссылку на "С++"-код с POST с использованием пушки (по воробьям), WinInet. Подрихтуете, исправите ошибки (они там есть). Можно пользоваться. И, кстати, Мармоту будет приятно, если Вы его идею поддержите, насчёт WinInet :D Я тоже думаю, что WinInet - хорошая штука. И конечно поддерживаю Мармота. Но для простых задач, ведь WinInet ещё и изучать надо :!: Ваша задача включает только одну операцию, никаких наворотов нет. Поэтому, я думаю, что в таких случаях, можно просто писать в сокет прокси то, что требует http 1.1. Ниже работающий код, где делается GET, а не POST. По крайней мере, это скомпилировано, проверено мною в разных ракурсах (и с аутинтификацией, и без неё, и с совсем просто и чуть сложнее). С POST мне негде протестировать мой код, к сожалению, сейчас. Замените там GET на РОST + то, что Вам пропостили (....Content-Type: application....). Думаю, Вы получите желаемый результат. И ещё, там ниже некоторые вариации в зависимости от того, разрешён анонимный логон, или нет на прокси из локалки. Здесь всё будет зависеть от админов Ваших кастомеров. Как они заставят юзверей логониться, так и будет.

Код: Выделить всё

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;	
}
Если аутентификация на прокси не поддерживается (легко, например, для winproxy, а эта байда тоже может быть у кастомера :D ), или отключена (по умолчанию отключена у изделий MS, и почему-то не все админы вспоминают включить :D ), то строчки:

Код: Выделить всё

   strcpy(rqstbuf, "Proxy-Authorization: Basic VXNlcjpQYXNzd29yZA==\r\n\r\n");
   _send( sock, (_BYTE *) rqstbuf, (_DWORD) strlen(rqstbuf), 0, 1);
...писать не надо, а вот в конце предыдущих строчек надо обязательно добавить <\r\n>. Т.е. она будет выглядеть:

Код: Выделить всё

   strcpy(rqstbuf, "Host: www.ya.ru\r\n\r\n");
Короче, пишите на сокетах. Прозрачно. Эффективно. Быстро пишется. Не требует ни могутных библиотек, ни .... Прости, Marmot :( :( :(

ПС. Там для 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);
...
Ну, а для POST - сделаете сами. :D
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2Marmot,
ОК, уговорили , тоже самое на Java+ Apache HttpClient
Ну, а что впечатляет. Уже хочу изучать Java. :D А leonidy тоже придётся ставить на W2k Apache HttpClient у кастомеров? :D А энтот клиент со всеми проксями дружит? Уверенность есть? :D

ПС. Как быть с аутинтификацией на прокси, если там требуется NTLM. Легко это может быть в реальной ситуации у кастомеров :D
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

vg писал(а):2Marmot,
http://jakarta.apache.org/commons/httpc ... ation.html
Ну, а что впечатляет. Уже хочу изучать Java. :D А leonidy тоже придётся ставить на W2k Apache HttpClient у кастомеров? :D
200К файл, и никакой регистрации ;-)
vg писал(а): А энтот клиент со всеми проксями дружит? Уверенность есть? :D

ПС. Как быть с аутинтификацией на прокси, если там требуется NTLM. Легко это может быть в реальной ситуации у кастомеров :D
ага, поддерживает, см. : http://jakarta.apache.org/commons/httpc ... ation.html

BTW, это хороший пример как приятно рабоатать с Java:
Берём бесплатный компонент, пишем маленькую программку, используем везде, где есть JVM (на сегодняшний день быстрее перечислить где этого нету :-) )
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

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);
...
то есть без strcpy, strlen строковые константы в _send() ну никак передать нельзя .. ты прям как лепсик зажигаешь
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

vg писал(а):Короче, пишите на сокетах. Прозрачно. Эффективно. Быстро пишется. Не требует ни могутных библиотек, ни .... Прости, Marmot :( :( :(
Чегой-то я не понял, а как этот код будет проходить через NTLM?
А вдруг у меня логи сверхсекретные и мне захочется их по SSL передать?
В Java (да и в WinInet) достаточно написать https и ... вобщем-то всё :-)
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

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

(да и еще - ты в курсе, что микрософт только полгода назад пофикил свой сертификат 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
Контактная информация:

Сообщение Marmot »

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

(да и еще - ты в курсе, что микрософт только полгода назад пофикил свой сертификат 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 типа ?
Ага, я хотел сказать SSL для encryption, а не для authentication, для encryption-а любой подходящий cert сгодится :-).
По краней мере в Java, в этом случае никакой sslsocketfactory не надо.


ЗЫ А вообще, спор перерастает в идеологический: писать всё с нуля или использовать существующие компоненты...
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Marmot писал(а): ЗЫ А вообще, спор перерастает в идеологический: писать всё с нуля или использовать существующие компоненты...
это не спор. это флейм :)
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Marmot писал(а): Ага, я хотел сказать SSL для encryption, а не для authentication, для encryption-а любой подходящий cert сгодится :-).

По краней мере в Java, в этом случае никакой sslsocketfactory не надо.
во-первых в ssl есть anonymous mode, который java будет поддерживать видимо через пару лет if ever. во-вторых ssl без authentication serves no purpose, и в третьих factory таки нужна (по-крайней мере в апплетах) иначе ssl handshake обламывается с каким-то exception (деталей не знаю, я чисто рядом стоял :))
Ответить