Удалить часть строки в C (регулярное выражение?) - PullRequest
1 голос
/ 09 февраля 2012

У меня есть длинная строка с такой информацией:

"GET http://www.google.se/ HTTP/1.1\r\n
Host: www.google.se\r\n
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:2.0) Gecko/20100101 Firefox/4.0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Accept-Language: en-us,en;q=0.5\r\n
Accept-Encoding: gzip, deflate\r\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n
Keep-Alive: 115\r\n
Proxy-Connection: keep-alive\r\n
Cookie: PREF=ID=7d6a62c557413bc8:FF=0:TM=1327968040:LM=1327968040:S=U1A51rCRDDMTF295\r\n
Cache-Control: max-age=0\r\n\r\n"

И я хочу избавиться от части keep-alive под прокси-соединением .. Это то, что я делаю до сих пор:

  1. получение строки (заголовка) для функции.
  2. Создание структуры с двумя строками (заголовок и хост)
  3. размещение имени хоста из заголовка в части хоста (очевидно)
  4. и помещение заголовка в часть заголовка.

А теперь я хочу избавиться от части keep-alive, прежде чем помещать заголовок в заголовочную часть структуры.

Есть идеи?

А вот код того, что я сделал до сих пор. Я новичок в C, поэтому, возможно, не самый красивый код, который вы видели ..

struct ParsedHeader header_parser(char * input) {
  struct ParsedHeader h;
  int status;
  regex_t regex;
  char * result_begin = NULL;

  regcomp(&regex, "host:", REG_EXTENDED|REG_ICASE|REG_NOSUB);
  if((status = regexec(&regex, input, (size_t) 0, NULL, 0)) == 0) {
    char end = '\r';
    char * header = malloc(strlen(input));

    char * begin = "host:";

    size_t result_size = 0;
    memcpy(header, input, strlen(input));
    to_lower(input, header, strlen(input));
    result_begin = (strstr(header, begin) + 6);

    char * result_end = strchr(result_begin, end);
    result_end[0] = '\0';
    //char result[strlen(result_begin)] = result_begin;
    free(header);
  }
  regfree(&regex);

  h.header = input;
  h.host = result_begin;

  return h;
}

1 Ответ

3 голосов
/ 09 февраля 2012

Если я правильно понимаю ваш вопрос, вы хотите удалить только строку «Keep-Alive». Сделайте это так:

// assume buffer contains the long input string
char *pBegin; 
char *pEnd;
pBegin = strstr(buffer, "Keep-Alive:");
if (pBegin)
{
    pEnd = strstr(pBegin, "\r\n");
    if (pEnd)
        strcpy(pBegin, pEnd+2);
}

Однако, если вы хотите удалить строку keep-alive из заголовка Proxy-Connection, работает аналогичное решение:

char *pBegin; 
char *pEnd;
pBegin = strstr(buffer, "Proxy-Connection:");
if (pBegin)
{
    pBegin = strstr(pBegin, "keep-alive");
    if (pBegin)
        strcpy(pBegin, pBegin+strlen("keep-alive"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...