Основной http прокси в c, проблемы - PullRequest
2 голосов
/ 10 февраля 2012

Я создаю http прокси в c.Прокси должен фильтровать некоторые ключевые слова в URL и в HTML-контенте.Первая проблема у меня с функцией send ().Когда я загружаю страницу в первый раз, все в порядке.И если я разрешу странице финскую загрузку, то следующий запрос тоже подойдет.Но если я открываю www.google.com и начинаю печатать, «Instant-Feature» делает новый запрос до того, как последний будет завершен, и я получаю следующую ошибку:

Program received signal SIGPIPE, Broken pipe.
0x00007ffff7b2efc2 in send () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) up
#1  0x0000000000401f1a in main () at net-ninny2.c:232
232      bytes_sent += send(i, buffer+bytes_sent, buffer_size-bytes_sent, 0);

Кодовый блокЭто приводит к ошибке выглядит следующим образом:

while(bytes_sent < buffer_size) {
  bytes_sent += send(i, buffer+bytes_sent, buffer_size-bytes_sent, 0);
  printf("* Bytes sent to Client: %d/%d\n", bytes_sent, buffer_size);
}

Если вы считаете, что это уместно, я буду рад предоставить больше кода.

Моя вторая проблема связана с заголовками Http.Так как я хочу фильтровать ключевые слова в html-контенте, я не хочу, чтобы контент был закодирован.Похоже, Google не согласен с этим, и что бы я ни указывал в заголовке Accept-Encoding, я всегда получаю обратно содержимое, закодированное в gzip.Любые идеи, как избавиться от этого?

EDIT:

Я также пытаюсь использовать fork () для создания дочерних процессов для новых соединений, но это просто выдает неприятную ошибку:

select: Interrupted system call

Я положил его туда, где я создаю новый дескриптор файла из входящего соединения:

if (i == listener) {
          // New connection
          remote_addr_len = sizeof remote_addr;
          newfd = accept(listener, (struct sockaddr *)&remote_addr, &remote_addr_len);

          if (newfd == -1) {
            perror("accept");
          }
          else {
            FD_SET(newfd, &master); // Add new connection to master set
            if (newfd > fdmax) {
              fdmax = newfd;
            }
            printf("* New connection from %s on "
                   "socket %d\n",
                   inet_ntop(remote_addr.ss_family, 
                             get_in_addr((struct sockaddr*)&remote_addr),
                             remoteIP, INET6_ADDRSTRLEN), newfd);
            if(!fork()) {
              fprintf(stderr, "!fork()\n");
              close(newfd);
              exit(5);
            }
          }
        }

Но я предполагаю, что все делаю неправильно.

Ура!

1 Ответ

1 голос
/ 10 февраля 2012

Для вашего первого вопроса вам нужно игнорировать сигнал SIGPIPE:

signal(SIGPIPE, SIG_IGN);

См. Как предотвратить SIGPIPE (или обрабатывать их правильно) для получения более подробной информации.Если вы проигнорируете сигнал и соединение сокета будет сброшено, вы также захотите соответственно обработать возвращаемое значение ошибки -1 из send().

По второму вопросу вы, возможно, не сможете заставить Googleотправлять данные без сжатия, поскольку Google может предполагать, что все браузеры могут обрабатывать сжатые данные.Возможно, вам понадобится встроить декомпрессор gzip в ваш прокси.Конечно, нечестно увеличивать требования к пропускной способности обоих заканчивается только потому, что вы хотите отфильтровать некоторые ключевые слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...