libcurlを使用して取得したレスポンスヘッダをフィールド名と値に分解したいのですが、どのようにするのが良いか皆目見当もつきません。
char *headerに以下のようにレスポンスヘッダが保存されています。
C
1HTTP/1.1 200 OK 2Server: nginx 3Date: Wed, 25 Dec 2019 03:27:03 GMT 4Content-Type: text/html; charset=utf-8 5Content-Length: 3956 6Connection: keep-alive 7Expires: Wed, 25 Dec 2019 03:27:03 GMT 8Cache-Control: max-age=0, no-cache, no-store, must-revalidate 9Vary: Cookie,Accept-Encoding 10X-Frame-Options: SAMEORIGIN 11Set-Cookie: csrftoken=Ec8hYjmYZjMC1sgh8YDkXr2RaetktnWbF9l4EPmU7qNqhNJDegEnAMynR9Mw7OBZ; expires=Wed, 23 Dec 2020 03:27:03 GMT; Max-Age=31449600; Path=/; SameSite=Lax
現状では、
C
1char *res_h; 2char *cp; 3regex_t preg; 4size_t num = 1; 5regmatch_t pmatch[num]; 6const char pattern[] = "^[A-Z][^0-9].{0,30}:"; 7 8if (regcomp(&preg, pattern, REG_EXTENDED|REG_NEWLINE) != 0) { 9 } 10 11res_h = strtok(options->res_header, "\n"); 12cp = strrchr(res_h, ' '); 13 if (cp != NULL){ 14 // ステータスメッセージの行を除外 15 } 16 while(res_h = strtok(NULL, "\n")){ 17 if (regexec(&preg, res_h, num, pmatch, 0) != 0) { 18 printf("no match\n"); 19 } else { 20 for (int i = 0; i < num; i++) { 21 if (pmatch[i].rm_so >= 0 && pmatch[i].rm_eo >= 0 22) { 23 printf("match idx: %d, %d\n", (int)pmatch[i].rm_so, (int)pmatch[i].rm_eo); 24 for (int j = pmatch[i].rm_so ; j < pmatch[i].rm_eo; j++) { 25 putchar(res_h[j]); 26 } 27 } 28 printf("\n"); 29 } 30 }
のようにしているのですが、これではフィールド名と値をそれぞれ取得することができないのかと思います。
分解する方法が思いつかないのですが、何か良い方法はないでしょうか。。。
ご教示いただけますと幸いです。よろしくお願いいたします。
分解したあとどうしたいのでしょうか?ただ表示するだけならheaderをそのままprintfで出力すればいいだけですし、どこかに保存したいのでしたら、どのような形で保存したいかを明記してください。
char *fieldとchar *valueにそれぞれ保存したいです。
すみません。
それぞれ複数個ありますが、どのように考えていますか?
1行ずつ処理して分解して表示したいだけでしょうか?
それぞれ保存して他の関数に渡すのですが、一度渡したら上書きしてさらに渡すように考えています。
libcurlでのHEADER_FUNCTIONではヘッダを一行ごとに受信しているようで、そのたびに上書きして別の関数に渡していくようなイメージです。
フィールド名と値をそれぞれの配列などに変換して保存する必要はなく、フィールド名と値の組み合わせを分解して他の関数に渡したいという感じです。渡してしまったあとはもう必要ないので次の行のフィールド名と値で上書きしていくような形で考えています。
回答2件
あなたの回答
tips
プレビュー