#include "HttpRequest.h" #include "Klient.h" #include #include using namespace Framework; using namespace Network; using namespace HTTP; PostRequest::PostRequest( const char *path, const char *host, const char *data, const char *contentType, unsigned short port, bool useSSL ) : ReferenceCounter() { this->path = path; this->host = host; this->data = data; this->contentType = contentType; this->port = port; this->useSSL = useSSL; } Answer *PostRequest::execute() const { Text message = "POST "; message += path; message += " HTTP/1.1\r\n"; message += "Host: "; message += host; message += "\r\nContent-Type: "; message += contentType; message += "; charset=latin-1\r\nContent-Length: "; message += data.getLength(); message += "\r\n\r\n"; message += data; SSLKlient httpsK; Klient httpK; if( useSSL ) { if( !httpsK.verbinde( port, host ) ) return 0; httpsK.sende( message, message.getLength() ); } else { if( !httpK.verbinde( port, host ) ) return 0; httpK.sende( message, message.getLength() ); } int length = -1; bool lastn = 0; Text answer; do { char buff[ 2 ]; buff[ 1 ] = 0; if( ( useSSL && httpsK.getNachricht( buff, 1 ) ) || ( !useSSL && httpK.getNachricht( buff, 1 ) ) ) { answer += buff; if( buff[ 0 ] == '\n' ) { if( length <= 0 ) { int p = answer.positionVon( "Content-Length: " ); if( p >= 0 ) { p += 16; Text *len = answer.getTeilText( p ); len->remove( len->positionVon( "\n" ), len->getLength() ); len->remove( "\r" ); length = *len; len->release(); } } else if( lastn ) { // header der antwort ist vorbei char *buff = new char[ length + 1 ]; buff[ length ] = 0; if( length > 0 ) { if( useSSL ) httpsK.getNachricht( buff, length ); else httpK.getNachricht( buff, length ); } answer += buff; delete[] buff; break; } lastn = 1; } else if( buff[ 0 ] != '\r' ) lastn = 0; } else break; } while( ( useSSL && httpsK.hatNachricht( 1000 ) ) || ( !useSSL && httpK.hatNachricht( 1000 ) ) ); if( answer.getLength() ) return new Answer( answer ); return 0; } Answer::Answer( const char *answer ) : ReferenceCounter() { all = answer; TextReader reader( new Text( answer ) ); // parse header Text *line = reader.leseZeile(); line->remove( "\r\n" ); line->remove( "\n" ); header += *line; header += "\n"; int trenn = line->positionVon( " " ); Text *tmp = line->getTeilText( 0, trenn ); this->protocol = *tmp; tmp->release(); line->remove( 0, trenn + 1 ); trenn = line->positionVon( " " ); tmp = line->getTeilText( 0, trenn ); this->statusNumber = *tmp; tmp->release(); line->remove( 0, trenn + 1 ); this->statusText = *line; line->release(); while( !reader.istEnde() ) { Text *line = reader.leseZeile(); line->remove( "\r\n" ); line->remove( "\n" ); if( line->getLength() > 0 ) { header += *line; header += "\n"; } if( line->positionVon( "Date:" ) == 0 ) this->date = line->getText() + 6; if( line->positionVon( "Content-Type:" ) == 0 ) this->contentType = line->getText() + 14; int len = line->getLength(); line->release(); if( len == 0 ) break; } // parse body if( !reader.istEnde() ) this->data = answer + reader.getLPosition(); } const char *Answer::getContentType() const { return contentType; } const char *Answer::getData() const { return data; } int Answer::getStatusCode() const { return statusNumber; } const char *Answer::getStatusText() const { return statusText; } const char *Answer::getDate() const { return date; } const char *Answer::getAll() const { return all; }