2017-06-06 15 views
1

私はリクエストペイロードへのネイティブアクセスを提供していない古いバージョンのmongoose(オープンソースWebサーバー)をC言語で使用しています。 POSTリクエストとPUTリクエストをサポートするために、手動で変更しました。mongooseがヘッダを読み込んだ後、Content-Lengthが設定されているかどうかを確認し、そうであれば、ソケットからContent-Lenght文字を再度読み込みます。Mongoose WebServerでリクエスト本体を取得する際のエラー

findCL = strstr(conn->buf, "Content-Length:"); 
    if (findCL) 
    { 
     // skip "Content-Length:" string 
     findCL += 15 * sizeof(char); 
     findCLEnd = (char*)strchr(findCL, delimiter); 
     sizeLen = findCLEnd - findCL; 
     strncpy(CLSize, findCL, sizeLen); 
     CLSize[sizeLen] = '\0'; 

     size = strtoll(CLSize, NULL, 10); 

     if (size > 0) 
     { 
      conn->content_len = read_request(NULL, conn->client.sock, conn->ssl, 
       conn->buf, conn->buf_size, &conn->data_len); 
      conn->content_len = size; 
      perror("recv"); 
      body = (char*)malloc(sizeof(char) * (size + 1)); 
      strncpy(body, conn->buf + conn->request_len, size); 
      body[size] = '\0'; 
     } 
    } 

これまでのところ、コードが美しくない場合でも、それは汚い仕事です。問題は、デバッグではコードは正常に動作しますが、コードが単純なバックグラウンドプロセスとして実行されるとき、ボディは正しく解析されません。時には結果のボディが切り捨てられます。この問題は、クライアントからの高速クエリによって発生しているようです。

+1

どこから送信されましたか? chromeやfirefoxで再現できません...どちらもContent-Lengthを '$ .ajax'を使って適切に追加します。不足しているヘッダを再現するデモを作成する – charlietfl

+0

jQueryとAJAXでタグ付けされた質問を開いてからCコードを表示し、Javascriptは表示されないことは奇妙です。 –

+0

@ JaredFarrish、私はまた "mongoose"とタグ付けしました。 – phagio

答えて

0

本当の答えではありませんが、それが私が解決した方法です。 WebサーバーモジュールはMongoose Webサーバーとして起動しました。私は数ヶ月前にCivetwebに移植しました。このプロジェクトの最新バージョンでも身体の解析がサポートされることを願っていました。そうではなく、手動で実装する必要がありました。いくつかの時間の後、私はCivetwebがJavascriptファイルをIE8ブラウザに提供することに問題があることを発見しました(いくつかの不思議な理由のために)。私はMongooseに戻り、上記のコードとその後のエラーを引き起こしたボディ解析を除いて、すべてが機能しました。私は最終的にCivetwebに戻って、安定したバージョン1.9.1に戻って解決しました。これにより、切り捨てられたリクエスト本文と切り詰められた提供されたjavascriptファイルの両方が解決されました。 Civetwebの最初のバージョンは、それほど安定していないベータ版だったのでしょうが、どうやって数ヶ月間働くのだろうと思います。

私はまだ2つのバージョンの間でdiffをチェックしていませんが、プラットフォームや要求ヘッダーなどに応じて最大応答サイズに関連するものと思われます。

関連する問題