101 aClient->SetTimeout( 5 );
102 aClient->SetFlags( wxSOCKET_NONE );
105 request.reserve( 512 );
109 while( aClient->IsConnected() )
111 if( !aClient->WaitForRead( 1, 0 ) )
114 aClient->Read( buffer,
sizeof( buffer ) );
115 size_t count = aClient->LastCount();
120 request.append( buffer, count );
122 if( request.find(
"\r\n\r\n" ) != std::string::npos || request.size() > 4096 )
128 wxString requestWx = wxString::FromUTF8( request.data(), request.size() );
129 int endOfLine = requestWx.Find( wxS(
"\r\n" ) );
130 wxString requestLine = endOfLine == wxNOT_FOUND ? requestWx : requestWx.Mid( 0, endOfLine );
133 Finish( !userId.IsEmpty(), userId );
138 wxStringTokenizer tokenizer( aRequestLine, wxS(
" " ) );
140 if( !tokenizer.HasMoreTokens() )
143 tokenizer.GetNextToken();
145 if( !tokenizer.HasMoreTokens() )
148 wxString
path = tokenizer.GetNextToken();
149 int queryPos =
path.Find(
'?' );
151 if( queryPos == wxNOT_FOUND )
154 wxString query =
path.Mid( queryPos + 1 );
155 wxStringTokenizer queryTokenizer( query, wxS(
"&" ) );
157 while( queryTokenizer.HasMoreTokens() )
159 wxString pair = queryTokenizer.GetNextToken();
160 int eqPos = pair.Find(
'=' );
162 if( eqPos == wxNOT_FOUND )
165 wxString
name = pair.Left( eqPos );
166 wxString value = pair.Mid( eqPos + 1 );
168 if(
name == wxS(
"user_id" ) )
169 return wxURI::Unescape( value );
182 if( redirect.IsEmpty() )
183 redirect = wxS(
"about:blank" );
186 html << wxS(
"<!DOCTYPE html><html><head>" )
187 << wxS(
"<meta http-equiv=\"refresh\" content=\"0;url=" ) << redirect << wxS(
"\">" )
188 << wxS(
"</head><body>" )
189 << wxS(
"<script>window.location.href = '" ) << redirect << wxS(
"';</script>" )
190 << wxS(
"<p>Login successful. Redirecting...</p>" )
191 << wxS(
"</body></html>" );
193 wxScopedCharBuffer body = html.ToUTF8();
196 response << wxS(
"HTTP/1.1 200 OK\r\n" )
197 << wxS(
"Content-Type: text/html; charset=utf-8\r\n" )
198 << wxS(
"Access-Control-Allow-Origin: *\r\n" )
199 << wxS(
"Cache-Control: no-store\r\n" )
200 << wxS(
"Connection: close\r\n" )
201 << wxS(
"Content-Length: " ) << body.length() << wxS(
"\r\n\r\n" );
203 wxScopedCharBuffer header = response.ToUTF8();
205 aClient->Write( header.data(), header.length() );
206 aClient->Write( body.data(), body.length() );