aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2009-04-16 23:04:35 +0000
committerMike Buland <eichlan@xagasoft.com>2009-04-16 23:04:35 +0000
commit44057a75ef001bfd1919e2169ec3f7f355d14c20 (patch)
tree61cc7fe3ea5d54a24197a33bd7ec87edc5d8233b /src
parent900bf84c403caf83e18928b066544f402aae1122 (diff)
downloadlibbu++-44057a75ef001bfd1919e2169ec3f7f355d14c20.tar.gz
libbu++-44057a75ef001bfd1919e2169ec3f7f355d14c20.tar.bz2
libbu++-44057a75ef001bfd1919e2169ec3f7f355d14c20.tar.xz
libbu++-44057a75ef001bfd1919e2169ec3f7f355d14c20.zip
Hey, the list code is better, also, I fixed some stuff in socket (the
isBlocking function was backward), and fastcgi is actually working now! Also added comparison functions to FString.
Diffstat (limited to '')
-rw-r--r--src/fastcgi.cpp123
-rw-r--r--src/fastcgi.h4
-rw-r--r--src/fbasicstring.h32
-rw-r--r--src/list.h90
-rw-r--r--src/socket.cpp4
5 files changed, 206 insertions, 47 deletions
diff --git a/src/fastcgi.cpp b/src/fastcgi.cpp
index aba3b71..9a602de 100644
--- a/src/fastcgi.cpp
+++ b/src/fastcgi.cpp
@@ -50,13 +50,17 @@ bool Bu::FastCgi::isEmbedded()
50 50
51void Bu::FastCgi::read( Bu::Socket &s, Bu::FastCgi::Record &r ) 51void Bu::FastCgi::read( Bu::Socket &s, Bu::FastCgi::Record &r )
52{ 52{
53 s.read( &r, sizeof(Record) ); 53 int iRead = s.read( &r, sizeof(Record) );
54 if( iRead != sizeof(Record) )
55 throw Bu::SocketException("Hey, the size %d is wrong for Record. (%s)",
56 iRead, strerror( errno ) );
54 r.uRequestId = ntohs( r.uRequestId ); 57 r.uRequestId = ntohs( r.uRequestId );
55 r.uContentLength = ntohs( r.uContentLength ); 58 r.uContentLength = ntohs( r.uContentLength );
56} 59}
57 60
58void Bu::FastCgi::write( Bu::Socket &s, Bu::FastCgi::Record r ) 61void Bu::FastCgi::write( Bu::Socket &s, Bu::FastCgi::Record r )
59{ 62{
63 sio << "Out -> " << r << sio.nl;
60 r.uRequestId = htons( r.uRequestId ); 64 r.uRequestId = htons( r.uRequestId );
61 r.uContentLength = htons( r.uContentLength ); 65 r.uContentLength = htons( r.uContentLength );
62 s.write( &r, sizeof(Record) ); 66 s.write( &r, sizeof(Record) );
@@ -111,8 +115,30 @@ void Bu::FastCgi::readPair( Bu::Socket &s, StrHash &hParams, uint16_t &uRead )
111 } 115 }
112} 116}
113 117
118bool Bu::FastCgi::hasChannel( int iChan )
119{
120 if( aChannel.getSize() < iChan )
121 return false;
122 if( aChannel[iChan-1] == NULL )
123 return false;
124 return true;
125}
126
127Bu::Formatter &Bu::operator<<( Bu::Formatter &f, const Bu::FastCgi::Record &r )
128{
129 f << "[Ver=" << (uint32_t)r.uVersion <<
130 ", Type=" << (uint32_t)r.uType <<
131 ", Req=" << (uint32_t)r.uRequestId <<
132 ", clen=" << (uint32_t)r.uContentLength <<
133 ", plen=" << (uint32_t)r.uPaddingLength <<
134 ", resv=" << (uint32_t)r.uReserved <<
135 "]";
136 return f;
137}
138
114void Bu::FastCgi::run() 139void Bu::FastCgi::run()
115{ 140{
141 sio << "sizeof(Bu::FastCgi::Record) = " << sizeof(Record) << sio.nl;
116 bRunning = true; 142 bRunning = true;
117 while( bRunning ) 143 while( bRunning )
118 { 144 {
@@ -122,21 +148,49 @@ void Bu::FastCgi::run()
122 148
123 Bu::Socket s( iSock ); 149 Bu::Socket s( iSock );
124 s.setBlocking( true ); 150 s.setBlocking( true );
151 sio << "Got connection, blocking? " << s.isBlocking() << sio.nl;
125 try 152 try
126 { 153 {
127 for(;;) 154 for(;;)
128 { 155 {
129 Record r; 156 Record r;
130 read( s, r ); 157 memset( &r, 0, sizeof(r) );
131 while( aChannel.getSize() < r.uRequestId ) 158// try
132 aChannel.append( NULL ); 159// {
160 read( s, r );
161// }
162// catch( Bu::ExceptionBase &e )
163// {
164// sio << "Error: " << e.what() << ", " << s.isOpen() <<
165// sio.nl;
166// continue;
167// }
133 Channel *pChan = NULL; 168 Channel *pChan = NULL;
134 if( r.uRequestId > 0 ) 169 if( r.uRequestId > 0 )
135 pChan = aChannel[r.uRequestId-1]; 170 {
171 if( !hasChannel( r.uRequestId ) &&
172 r.uType != typeBeginRequest )
173 {
174 sio << "Error, stream data without stream." << sio.nl;
175 sio << r << sio.nl;
176 if( r.uContentLength > 0 )
177 {
178 char *buf = new char[r.uContentLength];
179 sio << " (read " << s.read( buf, r.uContentLength )
180 << "/" << r.uContentLength << "):" << sio.nl;
181 sio.write( buf, r.uContentLength );
182 sio << sio.nl << sio.nl;
183 }
184 }
185 while( aChannel.getSize() < r.uRequestId )
186 aChannel.append( NULL );
187 if( r.uRequestId > 0 )
188 pChan = aChannel[r.uRequestId-1];
189 }
136 190
137 sio << "Record (id=" << r.uRequestId << ", len=" << 191 sio << "Record (id=" << r.uRequestId << ", len=" <<
138 r.uContentLength << ", pad=" << 192 r.uContentLength << ", pad=" <<
139 (int)r.uPaddingLength << "): "; 193 (unsigned int)r.uPaddingLength << "): ";
140 fflush( stdout ); 194 fflush( stdout );
141 195
142 switch( (RequestType)r.uType ) 196 switch( (RequestType)r.uType )
@@ -180,9 +234,16 @@ void Bu::FastCgi::run()
180 else 234 else
181 { 235 {
182 char *buf = new char[r.uContentLength]; 236 char *buf = new char[r.uContentLength];
183 sio << " (read " << s.read( buf, r.uContentLength ) 237 int iTotal = 0;
184 << ")"; 238 do
185 pChan->sStdIn.append( buf, r.uContentLength ); 239 {
240 size_t iRead = s.read(
241 buf, r.uContentLength-iTotal );
242 iTotal += iRead;
243 sio << " (read " << iRead << " " << iTotal
244 << "/" << r.uContentLength << ")";
245 pChan->sStdIn.append( buf, iRead );
246 } while( iTotal < r.uContentLength );
186 delete[] buf; 247 delete[] buf;
187 } 248 }
188 break; 249 break;
@@ -219,6 +280,7 @@ void Bu::FastCgi::run()
219 { 280 {
220 if( pChan->uFlags == chflgAllDone ) 281 if( pChan->uFlags == chflgAllDone )
221 { 282 {
283 sio << "All done, generating output." << sio.nl;
222 Bu::MemBuf mStdOut, mStdErr; 284 Bu::MemBuf mStdOut, mStdErr;
223 int iRet = request( 285 int iRet = request(
224 pChan->hParams, pChan->sStdIn, 286 pChan->hParams, pChan->sStdIn,
@@ -229,27 +291,47 @@ void Bu::FastCgi::run()
229 Bu::FString &sStdErr = mStdErr.getString(); 291 Bu::FString &sStdErr = mStdErr.getString();
230 292
231 Record rOut; 293 Record rOut;
294 memset( &rOut, 0, sizeof(rOut) );
232 rOut.uVersion = 1; 295 rOut.uVersion = 1;
233 rOut.uRequestId = r.uRequestId; 296 rOut.uRequestId = r.uRequestId;
234 rOut.uPaddingLength = 0; 297 rOut.uPaddingLength = 0;
298 rOut.uType = typeStdOut;
235 if( sStdOut.getSize() > 0 ) 299 if( sStdOut.getSize() > 0 )
236 { 300 {
237 rOut.uType = typeStdOut; 301 for( int iPos = 0; iPos < sStdOut.getSize();
238 rOut.uContentLength = sStdOut.getSize(); 302 iPos += 65528 )
239 write( s, rOut ); 303 {
240 s.write( sStdOut ); 304 int iSize = sStdOut.getSize()-iPos;
305 if( iSize > 65528 )
306 iSize = 65528;
307 rOut.uContentLength = iSize;
308 write( s, rOut );
309 int iAmnt = s.write(
310 sStdOut.getStr()+iPos, iSize );
311 sio << "Wrote " << iAmnt <<
312 " of " << iSize << sio.nl;
313 }
241 } 314 }
242 rOut.uType = typeStdOut;
243 rOut.uContentLength = 0; 315 rOut.uContentLength = 0;
244 write( s, rOut ); 316 write( s, rOut );
317
318 rOut.uType = typeStdErr;
245 if( sStdErr.getSize() > 0 ) 319 if( sStdErr.getSize() > 0 )
246 { 320 {
247 rOut.uType = typeStdErr; 321 for( int iPos = 0; iPos < sStdErr.getSize();
248 rOut.uContentLength = sStdErr.getSize(); 322 iPos += 65528 )
249 write( s, rOut ); 323 {
250 s.write( sStdOut ); 324 int iSize = sStdErr.getSize()-iPos;
325 if( iSize > 65528 )
326 iSize = 65528;
327 rOut.uContentLength = iSize;
328 write( s, rOut );
329 int iAmnt = s.write(
330 sStdErr.getStr()+iPos, iSize );
331 sio << "Wrote " << iAmnt <<
332 " of " << iSize << sio.nl;
333 }
251 } 334 }
252 rOut.uType = typeStdErr;
253 rOut.uContentLength = 0; 335 rOut.uContentLength = 0;
254 write( s, rOut ); 336 write( s, rOut );
255 337
@@ -270,7 +352,8 @@ void Bu::FastCgi::run()
270 } 352 }
271 catch( Bu::SocketException &e ) 353 catch( Bu::SocketException &e )
272 { 354 {
273 //sio << "Bu::SocketException: " << e.what() << sio.nl; 355 sio << "Bu::SocketException: " << e.what() << sio.nl <<
356 "\tSocket open: " << s.isOpen() << sio.nl;
274 } 357 }
275 } 358 }
276} 359}
diff --git a/src/fastcgi.h b/src/fastcgi.h
index 83e9b83..67ec82f 100644
--- a/src/fastcgi.h
+++ b/src/fastcgi.h
@@ -110,11 +110,15 @@ namespace Bu
110 void write( Bu::Socket &s, Record r ); 110 void write( Bu::Socket &s, Record r );
111 void write( Bu::Socket &s, EndRequestBody b ); 111 void write( Bu::Socket &s, EndRequestBody b );
112 112
113 bool hasChannel( int iChan );
114
113 private: 115 private:
114 Bu::ServerSocket *pSrv; 116 Bu::ServerSocket *pSrv;
115 bool bRunning; 117 bool bRunning;
116 Bu::Array<Channel *> aChannel; 118 Bu::Array<Channel *> aChannel;
117 }; 119 };
120
121 Bu::Formatter &operator<<( Bu::Formatter &f, const Bu::FastCgi::Record &r );
118}; 122};
119 123
120#endif 124#endif
diff --git a/src/fbasicstring.h b/src/fbasicstring.h
index 853625c..57e798e 100644
--- a/src/fbasicstring.h
+++ b/src/fbasicstring.h
@@ -1297,6 +1297,38 @@ namespace Bu
1297 return !(*this == pData); 1297 return !(*this == pData);
1298 } 1298 }
1299 1299
1300 bool operator<(const MyType &pData ) const
1301 {
1302 flatten();
1303 pData.flatten();
1304
1305 const chr *a = pData.pFirst->pData;
1306 chr *b = pFirst->pData;
1307 for( long j = 0; j < nLength; j++, a++, b++ )
1308 {
1309 if( *a != *b )
1310 return *a < *b;
1311 }
1312
1313 return false;
1314 }
1315
1316 bool operator>(const MyType &pData ) const
1317 {
1318 flatten();
1319 pData.flatten();
1320
1321 const chr *a = pData.pFirst->pData;
1322 chr *b = pFirst->pData;
1323 for( long j = 0; j < nLength; j++, a++, b++ )
1324 {
1325 if( *a != *b )
1326 return *a > *b;
1327 }
1328
1329 return false;
1330 }
1331
1300 /** 1332 /**
1301 * Indexing operator 1333 * Indexing operator
1302 *@param nIndex (long) The index of the character you want. 1334 *@param nIndex (long) The index of the character you want.
diff --git a/src/list.h b/src/list.h
index f7a6d2f..93116e7 100644
--- a/src/list.h
+++ b/src/list.h
@@ -45,6 +45,9 @@ namespace Bu
45 typedef class List<value, cmpfunc, valuealloc, linkalloc> MyType; 45 typedef class List<value, cmpfunc, valuealloc, linkalloc> MyType;
46 46
47 public: 47 public:
48 struct const_iterator;
49 struct iterator;
50
48 List() : 51 List() :
49 pFirst( NULL ), 52 pFirst( NULL ),
50 pLast( NULL ), 53 pLast( NULL ),
@@ -201,6 +204,32 @@ namespace Bu
201 } 204 }
202 } 205 }
203 206
207 void insert( MyType::iterator &i, const value &v )
208 {
209 Link *pAfter = i.pLink;
210 if( pAfter == NULL )
211 {
212 append( v );
213 return;
214 }
215 Link *pPrev = pAfter->pPrev;
216 if( pPrev == NULL )
217 {
218 prepend( v );
219 return;
220 }
221
222 Link *pNew = la.allocate( 1 );
223 pNew->pValue = va.allocate( 1 );
224 va.construct( pNew->pValue, v );
225 nSize++;
226
227 pNew->pNext = pAfter;
228 pNew->pPrev = pPrev;
229 pAfter->pPrev = pNew;
230 pPrev->pNext = pNew;
231 }
232
204 /** 233 /**
205 * Insert a new item in sort order by searching for the first item that 234 * Insert a new item in sort order by searching for the first item that
206 * is larger and inserting this before it, or at the end if none are 235 * is larger and inserting this before it, or at the end if none are
@@ -250,7 +279,6 @@ namespace Bu
250 } 279 }
251 } 280 }
252 281
253 struct const_iterator;
254 /** 282 /**
255 * An iterator to iterate through your list. 283 * An iterator to iterate through your list.
256 */ 284 */
@@ -260,24 +288,30 @@ namespace Bu
260 friend class List<value, cmpfunc, valuealloc, linkalloc>; 288 friend class List<value, cmpfunc, valuealloc, linkalloc>;
261 private: 289 private:
262 Link *pLink; 290 Link *pLink;
263 MyType &rList; 291 MyType *pList;
264 bool bOffFront; 292 bool bOffFront;
265 iterator( MyType &rList ) : 293 iterator( MyType *pList ) :
266 pLink( NULL ), 294 pLink( NULL ),
267 rList( rList ) 295 pList( pList )
268 { 296 {
269 } 297 }
270 298
271 iterator( Link *pLink, MyType &rList ) : 299 iterator( Link *pLink, MyType *pList ) :
272 pLink( pLink ), 300 pLink( pLink ),
273 rList( rList ) 301 pList( pList )
274 { 302 {
275 } 303 }
276 304
277 public: 305 public:
306 iterator() :
307 pLink( NULL ),
308 pList( NULL )
309 {
310 }
311
278 iterator( const iterator &i ) : 312 iterator( const iterator &i ) :
279 pLink( i.pLink ), 313 pLink( i.pLink ),
280 rList( i.rList ) 314 pList( i.pList )
281 { 315 {
282 } 316 }
283 317
@@ -342,7 +376,7 @@ namespace Bu
342 iterator &operator++() 376 iterator &operator++()
343 { 377 {
344 if( pLink == NULL ) 378 if( pLink == NULL )
345 pLink = (bOffFront)?(rList.pFirst):(NULL); 379 pLink = (bOffFront)?(pList->pFirst):(NULL);
346 else 380 else
347 pLink = pLink->pNext; 381 pLink = pLink->pNext;
348 bOffFront = false; 382 bOffFront = false;
@@ -352,7 +386,7 @@ namespace Bu
352 iterator &operator--() 386 iterator &operator--()
353 { 387 {
354 if( pLink == NULL ) 388 if( pLink == NULL )
355 pLink = (bOffFront)?(NULL):(rList.pLast); 389 pLink = (bOffFront)?(NULL):(pList->pLast);
356 else 390 else
357 pLink = pLink->pPrev; 391 pLink = pLink->pPrev;
358 bOffFront = true; 392 bOffFront = true;
@@ -362,7 +396,7 @@ namespace Bu
362 iterator &operator++( int ) 396 iterator &operator++( int )
363 { 397 {
364 if( pLink == NULL ) 398 if( pLink == NULL )
365 pLink = (bOffFront)?(rList.pFirst):(NULL); 399 pLink = (bOffFront)?(pList->pFirst):(NULL);
366 else 400 else
367 pLink = pLink->pNext; 401 pLink = pLink->pNext;
368 bOffFront = false; 402 bOffFront = false;
@@ -372,7 +406,7 @@ namespace Bu
372 iterator &operator--( int ) 406 iterator &operator--( int )
373 { 407 {
374 if( pLink == NULL ) 408 if( pLink == NULL )
375 pLink = (bOffFront)?(NULL):(rList.pLast); 409 pLink = (bOffFront)?(NULL):(pList->pLast);
376 else 410 else
377 pLink = pLink->pPrev; 411 pLink = pLink->pPrev;
378 bOffFront = true; 412 bOffFront = true;
@@ -409,24 +443,30 @@ namespace Bu
409 friend class List<value, cmpfunc, valuealloc, linkalloc>; 443 friend class List<value, cmpfunc, valuealloc, linkalloc>;
410 private: 444 private:
411 Link *pLink; 445 Link *pLink;
412 const MyType &rList; 446 const MyType *pList;
413 bool bOffFront; 447 bool bOffFront;
414 const_iterator( const MyType &rList ) : 448 const_iterator( const MyType *pList ) :
415 pLink( NULL ), 449 pLink( NULL ),
416 rList( rList ) 450 pList( pList )
417 { 451 {
418 } 452 }
419 453
420 const_iterator( Link *pLink, const MyType &rList ) : 454 const_iterator( Link *pLink, const MyType *pList ) :
421 pLink( pLink ), 455 pLink( pLink ),
422 rList( rList ) 456 pList( pList )
423 { 457 {
424 } 458 }
425 459
426 public: 460 public:
461 const_iterator() :
462 pLink( NULL ),
463 pList( NULL )
464 {
465 }
466
427 const_iterator( const iterator &i ) : 467 const_iterator( const iterator &i ) :
428 pLink( i.pLink ), 468 pLink( i.pLink ),
429 rList( i.rList ) 469 pList( i.pList )
430 { 470 {
431 } 471 }
432 472
@@ -463,7 +503,7 @@ namespace Bu
463 const_iterator &operator++() 503 const_iterator &operator++()
464 { 504 {
465 if( pLink == NULL ) 505 if( pLink == NULL )
466 pLink = (bOffFront)?(rList.pFirst):(NULL); 506 pLink = (bOffFront)?(pList->pFirst):(NULL);
467 else 507 else
468 pLink = pLink->pNext; 508 pLink = pLink->pNext;
469 bOffFront = false; 509 bOffFront = false;
@@ -473,7 +513,7 @@ namespace Bu
473 const_iterator &operator--() 513 const_iterator &operator--()
474 { 514 {
475 if( pLink == NULL ) 515 if( pLink == NULL )
476 pLink = (bOffFront)?(NULL):(rList.pLast); 516 pLink = (bOffFront)?(NULL):(pList->pLast);
477 else 517 else
478 pLink = pLink->pPrev; 518 pLink = pLink->pPrev;
479 bOffFront = true; 519 bOffFront = true;
@@ -483,7 +523,7 @@ namespace Bu
483 const_iterator &operator++( int ) 523 const_iterator &operator++( int )
484 { 524 {
485 if( pLink == NULL ) 525 if( pLink == NULL )
486 pLink = (bOffFront)?(rList.pFirst):(NULL); 526 pLink = (bOffFront)?(pList->pFirst):(NULL);
487 else 527 else
488 pLink = pLink->pNext; 528 pLink = pLink->pNext;
489 bOffFront = false; 529 bOffFront = false;
@@ -493,7 +533,7 @@ namespace Bu
493 const_iterator &operator--( int ) 533 const_iterator &operator--( int )
494 { 534 {
495 if( pLink == NULL ) 535 if( pLink == NULL )
496 pLink = (bOffFront)?(NULL):(rList.pLast); 536 pLink = (bOffFront)?(NULL):(pList->pLast);
497 else 537 else
498 pLink = pLink->pPrev; 538 pLink = pLink->pPrev;
499 bOffFront = true; 539 bOffFront = true;
@@ -529,7 +569,7 @@ namespace Bu
529 */ 569 */
530 iterator begin() 570 iterator begin()
531 { 571 {
532 return iterator( pFirst, *this ); 572 return iterator( pFirst, this );
533 } 573 }
534 574
535 /** 575 /**
@@ -538,7 +578,7 @@ namespace Bu
538 */ 578 */
539 const_iterator begin() const 579 const_iterator begin() const
540 { 580 {
541 return const_iterator( pFirst, *this ); 581 return const_iterator( pFirst, this );
542 } 582 }
543 583
544 /** 584 /**
@@ -548,7 +588,7 @@ namespace Bu
548 */ 588 */
549 const iterator end() 589 const iterator end()
550 { 590 {
551 return iterator( NULL, *this ); 591 return iterator( NULL, this );
552 } 592 }
553 593
554 /** 594 /**
@@ -558,7 +598,7 @@ namespace Bu
558 */ 598 */
559 const const_iterator end() const 599 const const_iterator end() const
560 { 600 {
561 return const_iterator( NULL, *this ); 601 return const_iterator( NULL, this );
562 } 602 }
563 603
564 /** 604 /**
diff --git a/src/socket.cpp b/src/socket.cpp
index a660b30..c01c63a 100644
--- a/src/socket.cpp
+++ b/src/socket.cpp
@@ -369,7 +369,7 @@ bool Bu::Socket::isSeekable()
369bool Bu::Socket::isBlocking() 369bool Bu::Socket::isBlocking()
370{ 370{
371#ifndef WIN32 371#ifndef WIN32
372 return ((fcntl( nSocket, F_GETFL, 0 ) & O_NONBLOCK) == O_NONBLOCK); 372 return ((fcntl( nSocket, F_GETFL, 0 ) & O_NONBLOCK) != O_NONBLOCK);
373#else 373#else
374 return false; 374 return false;
375#endif 375#endif
@@ -380,7 +380,7 @@ void Bu::Socket::setBlocking( bool bBlocking )
380#ifndef WIN32 380#ifndef WIN32
381 if( bBlocking ) 381 if( bBlocking )
382 { 382 {
383 fcntl( nSocket, F_SETFL, fcntl( nSocket, F_GETFL, 0 ) & ~O_NONBLOCK ); 383 fcntl( nSocket, F_SETFL, fcntl( nSocket, F_GETFL, 0 ) & (~O_NONBLOCK) );
384 } 384 }
385 else 385 else
386 { 386 {