2010-11-25 5 views
2

Ich versuche, einfache RESTful API mit FastCGI (und Restcgi) zu entwickeln. Als ich versuchte, die POST-Methode zu implementieren, bemerkte ich, dass der Eingabestream (der den Anfragetext darstellt) falsch ist. Ich habe einen kleinen Test gemacht und sieht aus, als wenn ich versuche, den Stream zu lesen, nur jedes zweite Zeichen wird empfangen.Fehlende Zeichen aus dem Eingabestream von fastcgi Anfrage

Körper gesendet: name=john&surname=smith empfangen: aejh&unm=mt

ich mehr Kunden versucht haben, nur um sicher zu machen, es ist nicht der Client mit den Daten durcheinander. Mein Code ist:

int main(int argc, char* argv[]) { 
    // FastCGI initialization. 
    FCGX_Init(); 
    FCGX_Request request; 
    FCGX_InitRequest(&request, 0, 0); 

    while (FCGX_Accept_r(&request) >= 0) { 
    // FastCGI request setup. 
    fcgi_streambuf fisbuf(request.in); 
    std::istream is(&fisbuf); 
    fcgi_streambuf fosbuf(request.out); 
    std::ostream os(&fosbuf); 

    std::string str; 
    is >> str; 
    std::cerr << str; // this way I can see it in apache error log 

    // restcgi code here 
    } 

    return 0; 
} 

Ich verwende fast_cgi Modul mit Apache (nicht sicher, ob das einen Unterschied macht).

Irgendeine Idee was mache ich falsch?

+0

scheint ein Codierungsproblem zu sein, jedes zweite Zeichen wird übersprungen (16/8 Bit) – stacker

+0

aber wie? Wenn es 2B als ein Zeichen interpretieren würde, wäre das Zeichen etwas anderes, aber in meinem Fall ist es korrekt ... – Tom

Antwort

0

Nachdem ich nirgends eine Antwort gefunden hatte (nicht einmal die FastCGI-Mailingliste) habe ich die ursprünglichen fastcgi-Bibliotheken gelöscht und stattdessen fastcgi ++ - Bibliotheken verwendet. Das Problem ist verschwunden. Es gibt auch andere Vorteile - C++, mehr Funktionen, einfacher zu bedienen.

1

Verwenden is.read() nicht is >> ...

Probe aus restcgi Dokumentation:

clen = strtol(clenstr, &clenstr, 10); 
if (*clenstr) 
{ 
    cerr << "can't parse \"CONTENT_LENGTH=" 
      << FCGX_GetParam("CONTENT_LENGTH", request->envp) 
      << "\"\n"; 
    clen = STDIN_MAX; 
} 

// *always* put a cap on the amount of data that will be read 
if (clen > STDIN_MAX) clen = STDIN_MAX; 

*content = new char[clen]; 

is.read(*content, clen); 
clen = is.gcount(); 
1

ich auch auf dieses Problem gestoßen, auf einem unmodifizierten Debian installieren.

fand ich, dass das Problem ging weg, wenn ich einen Puffer an den fcgi_streambuf Konstruktor geliefert:

const size_t LEN = ... // whatever, it doesn't have to be big. 
vector<char> v (LEN); 
fcgi_streambuf buf (request.in, &v[0], v.size()); 
iostream in (&buf); 
string s; 
getline(in, s); // s now holds the correct data. 
2

Das Problem in fcgio.cpp ist

Die fcgi_steambuf Klasse definiert ist char_type verwenden, aber die int underflow() Methode reduziert seinen Rückgabewert auf (unsigned char), sollte es in (char_type) umgewandelt werden.

+0

Dies scheint das Problem tatsächlich zu beheben, aber ich verstehe nicht ganz, warum ich es auf "unsigned char" umwandeln soll vor der Rückkehr verursacht jedes andere Zeichen verschwinden – RPGillespie