質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Q&A

解決済

1回答

3115閲覧

golang net/http Client Header取得

y.ssss

総合スコア27

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

0グッド

0クリップ

投稿2020/04/24 01:45

goのnet/httpをいじっていて

func main() { //client := http.Client{Timeout: timeout} url := "https://example.com" byteRange := "0-499" req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Println(err) } req.Header.Set("Range", "bytes="+byteRange) fmt.Println(strings.Repeat("/", 80)) dump, _ := httputil.DumpRequestOut(req, true) fmt.Println(string(dump)) client := new(http.Client) resp, err := client.Do(req) dumpResp, _ := httputil.DumpResponse(resp, true) fmt.Printf("\n%s\n%s", strings.Repeat("=", 40), dumpResp) }

のようなコードでリクエストとレスポンスをもらっているのですが、

//////////////////////////////////////////////////////////////////////////////// GET / HTTP/1.1 Host: example.com User-Agent: Go-http-client/1.1 Range: bytes=0-499 ======================================== HTTP/2.0 206 Partial Content Content-Length: 500 Accept-Ranges: bytes Age: 34588 Cache-Control: max-age=604800 Content-Range: bytes 0-499/1256 <---------------------------------- Content-Type: text/html; charset=UTF-8 Date: Fri, 24 Apr 2020 01:36:34 GMT Etag: "3147526947+ident" Expires: Fri, 01 May 2020 01:36:34 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (oxr/8314) Vary: Accept-Encoding X-Cache: HIT <!doctype html> 以下略

上記の「<-----」部分Content-Rangeの値1256を取得して変数として使いたいのですが、
どのような方法がありますか?
初歩的なことで申し訳ないのですが、ご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Content-Range 自体はヘスポンスヘッダーから取得できますが、以下のような文字列なので目的の数値のみを取得するにはやや技工を要すかと思います。

Content-Range: bytes 42-1233/1234

以下は正規表現を用いた一例です。

go

1package main 2 3import ( 4 "fmt" 5 "net/http" 6 "net/http/httputil" 7 "regexp" 8 "strconv" 9 "strings" 10) 11 12var ContentRangeReg = regexp.MustCompile(`^.*? \d*?-\d*?/(\d*?)$`) 13 14func ParseContentRange(contentRange string) (contentLength int64) { 15 raw := ContentRangeReg.FindStringSubmatch(contentRange) 16 if len(raw) < 2 { 17 return -1 18 } 19 c, err := strconv.ParseInt(raw[1], 10, 64) 20 if err != nil { 21 return -1 22 } 23 return c 24} 25 26func main() { 27 //client := http.Client{Timeout: timeout} 28 url := "https://example.com" 29 byteRange := "0-499" 30 req, err := http.NewRequest("GET", url, nil) 31 if err != nil { 32 fmt.Println(err) 33 } 34 35 req.Header.Set("Range", "bytes="+byteRange) 36 fmt.Println(strings.Repeat("/", 80)) 37 38 dump, _ := httputil.DumpRequestOut(req, true) 39 fmt.Println(string(dump)) 40 41 client := new(http.Client) 42 resp, err := client.Do(req) 43 44 fmt.Println("Content-Range", resp.Header.Get("Content-Range")) 45 fmt.Println(ParseContentRange(resp.Header.Get("Content-Range"))) 46 47 //dumpResp, _ := httputil.DumpResponse(resp, true) 48 //fmt.Printf("\n%s\n%s", strings.Repeat("=", 40), dumpResp) 49} 50// Content-Range bytes 0-499/1256 51// 1256

投稿2020/04/24 03:22

d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y.ssss

2020/04/24 17:30

なるほどです! 標準ではないのですね。 対策ソースまでありがとうございます! 無事解決いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問