📄 gethttp.c
字号:
strcpy(Request, Verb); //request strcat(Request, " "); //url strcat(Request, URL); strcat(Request, " "); strcat(Request, Headers1); memset ( tailBuffer, (char)0, 3*1024);#ifdef UNIX snprintf( tailBuffer, 3* 1024,"Host: %s%s",Server, portBuffer);#else _snprintf( tailBuffer, 3* 1024,"Host: %s%s",Server, portBuffer);#endif strcat(Request, tailBuffer); if (ClientDataSize) { sprintf(ClientData, "Content-Length: %d\r\n", ClientDataSize); strcat(Request, ClientData); } if ( fKeepAlive ) { strcat(Request, "Connection: Keep-Alive\r\n" ); } strcat(Request, Headers2); strcat(Request, CrLf); RequestSize = strlen(Request); printf(" request\n<%s>\n",Request); //send request data Error = send( Socket, Request, RequestSize, 0); if (Error != RequestSize) { printf("Error in client send = %d, %s\n", Error, strerror(errno)); fSt = FALSE; goto ex; } if (ClientDataSize) { memset( ClientData, ' ', ClientDataSize ); // // Send the client data // Error = send( Socket, ClientData, ClientDataSize, 0); if ( Error != ClientDataSize) { printf("Error in client send = %d, %s\n", Error, strerror(errno)); fSt = FALSE; goto ex; } } cLen = (int)-1; fInHeader = TRUE; fServerKeepAlive = FALSE; // parse status & header for ( pH = ReceiveBuffer, fStatusLine = TRUE ; fInHeader ; ) { cRec = recv( Socket, pH, ReceiveBuffer+sizeof(ReceiveBuffer)-pH, 0 ); if ( cRec <= 0 ) { close( Socket ); Socket = INVALID_SOCKET; break; } pH[ cRec ] = '\0'; // Iterate on header fields while ( pN = strstr(pH, "\r\n" ) ) { *pN = '\0'; printf( "pH<%s>\n", pH ); if ( fStatusLine ) { // This is the status line, decode status SkipNonWhite( &pH ); SkipWhite( &pH ); Status = atoi( pH ); if ( Status == 401 ) { // fNeedAuthenticate = TRUE; } fStatusLine = FALSE; } else if ( pN == pH ) // end of header fields { memtofile( fp, pH+2, strlen( pH+2) ); // put the data to file if ( cLen != -1 ) { cLen -= ( strlen( pH+2) ); // count the rest data length } fInHeader = FALSE; break; } #ifdef UNIX else if ( !strncasecmp( pH, HD_LENGTH, sizeof(HD_LENGTH)-1 ) )#else else if ( !_strnicmp( pH, HD_LENGTH, sizeof(HD_LENGTH)-1 ) )#endif { // get content length SkipNonWhite( &pH ); SkipWhite( &pH ); cLen = atoi( pH ); printf("cLen : %d\n", cLen ); }#ifdef UNIX else if ( !strncasecmp( pH, HD_CONNECTION, sizeof(HD_CONNECTION)-1 ) )#else else if ( !_strnicmp( pH, HD_CONNECTION, sizeof(HD_CONNECTION)-1 ) )#endif { // check for keep-alive flag SkipNonWhite( &pH ); SkipWhite( &pH );#ifdef UNIX if ( !strncasecmp( pH, "Keep-Alive", sizeof("Keep-Alive")-1 ) )#else if ( !_strnicmp( pH, "Keep-Alive", sizeof("Keep-Alive")-1 ) )#endif fServerKeepAlive = TRUE; }#ifdef UNIX else if ( !strncasecmp( pH, TRANSFER_ENCODE, sizeof(TRANSFER_ENCODE)-1 ) )#else else if ( !_strnicmp( pH, TRANSFER_ENCODE, sizeof(TRANSFER_ENCODE)-1 ) )#endif { SkipNonWhite( &pH ); SkipWhite( &pH );#ifdef UNIX if ( !strncasecmp( pH, "chunked", sizeof("chunked")-1 ) )#else if ( !_strnicmp( pH, "chunked", sizeof("chunked")-1 ) )#endif fGetChunkLen = FALSE; }#ifdef UNIX else if ( !strncasecmp( pH, ENTITY_TAG, sizeof(ENTITY_TAG)-1 ) )#else else if ( !_strnicmp( pH, ENTITY_TAG, sizeof(ENTITY_TAG)-1 ) )#endif { SkipNonWhite( &pH ); SkipWhite( &pH ); memset( etagbuffer, (char)0, 256 ); printf(" etag: |%s|\n", pH); if ( etagflag == 0 ) etagflag = 1; strncpy( etagbuffer, pH, 256); }#ifdef UNIX else if ( !strncasecmp( pH, "Last-Modified", sizeof("Last-Modified")-1 ) )#else else if ( !_strnicmp( pH, "Last-Modified", sizeof("Last-Modified")-1 ) )#endif { SkipNonWhite( &pH ); SkipWhite( &pH ); memset( modifybuffer, (char)0, 256 ); printf(" moddify: |%s|\n", pH); if ( modifyflag == 0 ) modifyflag = 1; strncpy( modifybuffer, pH, 256); } pH = pN + 2; } } printf(" rest data cLen : %d\n", cLen ); // read message body if ( Socket != INVALID_SOCKET ) { int ChunkState =0; // 0: init, 1: , 2: , 3: , for ( ; ; ) { printf(" brfore read execute Length : %d\n", cLen ); memset ( ReceiveBuffer, (char )0, sizeof(ReceiveBuffer)); cToRead = sizeof(ReceiveBuffer); if ( fGetChunkLen == TRUE ) { if ( (cToRead > cLen ) && ( cLen != -1 )) cToRead = cLen; } cRec = recv( Socket, ReceiveBuffer, cToRead, 0 ); printf("len %d, buffer:<%s>",cRec, ReceiveBuffer); if ( cRec <= 0 ) { close( Socket ); Socket = INVALID_SOCKET; break; } //find chunked length if ( fGetChunkLen == FALSE ) { pH = ReceiveBuffer; for ( ; cRec > 0; ) { sscanf( pH,"%x", &chunkedLen); // get chunkedLen data length if ( chunkedLen== 0 ) break; pN = strstr(pH, "\r\n" ); // get rid of \r\n if( pN == NULL ) { break; } pH = pN + 2; // get rid of \r\n cRec -=( pH - ReceiveBuffer); // get rid of chunkedLen buffer printf(" crec %d, chnked %d\n", cRec, chunkedLen); { if ( cRec < chunkedLen ) // buffer length < chuncked length { memtofile( fp, pH, cRec ); // write to file chunkedLen -= cRec; // get rest chuncked length cRec =0; // set flag to restart pH += cRec; // move the pointer } else // buffer length >= chunked length { memtofile( fp, pH, chunkedLen ); // write to file pH += chunkedLen; //move the pointer cRec -= (chunkedLen +2); //left length chunkedLen = 0; //set flag if ( cRec == 0 ) // data process over? { cRec = recv( Socket, ReceiveBuffer, cToRead, 0 ); //receive another package printf("len %d, buffer:<%s>",cRec, ReceiveBuffer); if ( cRec <= 0 ) // end of the package { close( Socket ); Socket = INVALID_SOCKET; cRec = 0; break; } pH = ReceiveBuffer; } } } printf("over write crec %d, chnked %d\n", cRec, chunkedLen); } if( Socket == INVALID_SOCKET ) { break; } for ( ; chunkedLen > 0 ; ) // buffer length < chunked length { if ( cToRead > chunkedLen ) { cToRead = chunkedLen; } cRec = recv( Socket, pH, cToRead, 0 ); printf("<%s>",pH); if ( cRec <= 0 ) { close( Socket ); Socket = INVALID_SOCKET; break; } memtofile( fp, pH, cRec ); chunkedLen -= cRec; if ( chunkedLen <= 0 ) { break ; } } } else { memtofile( fp, pH, cRec ); } if( Socket == INVALID_SOCKET ) { break; } if ( fGetChunkLen == TRUE ) { cLen -= cRec; if ( cLen <= 0 ) { close( Socket ); Socket = INVALID_SOCKET; break; } } } } if ( !fServerKeepAlive ) { close( Socket ); Socket = INVALID_SOCKET; } fSt = Status == 200; printf( "Status =%d\n", Status); ex: printf(" return %d \n", fSt ); if ( Socket != INVALID_SOCKET ) close(Socket); printf(" <%s> \n", ReceiveBuffer); if ( fp != NULL ) { fprintf( fp, "%s\n", ReceiveBuffer ); fclose( fp ); } return fSt;}// Helper functionsvoid SkipWhite(char **ppS ){ char *pS = *ppS; while ( *pS && isspace(*pS) ) ++pS; *ppS = pS;}void SkipNonWhite(char **ppS ){ char *pS = *ppS; while ( *pS && !isspace(*pS) ) ++pS; *ppS = pS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -