典型的なシナリオでは、テキスト ファイルに保存された HTTP リクエストとレスポンスのパイプラインに遭遇します。分析やさらなる処理のために、これらのパイプライン化されたメッセージを構造化フォーマットに解析する必要がある場合に、課題が発生します。この記事では、Go でこのようなテキスト ファイルからの HTTP リクエストとレスポンスの両方を解析する手順を説明します。
Go の標準ライブラリには、便利な関数 http.ReadRequest が用意されています。これにより、HTTP リクエストの解析が簡素化されます。 *bufio.Reader からリクエスト行、ヘッダー、本文 (Content-Length ヘッダーで指定されている場合) を読み取ります。
req, err := http.ReadRequest(buf) if err != nil { return err }
http.ReadResponse 関数は次の処理を実行します。 HTTP 応答の場合も同様のタスクです。 *bufio.Reader からステータス行、ヘッダー、および本文を読み取ります。
resp, err := http.ReadResponse(buf, req) if err != nil { return err }
http.ReadResponse 関数は、返されるときに応答本文を自動的に閉じます。後で使用できるように本文を保存するには、別のバッファに手動でコピーする必要があります。
b := new(bytes.Buffer) io.Copy(b, resp.Body) resp.Body.Close() resp.Body = ioutil.NopCloser(b)
ファイルから HTTP パイプラインを解析するには、bufio パッケージを使用します。ファイルを 1 行ずつ読み取り、解析されたリクエストを保存する接続構造体のスライスを作成します。
stream := make([]Connection, 0) for { req, err := http.ReadRequest(buf) if err == io.EOF { break } resp, err := http.ReadResponse(buf, req) if err != nil { return err } ... stream = append(stream, Connection{Request: req, Response: resp}) }
検証の目的で、httputil.DumpRequest と httputil.DumpResponse を使用して、解析されたリクエストと応答を検査用の文字列にダンプできます。
b, err := httputil.DumpRequest(c.Request, true) if err != nil { log.Fatal(err) } fmt.Println(string(b)) b, err = httputil.DumpResponse(c.Response, true) if err != nil { log.Fatal(err) } fmt.Println(string(b))
http.ReadRequest と http.ReadResponse を活用する関数を慎重なボディ処理とともに使用することで、Go のテキスト ファイルからの HTTP パイプライン リクエストとレスポンスを効果的に解析できます。このアプローチにより、HTTP 通信シナリオを便利かつ信頼性の高い方法で分析、処理、テストできるようになります。
以上がGo でテキスト ファイルからパイプライン化された HTTP リクエストとレスポンスを解析するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。