LINUX.ORG.RU

Нужен regex для парсинга http запроса.


0

1
GET /wiki/страница HTTP/1.1
Host: ru.wikipedia.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5
Accept: text/html
Connection: close
(пустая строка)
content

Как с этого достать то что перед ':' и после ':'. Чтобы потом записать в массив типа name = value (Host = ru.wikipedia.org).

В питоне это из коробки есть. А вообще как-то так:

^[[:space:]]*([^[:space:]]*)[[:space:]]*:[[:space:]]*([^[:space:]]*)[[:space:]]*$

gentoo_root ★★★★★ ()
echo "User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3.0b5" | sed -E 's/([^:]+):(.*)/\1 - \2/'

например так

anTaRes ★★★★ ()

Язык-то какой?

// И да, тут регэксп - оверхэд, можно же просто делить по первому ':'

anonymous ()

grep : | cut -d : -f 1

anonymous ()

Легко же. Это для GRegEx

[code]^(?:http://)?(?<proxy>[[:graph:]]+):(?<port>[[:digit:]]+)$[/code]

anonymous ()

http://anonscm.debian.org/loggerhead/apt/debian-sid/annotate/head:/methods/ht...

bool ServerState::HeaderLine(string Line)
{
   if (Line.empty() == true)
      return true;

   // The http server might be trying to do something evil.
   if (Line.length() >= MAXLEN)
      return _error->Error(_("Got a single header line over %u chars"),MAXLEN);

   string::size_type Pos = Line.find(' ');
   if (Pos == string::npos || Pos+1 > Line.length())
   {
      // Blah, some servers use "connection:closes", evil.
      Pos = Line.find(':');
      if (Pos == string::npos || Pos + 2 > Line.length())
	 return _error->Error(_("Bad header line"));
      Pos++;
   }

   // Parse off any trailing spaces between the : and the next word.
   string::size_type Pos2 = Pos;
   while (Pos2 < Line.length() && isspace(Line[Pos2]) != 0)
      Pos2++;
      
   string Tag = string(Line,0,Pos);
   string Val = string(Line,Pos2);
   
   if (stringcasecmp(Tag.c_str(),Tag.c_str()+4,"HTTP") == 0)
   {
      // Evil servers return no version
      if (Line[4] == '/')
      {
	 int const elements = sscanf(Line.c_str(),"HTTP/%u.%u %u%[^\n]",&Major,&Minor,&Result,Code);
	 if (elements == 3)
	 {
	    Code[0] = '\0';
	    if (Debug == true)
	       clog << "HTTP server doesn't give Reason-Phrase for " << Result << std::endl;
	 }
	 else if (elements != 4)
	    return _error->Error(_("The HTTP server sent an invalid reply header"));
      }
      else
      {
	 Major = 0;
	 Minor = 9;
	 if (sscanf(Line.c_str(),"HTTP %u%[^\n]",&Result,Code) != 2)
	    return _error->Error(_("The HTTP server sent an invalid reply header"));
      }
...
r2d2 ()
Ответ на: комментарий от Dima-Meln

Желательно c++ или java.

А зачем в этих языках парсить заголовки как строку: не проще ли подключить библиотеку, отдающую нормальную структуру (например, ассоциативный массив), может libcurl подойдет, вроде ничто не мешать парсить с помощью нее и просто строку.

anonymous ()
Ответ на: комментарий от Dima-Meln

да вот так, например (ахтунг, код не дял продакшена):

#include <stdio.h>
#include <string.h>
#include <curl/curl.h>

static size_t hf(void *p, size_t s, size_t n, void *z)
{
  void *i = memchr(p, ':', s * n);
  if (i) {
    int l = i - p;
    printf("\x1b[31m");
    fwrite(p, s, l, stdout);
    printf("\x1b[0m");
    fwrite(i, s, n - l, stdout);
  }
  else fwrite(p, s, n, stdout);
  return s * n;
}

static size_t df(void *p, size_t s, size_t n, void *z) { return s * n; }

int main(void)
{
  curl_global_init(CURL_GLOBAL_ALL);
  CURL *h = curl_easy_init();

  curl_easy_setopt(h, CURLOPT_URL, "http://ru.wikipedia.org");
  curl_easy_setopt(h, CURLOPT_NOPROGRESS, 1L);
  curl_easy_setopt(h, CURLOPT_HEADERFUNCTION, hf);
  curl_easy_setopt(h, CURLOPT_WRITEFUNCTION, df);

  curl_easy_perform(h);
  curl_easy_cleanup(h);

  return 0;
}

anonymous ()

вначале слюной брызжут во всех тредах, что perl мастдай. потом задают такие вопросы, и пишут такие ответы...

ovax ★★ ()

Вот она, рыба моей мечты!

#!/usr/bin/perl;

$text = "http_request";

while($text =~ m|^(.*)\s*:\s*(.*)$|mg) 
	{$hash{$1} = $2;}

while (($key, $value) = each(%hash))
	{print "$key:$value\n";}
doomgl ()
Ответ на: комментарий от doomgl

я обозлился ? скорее развеселился. если кому-то нравится ковырять стену зубочисткой, не обращая внимания на лежащий рядом перфоратор... потому, что Вася сказал, что перфоратор - это не гламурно...

ovax ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.