Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C beginner: string parsing

Tags:

c

string

parsing

I'm trying to parse the following HTTP response:

HTTP/1.1 200 OK
Date: Tue, 06 Dec 2011 11:15:21 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.9
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 48
Content-Type: text/html

��(�ͱ���I�O����H�����ч��
                      �4�@�B�$���S

I want to extract "48" and the binary content.

Here's what I've tried sofar:

  //char* str contains the response
  char * pch;
  printf ("Splitting response into tokens:\n");
  pch = strtok (str,"\r\n");
  while (pch != NULL)
  {
      printf ("%s\n",pch);
      pch = strtok (NULL, "\r\n");
  }

But I'm kinda stuck now... Any help is greatly appreciated.


edit:

Here's what I've done sofar:

char* pch;
char* pch2;
pch=strstr(buf,"Content-Length:");
pch2=strstr(pch,"\r\n");

How can I get the bit between these two pointers?


Edit: solution:

        char* pch;
        char* pch2;
        pch=strstr(buf,"Content-Length:");
        int i=0;
        char contLen[20];
        for(i=0;i<20;i++){
                char next=pch[strlen("Content-Length:")+i];
                if(next=='\r' || next=='\n'){
                        break;
                }
                contLen[i]=next;
        }
        printf("%d\n",atoi(contLen));
like image 256
Eamorr Avatar asked Dec 06 '11 11:12

Eamorr


2 Answers

Why don't you instead search for the string "Content-Length:", then from that point move forwards?

You can use strstr() to find the spot in str, then move the char pointer forward strlen("Content-Length:") positions, then read the value using atoi().

There is no need to tokenize the whole string.

like image 186
AndersK Avatar answered Sep 20 '22 11:09

AndersK


Try this:

const char* http_header = 
"HTTP/1.1 200 OK\r\n" \
"Date: Tue, 06 Dec 2011 11:15:21 GMT" \
"Server: Apache/2.2.14 (Ubuntu)\r\n" \
"X-Powered-By: PHP/5.3.2-1ubuntu4.9\r\n" \
"Vary: Accept-Encoding\r\n" \
"Content-Encoding: gzip\r\n" \
"Content-Length: 48\r\n" \
"Content-Type: text/html\r\n\r\n" \
"mydata";

// will point to start of the actual data that following the http header
char* pdata = strstr((char*)http_header,"\r\n\r\n");
// will point to start of 'Content-Length' header
char* pcontent = strstr((char*)http_header,"Content-Length:");
// get the length of the data
int value = atoi(pcontent + 15);
like image 26
Cyclonecode Avatar answered Sep 21 '22 11:09

Cyclonecode