29 #define DISABLE_DEBUGLOG
33 #include "syncio_http_p.h"
36 #include <gwenhywfar/misc.h>
37 #include <gwenhywfar/debug.h>
38 #include <gwenhywfar/gui.h>
39 #include <gwenhywfar/text.h>
54 GWEN_SYNCIO_HTTP *xio;
80 GWEN_SYNCIO_HTTP *xio;
82 xio=(GWEN_SYNCIO_HTTP*) p;
98 GWEN_SYNCIO_HTTP *xio;
129 GWEN_SYNCIO_HTTP *xio;
158 GWEN_SYNCIO_HTTP *xio;
164 xio->readMode=GWEN_SyncIo_Http_Mode_Idle;
172 GWEN_SYNCIO_HTTP *xio;
184 if (xio->readMode==GWEN_SyncIo_Http_Mode_Idle) {
197 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
203 if (!(s && strcasecmp(s,
"HTTP/0.9")==0)) {
207 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
217 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
223 if (!(s && strcasecmp(s,
"HTTP/0.9")==0)) {
227 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
235 if (xio->readMode==GWEN_SyncIo_Http_Mode_ChunkSize) {
239 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
242 if (xio->currentReadChunkSize==0) {
262 else if (xio->currentReadChunkSize==-1) {
264 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
269 xio->readMode=GWEN_SyncIo_Http_Mode_Chunk;
272 if (xio->readMode==GWEN_SyncIo_Http_Mode_Chunk) {
276 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
284 if (xio->readMode==GWEN_SyncIo_Http_Mode_Body) {
288 xio->readMode=GWEN_SyncIo_Http_Mode_Error;
296 if (xio->readMode==GWEN_SyncIo_Http_Mode_Error) {
307 const uint8_t *buffer,
309 GWEN_SYNCIO_HTTP *xio;
325 if (xio->writeMode==GWEN_SyncIo_Http_Mode_Idle) {
335 xio->writeMode=GWEN_SyncIo_Http_Mode_Error;
341 if (!(s && strcasecmp(s,
"HTTP/0.9")==0)) {
344 xio->writeMode=GWEN_SyncIo_Http_Mode_Error;
350 if (xio->writeMode==GWEN_SyncIo_Http_Mode_ChunkSize) {
353 xio->writeMode=GWEN_SyncIo_Http_Mode_Error;
363 xio->writeMode=GWEN_SyncIo_Http_Mode_Chunk;
366 if (xio->writeMode==GWEN_SyncIo_Http_Mode_Chunk) {
371 xio->writeMode=GWEN_SyncIo_Http_Mode_Error;
374 xio->writeMode=GWEN_SyncIo_Http_Mode_ChunkSize;
379 if (xio->writeMode==GWEN_SyncIo_Http_Mode_Body) {
380 if ((xio->currentWriteBodySize!=-1) &&
381 (size>xio->currentWriteBodySize)) {
383 xio->writeMode=GWEN_SyncIo_Http_Mode_Error;
391 xio->writeMode=GWEN_SyncIo_Http_Mode_Error;
394 if (xio->currentWriteBodySize!=-1) {
395 xio->currentWriteBodySize-=rv;
396 if (xio->currentWriteBodySize==0)
403 if (xio->writeMode==GWEN_SyncIo_Http_Mode_Error) {
414 GWEN_SYNCIO_HTTP *xio;
464 GWEN_SYNCIO_HTTP *xio;
479 "Bad format of HTTP status (%s)", buffer);
489 while(*p && isdigit((
int)*p))
495 if (1!=sscanf(s,
"%d", &code)) {
511 GWEN_SYNCIO_HTTP *xio;
527 "Bad format of HTTP request (%s)", buffer);
541 "Bad format of HTTP request (%s)", buffer);
568 GWEN_SYNCIO_HTTP *xio;
610 GWEN_SYNCIO_HTTP *xio;
646 GWEN_SYNCIO_HTTP *xio;
663 if (p[1]==32 || p[1]==9)
683 while(*p && (*p==32 || *p==9))
687 while(*p && *p!=
':' && *p>32 && *p<127)
697 while(*p && (*p==32 || *p==9))
707 xio->readMode=GWEN_SyncIo_Http_Mode_Body;
714 xio->currentReadChunkSize=-1;
715 xio->readMode=GWEN_SyncIo_Http_Mode_ChunkSize;
720 if (xio->currentReadBodySize==0) {
724 else if (xio->currentReadBodySize==-1) {
732 if (rcode<0 || rcode>=300) {
744 GWEN_SYNCIO_HTTP *xio;
815 GWEN_SYNCIO_HTTP *xio;
855 xio->currentReadChunkSize=csize;
864 GWEN_SYNCIO_HTTP *xio;
879 if (size>xio->currentReadChunkSize)
880 size=xio->currentReadChunkSize;
888 xio->currentReadChunkSize-=rv;
889 if (xio->currentReadBodySize>0)
890 xio->currentReadBodySize-=rv;
892 if (xio->currentReadChunkSize==0) {
909 xio->readMode=GWEN_SyncIo_Http_Mode_ChunkSize;
918 GWEN_SYNCIO_HTTP *xio;
935 if ((xio->currentReadBodySize>=0) &&
936 (size>xio->currentReadBodySize)) {
938 size, xio->currentReadBodySize);
939 size=xio->currentReadBodySize;
948 if (xio->currentReadBodySize>=0)
949 xio->currentReadBodySize-=rv;
951 if (xio->currentReadBodySize==0)
961 GWEN_SYNCIO_HTTP *xio;
1008 GWEN_SYNCIO_HTTP *xio;
1038 snprintf(numbuf,
sizeof(numbuf),
"%d ", i);
1062 GWEN_SYNCIO_HTTP *xio;
1081 xio->writeMode=GWEN_SyncIo_Http_Mode_Body;
1086 xio->currentWriteBodySize=i;
1111 xio->writeMode=GWEN_SyncIo_Http_Mode_ChunkSize;
1123 snprintf(numbuf,
sizeof(numbuf),
"%d", i);
1151 if (xio->currentWriteBodySize==0)
1160 GWEN_SYNCIO_HTTP *xio;
1175 snprintf(numbuf,
sizeof(numbuf)-1,
"%x\r\n", size);
1176 numbuf[
sizeof(numbuf)-1]=0;
1190 GWEN_SYNCIO_HTTP *xio;
1196 xio->writeMode=GWEN_SyncIo_Http_Mode_Idle;
1204 GWEN_SYNCIO_HTTP *xio;
1210 return xio->dbCommandIn;
1216 GWEN_SYNCIO_HTTP *xio;
1222 return xio->dbStatusIn;
1228 GWEN_SYNCIO_HTTP *xio;
1234 return xio->dbHeaderIn;
1240 GWEN_SYNCIO_HTTP *xio;
1246 return xio->dbCommandOut;
1252 GWEN_SYNCIO_HTTP *xio;
1258 return xio->dbStatusOut;
1264 GWEN_SYNCIO_HTTP *xio;
1270 return xio->dbHeaderOut;
1277 GWEN_SYNCIO_HTTP *xio;
1293 I18N(
"Network Operation"),
1294 I18N(
"Receiving data"),
1321 if (bodySize!=-1 && bytesRead<bodySize) {
1323 "EOF met prematurely (%d < %d)",
1324 bytesRead, bodySize);
1358 if (bodySize!=-1 && bytesRead>=bodySize) {
1371 "We received an error, but we still got data, "
1372 "so we ignore the error here");
1378 I18N(
"No message received"));
1386 I18N(
"No message received"));
1400 code, s?s:
"- no text -");
1402 I18N(
"HTTP-Status: %d (%s)"),
1403 code, s?s:
I18N(
"- no details -"));
1409 I18N(
"No HTTP status code received"));
1420 GWEN_SYNCIO_HTTP *xio;
1436 I18N(
"Network Operation"),
1437 I18N(
"Receiving data"),
1458 if (bodySize!=-1 && bytesRead<bodySize) {
1460 "EOF met prematurely (%d < %d)",
1461 bytesRead, bodySize);
1501 if (bodySize!=-1 && bytesRead>=bodySize) {
1514 "We received an error, but we still got data, "
1515 "so we ignore the error here");
1521 I18N(
"No message received"));
1529 I18N(
"No message received"));
1543 code, s?s:
"- no text -");
1545 I18N(
"HTTP-Status: %d (%s)"),
1546 code, s?s:
I18N(
"- no details -)"));
1552 I18N(
"No HTTP status code received"));