рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ HTTP / 1.1 рдФрд░ HTTP / 2 рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд▓реЗрдЦрди



рдЧреЛрд▓рдВрдЧ рдПрдХ рдмреЗрд╣рддрд░реАрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣реИрдВред рдпрд╣ рдЖрд▓реЗрдЦ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЧреЛ рдФрд░ HTTP / 1.1 рдФрд░ HTTP / 2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ: рд╕реНрдХреНрд░реИрдЪ рд╣реИрдВрдб-рдСрди рдХреЛрд░реНрд╕ рд╕реЗ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░ ред

рд╣рдо рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░реЛрдореЛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░рддреЗ рд╕рдордп 10,000 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред

HTTP / 2 рд╡рд░реНрд▓реНрдб рд╡рд╛рдЗрдб рд╡реЗрдм рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ HTTP рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рджреВрд╕рд░рд╛ рдкреНрд░рдореБрдЦ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдкреНрд░реЛрдЯреЛрдХреЙрд▓ SPDY рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред GitHub рдкрд░ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред

HTTP / 1.1 рд╕рд░реНрд╡рд░


рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдкрд░ HTTP / 1.1 рд╕рд░реНрд╡рд░ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдкреЛрд░реНрдЯ 9191 рдФрд░ рдкрде / рд╣реИрд▓реЛ / sayHello рдХреЗ рд╕рд╛рде HTTP (рдПрд╕) рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред echoPayload рдЗрдХреЛ рд▓реЙрдЬрд┐рдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ echoPayload рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

package main import ( "fmt" "io/ioutil" "log" "net/http" ) func main() { http.HandleFunc("/hello/sayHello", echoPayload) log.Printf("Go Backend: { HTTPVersion = 1 }; serving on https://localhost:9191/hello/sayHello") log.Fatal(http.ListenAndServeTLS(":9191", "./cert/server.crt", "./cert/server.key", nil)) } func echoPayload(w http.ResponseWriter, req *http.Request) { log.Printf("Request connection: %s, path: %s", req.Proto, req.URL.Path[1:]) defer req.Body.Close() contents, err := ioutil.ReadAll(req.Body) if err != nil { log.Fatalf("Oops! Failed reading body of the request.\n %s", err) http.Error(w, err.Error(), 500) } fmt.Fprintf(w, "%s\n", string(contents)) 

рдЪреВрдВрдХрд┐ HTTP (S) рд╕реЗрд╡рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдПрдХ рд╕рд░реНрд╡рд░ рдХреБрдВрдЬреА рдкреНрд░рджрд╛рди рдХрд░рдиреА рд╣реЛрдЧреАред рджреЛрдиреЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ server.crt рдФрд░ server.key рдХреЗ рдирд╛рдо рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдФрд░ рдХреБрдВрдЬреА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдиреАрдЪреЗ рд╣реИред

./cert/server.crt

----- BEGIN CERTIFICATE -----
MIID + zCCAuOgAwIBAgIJAPsvGCCAC2i + MA0GCSqGSIb3DQEBCwUAMIGTMQswCQYD
VQQGEwJMSzEQMA4GA1UECAwHV2VzdGVybjEQMA4GA1UEBwwHQ29sb21ibzESMBAG
A1UECgwJTERDTEFLTUFMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzESMBAGA1UEAwwJ
bG9jYWxob3N0MSIwIAYJKoZIhvcNAQkBFhNsZGNsYWttYWxAZ21haWwuY29tMB4X
DTE5MDQyMDA1MjczM1oXDTIwMDQxOTA1MjczM1owgZMxCzAJBgNVBAYTAkxLMRAw
DgYDVQQIDAdXZXN0ZXJuMRAwDgYDVQQHDAdDb2xvbWJvMRIwEAYDVQQKDAlMRENM
QUtNQUwxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRIwEAYDVQQDDAlsb2NhbGhvc3Qx
IjAgBgkqhkiG9w0BCQEWE2xkY2xha21hbEBnbWFpbC5jb20wggEiMA0GCSqGSIb3
DQEBAQUAA4IBDwAwggEKAoIBAQC9PKAOlJcOBUI9CGnVjMjQHNRqYv01CaUdC4 / e
YFyegxLpoMpYvEC + nYlHT2j7BOhQBV + TkH1D4YOK2WP3V0FLv5hM7Nxsgf25WNHa
zi2DTBvcBgB9sDJA / avIvF + 63 + Btnyggp3xq6MaHy5DNH0kPnSiPiy7PRKToEUn6
oqPnB10rRBFZqs3ePmEDxVL3T / TUZSXR3P95fV1vDCqrJbr3YwWOzFCq8kEJFsxK
B7GSEKpPgmK0g5krmAQqUOuJJ3 / xFlCP4trKg / lvSJZ5S / LZD5teDDg6Ax3Mvthj
kMh9 / OM5GTTjRwhct9dHjFI8POj + TMbLZvoPVXjsmategtLAgMBAAGjUDBOMB0G
A1UdDgQWBBQ1CmWXmrHOv6b8f763 / bk80EpbajAfBgNVHSMEGDAWgBQ1CmWXmrHO
v6b8f763 / bk80EpbajAMBgNVHRMEBTADAQH / MA0GCSqGSIb3DQEBCwUAA4IBAQAH
D51Uoe2K4N9 / GxRgww5mMW2dUJ7Hc / tGsr / J1fNqHY8SXNAn5i + GwI + xBvwxHHL3
KZHbfq7eYDE5EItt3cZp5ySSscdTEay9ReH2 + 8k32gpH46CMwPV3XvtQuBVVAC4u
szrq1eWKhYI2zf4iUVpwvq89OynVGIp0atng + q3A2cBhi3NGo6Ho1s2rywQyqiq8
up4PUSVQ6WBoJFx5PEEDxD84VMS7Pan6dT34b9n56tq5R06retZTUZ8jMM88CGX4
88pSPU + XImp6DdNVBmW6Lz76jiSNHLkZGm4jumjeyUGzBjBEBOgSegeWlinMtWE9
gaVxeUHrqHk8xzwJ4oIu
----- END рдкреНрд░рдорд╛рдг рдкрддреНрд░ -----

./cert/server.key

----- BEGIN рдирд┐рдЬреА рдХреБрдВрдЬреА -----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9PKAOlJcOBUI9
CGnVjMjQHNRqYv01CaUdC4 / eYFyegxLpoMpYvEC + nYlHT2j7BOhQBV + TkH1D4YOK
2WP3V0FLv5hM7Nxsgf25WNHazi2DTBvcBgB9sDJA / avIvF + 63 + Btnyggp3xq6MaH
y5DNH0kPnSiPiy7PRKToEUn6oqPnB10rRBFZqs3ePmEDxVL3T / TUZSXR3P95fV1v
DCqrJbr3YwWOzFCq8kEJFslKB7GSEKpPgmK0g5krmAQqUOCJ3 / xFlCP4trKg / lv
SJZ5S / LZD5teDDg6Ax3MvthjkMh9 / OM5GGTTjRwhct9dHjFI8POj + TMbLZvoPVXj
smATEgtLAgMBAAECggEAbaS2yDvn2cPKQTqit4y + vXY2zP1V4GkaNd4BGcOTZnRj
fOIg25EXoln8tEiadva888BpREKvkakUYlraxPDVcGIuiEOk42nd7Io97R0Q2cY7
ThxcJHb2ZxmTctdSUCBvFJTm1ySzve3pOb0ExRSfbGCOo7zs / kKzmZKK3qFlffGS
Ga9O7hylouXPU22CM + 5Lq0JPTER73z0DpAweZc0L14j6dzhcG3qUwk0K6K47VZgE
NhEORul7xDj91bh2iEoSbaQe8HxLaMQoMXOC / 9o22UKKTe9WZE3 + XCvg + vkw / sS
biQ + b4EZ9LuhAhCZ0UE6 + y7PZY + 8G / YsbGg0Zo8cAQKBgQDyTuG47rWBgbdHBE /
MSKGU6w + a1SdLk6jG + Enji5Q624 / h0xt5nF9ah2eRf3Rlhn9WEKM / uE9ouEODBKE
8rIDsjufEMI8moPEloRBSsxPNw + fNMSSCZjL + qPtTJUbRio7WA23sfdnE57ygBa
wlPQ9UBBWSm2se4veEZtHjtngQKBgQDH7gnH5Att6ZYazRTgD72g0C5v1l4LYVEQ
jxdBcs6TJA8wHfifZ45F67W95QunmM813UxfS + ybdjytlb8 / lmi2BnK6lDx5HWIL
31jnbg2CxCrNv9oZLjKVDmkp4WUcEp5W33R1 / MGDTRfyARP + 6QYQO / ATMdqtm5Uu
cD6clrL4ywKBgQCQ0niy0WmGaAMlQ8CoxLM / 2c6 + 1 + OQtlalwkoGHEKudqhELBeQ
MAVw0fW13Vtg4vfRpejQ4J26 + xjMDocbEv / bBIsvjvF57XlaXLucJJy2Jwv0BSMa
cCkRa1gkYeyek74DaSzyXqDSYVO / RPKFTFRQNeUbqbD20s3rbVWablFPAQKBgB5y
zUCJJYh2w6qPQzegjhO4wOm9bxMyngL0l + ka0AUuv7VnSx8TyWIytLoX8P90UVJ1
wpTc3ksK5dDV9ot7n7ThJIXv34nehLkkKckNRLd + oro1FsUw + PkkebWsIxb0avL2
EymI9fvGOPhdW6s91 / OO / VAfDpvUDxNEevSkKtujAoGAcMOsXtn / UyT3Lssxgla3
K + DCaFhAQPSUXOmpZwEbQ0yQlksDe4flsam8bEDI5D5iHx1ziSfh583qJl3BEZ5u
VZTEO2YLvT9QRz7pv2qspqj7nzSyBU2BFAajq43 / G1b8FHfVgN + YdVtzVrigfql5
2a + JxOxFfpjnGQ7RfSxSb + Q =
----- END рдирд┐рдЬреА рдХреБрдВрдЬреА -----

рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

 $ go run http_server.go 

рдЙрддреНрддрд░ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 Go Backend: { HTTPVersion = 1 }; serving on https://localhost:9191/hello/sayHello 

рдЕрдм рд╣рдо HTTP / 1.1 POST рдЕрдиреБрд░реЛрдз (рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдореЛрдб) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ:

 $ curl -k -v https://localhost:9191/hello/sayHello -d "Hello Go!" $ curl -v --cacert ./cert/server.crt https://localhost:9191/hello/sayHello -d "Hello Go!" 

рдиреАрдЪреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдкрд╣рд▓рд╛ рднрд╛рдЧ рдЯреАрдПрд▓рдПрд╕ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рд╣реИрдВрдбрд╢реЗрдХ рд╡рд┐рд╡рд░рдг рд╣реИред рджреВрд╕рд░рд╛ HTTP / 1.1 рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред рдЕрдВрдд рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдореИрд╕реЗрдЬ "рд╣реЗрд▓реЛ рдЧреЛ!" рд╣реИред

* 127.0.0.1 рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ ...
* рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ (127.0.0.1) рдкреЛрд░реНрдЯ 9191 (# 0)
* ALPN, http / 1.1 рдХреА рдкреЗрд╢рдХрд╢
* рд╕рд┐рдлрд░ рдЪрдпрди: ALL:! EXPORT:! EXPORT40:! EXPORT56:! ANULL:! LOW:! RC4: @STRENGTH
* рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ:
* CAfile: /etc/ssl/certs/ca-certports.crt
CApath: рдХреЛрдИ рдирд╣реАрдВ
* TLSv1.2 (OUT), TLS рд╣реЗрдбрд░, рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕реНрдЯреЗрдЯрд╕ (22):
* TLSv1.2 (OUT), TLS рд╣реИрдВрдбрд╢реЗрдХ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрд▓реЛ (1):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рд░реНрд╡рд░ рд╣реИрд▓реЛ (2):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рдкреНрд░рдорд╛рдгрдкрддреНрд░ (11):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рд░реНрд╡рд░ рдХреБрдВрдЬреА рд╡рд┐рдирд┐рдордп (12):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рд░реНрд╡рд░ рд╕рдорд╛рдкреНрдд (14):
* TLSv1.2 (OUT), TLS рд╣рд╛рде рдорд┐рд▓рд╛рдирд╛, рдЧреНрд░рд╛рд╣рдХ рдХреБрдВрдЬреА рд╡рд┐рдирд┐рдордп (16):
* TLSv1.2 (OUT), TLS рдкрд░рд┐рд╡рд░реНрддрди рд╕рд┐рдлрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрд▓реЛ (1):
* TLSv1.2 (OUT), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рдорд╛рдкреНрдд (20):
* TLSv1.2 (IN), TLS рдкрд░рд┐рд╡рд░реНрддрди рд╕рд┐рдлрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрд▓реЛ (1):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рдорд╛рдкреНрдд (20):
* SSL рдХрдиреЗрдХреНрд╢рди TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
* ALPN, рд╕рд░реНрд╡рд░ рдиреЗ http / 1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛
* рд╕рд░реНрд╡рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░:
* рд╡рд┐рд╖рдп: рд╕реА = рдПрд▓рдХреЗ; рдПрд╕рдЯреА = рдкрд╢реНрдЪрд┐рдореА; рдПрд▓ = рдХреЛрд▓рдВрдмреЛ; O = LDCLAKMAL; рдУрдпреВ = рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ; рд╕реАрдПрди = рдЪрдирд╛рдХрд╛ рд▓рдХрдорд▓; emailAddress=ldclakmal@gmail.com
* рдкреНрд░рд╛рд░рдВрдн рддрд┐рдерд┐: рдЕрдкреНрд░реИрд▓ 20 03:03:58 2019 рдЬреАрдПрдордЯреА
* рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд: рдЕрдкреНрд░реИрд▓ 19 03:03:58 2020 GMT
* рдЬрд╛рд░реАрдХрд░реНрддрд╛: рд╕реА = рдПрд▓рдХреЗ; рдПрд╕рдЯреА = рдкрд╢реНрдЪрд┐рдореА; рдПрд▓ = рдХреЛрд▓рдВрдмреЛ; O = LDCLAKMAL; рдУрдпреВ = рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ; рд╕реАрдПрди = рдЪрдирд╛рдХрд╛ рд▓рдХрдорд▓; emailAddress=ldclakmal@gmail.com
* рдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдкрд░рд┐рдгрд╛рдо: рд╕реНрд╡ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ (18), рд╡реИрд╕реЗ рднреА рдЬрд╛рд░реА рд╣реИред
> POST / рд╣реИрд▓реЛ / SayHello HTTP / 1.1
> рдореЗрдЬрдмрд╛рди: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 9191
> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ: рдХрд░реНрд▓ / 7.46.0
> рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ: * / *
> рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ: 9
> рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдЖрд╡реЗрджрди / x-www-form-urlencoded
>
* рдЕрдкрд▓реЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрдВрдж рднреЗрдЬ рджрд┐рдпрд╛: 9 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕реЗ 9
<HTTP / 1.1 200 рдареАрдХ рд╣реИ
<рджрд┐рдирд╛рдВрдХ: рд╢рдирд┐, 20 рдЕрдкреНрд░реИрд▓ 2019 06:56:19 рдЬреАрдПрдордЯреА
<рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ: 10
<рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛; charset = utf-8
<
рдирдорд╕реНрдХрд╛рд░ рдЬрд╛рдУ!
* рдХрдиреЗрдХреНрд╢рди # 0 рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

HTTP / 1.1 рдХреНрд▓рд╛рдЗрдВрдЯ


рдирдпрд╛ рдХреЛрдб рдЧреЛ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг HTTP / 1.1 рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрд╣ рдЧреНрд░рд╛рд╣рдХ "рд╣реИрд▓реЛ рд╣реИрд▓реЛ!" рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдЪрдЯреАрдЯреАрдкреА (рдПрд╕) рдкреЛрд╕реНрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХреЛ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ : 9191 / рд╣реИрд▓реЛ / рдХрд╣реЗрд╣реЗрд▓реЛ рднреЗрдЬрддрд╛ рд╣реИред

 package main import ( "bytes" "crypto/tls" "crypto/x509" "fmt" "io/ioutil" "log" "net/http" ) func main() { client := &http.Client{} // Create a pool with the server certificate since it is not signed // by a known CA caCert, err := ioutil.ReadFile("./cert/server.crt") if err != nil { log.Fatalf("Reading server certificate: %s", err) } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) // Create TLS configuration with the certificate of the server tlsConfig := &tls.Config{ RootCAs: caCertPool, } // Use the proper transport in the client client.Transport = &http.Transport{ TLSClientConfig: tlsConfig, } // Perform the request resp, err := client.Post("https://localhost:9191/hello/sayHello", "text/plain", bytes.NewBufferString("Hello Go!")) if err != nil { log.Fatalf("Failed get: %s", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf("Failed reading response body: %s", err) } fmt.Printf("Got response %d: %s %s", resp.StatusCode, resp.Proto, string(body)) 

рдЪреВрдВрдХрд┐ HTTP (рдПрд╕) рд╕реЗрд╡рд╛ рднреА рдпрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдФрд░ рдПрдХ рдХреБрдВрдЬреА рдкреНрд░рджрд╛рди рдХрд░рдиреА рд╣реЛрдЧреАред рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ server.crt рдФрд░ server.key рдирд╛рдо рдХреЗ рд╕рд╛рде рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдЦрдВрдб рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рд╣рдо рдкреЛрд░реНрдЯ 9191 рдФрд░ рдкрде / рд╣реИрд▓реЛ / SayHello рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА HTTP (рдПрд╕) рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

 $ go run http_client.go 

рдЖрдЙрдЯрдкреБрдЯ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 Got response 200: HTTP/1.1 Hello Go! 

рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд░реНрд▓ рдХрдорд╛рдВрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

 $ curl -v --cacert ./cert/server.crt https://localhost:9191/hello/sayHello -d "Hello Go!" 

HTTP / 1.1 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ HTTP / 2 рдХреЗ рд▓рд┐рдП рд╡рд╣реА рджреЛрд╣рд░рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

HTTP / 2 рд╕рд░реНрд╡рд░


рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдЗрдХреЛ рд╕рд░реНрд╡рд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

 package main import ( "fmt" "golang.org/x/net/http2" "io/ioutil" "log" "net/http" ) func main() { var httpServer = http.Server{ Addr: ":9191", } var http2Server = http2.Server{} _ = http2.ConfigureServer(&httpServer, &http2Server) http.HandleFunc("/hello/sayHello", echoPayload) log.Printf("Go Backend: { HTTPVersion = 2 }; serving on https://localhost:9191/hello/sayHello") log.Fatal(httpServer.ListenAndServeTLS("./cert/server.crt", "./cert/server.key")) } func echoPayload(w http.ResponseWriter, req *http.Request) { log.Printf("Request connection: %s, path: %s", req.Proto, req.URL.Path[1:]) defer req.Body.Close() contents, err := ioutil.ReadAll(req.Body) if err != nil { log.Fatalf("Oops! Failed reading body of the request.\n %s", err) http.Error(w, err.Error(), 500) } fmt.Fprintf(w, "%s\n", string(contents)) 

рд╕рд░реНрд╡рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 $ go run http2_server.go 

рдЙрддреНрддрд░ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 Go Backend: { HTTPVersion = 2 }; serving on https://localhost:9191/hello/sayHello 

рдЕрдм рд╕рд░реНрд╡рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ HTTP / 1.1 рдпрд╛ HTTP / 2 рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП HTTP / 1.1 POST рдХрдорд╛рдВрдб рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╣реИрдВ:

 $ curl -k -v https://localhost:9191/hello/sayHello -d "Hello Go!" $ curl -v --cacert ./cert/server.crt https://localhost:9191/hello/sayHello -d "Hello Go!" 

рдФрд░ рдпрд╣реА рдмрд╛рдд, рд▓реЗрдХрд┐рди HTTP / 2 POST рдХреЗ рд╕рд╛рде:

 $ curl -k -v --http2 https://localhost:9191/hello/sayHello -d "Hello Go!" $ curl -v --http2 --cacert ./cert/server.crt https://localhost:9191/hello/sayHello -d "Hello Go!" 

рдиреАрдЪреЗ рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрд╢рди рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рдПрдХ TLS рд╣реИрдВрдбрд╢реЗрдХ рд╣реИ, рджреВрд╕рд░рд╛ HTTP / 2 рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред

* 127.0.0.1 рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ ...
* рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ (127.0.0.1) рдкреЛрд░реНрдЯ 9191 (# 0)
* ALPN, h2 рдХреА рдкреЗрд╢рдХрд╢
* ALPN, http / 1.1 рдХреА рдкреЗрд╢рдХрд╢
* рд╕рд┐рдлрд░ рдЪрдпрди: ALL:! EXPORT:! EXPORT40:! EXPORT56:! ANULL:! LOW:! RC4: @STRENGTH
* рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ:
* CAfile: src / hello / cert / server.crt
CApath: рдХреЛрдИ рдирд╣реАрдВ
* TLSv1.2 (OUT), TLS рд╣реЗрдбрд░, рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕реНрдЯреЗрдЯрд╕ (22):
* TLSv1.2 (OUT), TLS рд╣реИрдВрдбрд╢реЗрдХ, рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрд▓реЛ (1):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рд░реНрд╡рд░ рд╣реИрд▓реЛ (2):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рдкреНрд░рдорд╛рдгрдкрддреНрд░ (11):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рд░реНрд╡рд░ рдХреБрдВрдЬреА рд╡рд┐рдирд┐рдордп (12):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рд░реНрд╡рд░ рд╕рдорд╛рдкреНрдд (14):
* TLSv1.2 (OUT), TLS рд╣рд╛рде рдорд┐рд▓рд╛рдирд╛, рдЧреНрд░рд╛рд╣рдХ рдХреБрдВрдЬреА рд╡рд┐рдирд┐рдордп (16):
* TLSv1.2 (OUT), TLS рдкрд░рд┐рд╡рд░реНрддрди рд╕рд┐рдлрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрд▓реЛ (1):
* TLSv1.2 (OUT), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рдорд╛рдкреНрдд (20):
* TLSv1.2 (IN), TLS рдкрд░рд┐рд╡рд░реНрддрди рд╕рд┐рдлрд░, рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрд▓реЛ (1):
* TLSv1.2 (IN), TLS рд╣реИрдВрдбрд╢реЗрдХ, рд╕рдорд╛рдкреНрдд (20):
* SSL рдХрдиреЗрдХреНрд╢рди TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
* ALPN, рд╕рд░реНрд╡рд░ рдиреЗ h2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛
* рд╕рд░реНрд╡рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░:
* рд╡рд┐рд╖рдп: рд╕реА = рдПрд▓рдХреЗ; рдПрд╕рдЯреА = рдкрд╢реНрдЪрд┐рдореА; рдПрд▓ = рдХреЛрд▓рдВрдмреЛ; O = LDCLAKMAL; рдУрдпреВ = рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ; CN = рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ; emailAddress=ldclakmal@gmail.com
* рдкреНрд░рд╛рд░рдВрдн рджрд┐рдирд╛рдВрдХ: рдЕрдкреНрд░реИрд▓ 20 05:27:33 2019 GMT
* рд╕рдордп рд╕реАрдорд╛ рд╕рдорд╛рдкреНрдд: рдЕрдкреНрд░реИрд▓ 19 05:27:33 2020 GMT
* рд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ (рдорд┐рд▓рд╛рди)
* рдЬрд╛рд░реАрдХрд░реНрддрд╛: рд╕реА = рдПрд▓рдХреЗ; рдПрд╕рдЯреА = рдкрд╢реНрдЪрд┐рдореА; рдПрд▓ = рдХреЛрд▓рдВрдмреЛ; O = LDCLAKMAL; рдУрдпреВ = рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ; CN = рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ; emailAddress=ldclakmal@gmail.com
* рдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдареАрдХ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред
* HTTP2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕рд░реНрд╡рд░ рдмрд╣реБ-рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
* рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрд┐рдд (HTTP / 2 рдкреБрд╖реНрдЯрд┐рдХрд░рдг)
* TCP_NODELAY рд╕реЗрдЯ
* рдЙрдиреНрдирдпрди рдХреЗ рдмрд╛рдж рдмрдлрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рдмрдлрд░ рдореЗрдВ HTTP / 2 рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдирд╛: len = 0
* рд╕реНрдЯреНрд░реАрдо рдЖрдИрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: 1 (рдЖрд╕рд╛рди рд╣реИрдВрдбрд▓ 0x10ddf20)
> POST / рд╣реИрд▓реЛ / SayHello HTTP / 1.1
> рдореЗрдЬрдмрд╛рди: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 9191
> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ: рдХрд░реНрд▓ / 7.46.0
> рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ: * / *
> рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ: 9
> рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдЖрд╡реЗрджрди / x-www-form-urlencoded
>
* рд╣рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрд▓реЛрдб рдФрд░ рдареАрдХ рд╣реИрдВ
<HTTP / 2.0 200
<рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░: рдкрд╛рда / рд╕рд╛рджрд╛; charset = utf-8
<рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ: 10
<рджрд┐рдирд╛рдВрдХ: рд╢рдирд┐, 20 рдЕрдкреНрд░реИрд▓ 2019 06:54:50 рдЬреАрдПрдордЯреА
<
рдирдорд╕реНрдХрд╛рд░ рдЬрд╛рдУ!
* рдХрдиреЗрдХреНрд╢рди # 0 рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

HTTP / 2 рдЧреНрд░рд╛рд╣рдХ


рдЕрдВрддрд┐рдо рднрд╛рдЧ HTTP / 2 рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕реНрдерд╛рдиреАрдпрд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП HTTP (S) POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ: 9191 / рд╣реИрд▓реЛ / sayHello:

 package main import ( "bytes" "crypto/tls" "crypto/x509" "fmt" "golang.org/x/net/http2" "io/ioutil" "log" "net/http" ) func main() { client := &http.Client{} // Create a pool with the server certificate since it is not signed // by a known CA caCert, err := ioutil.ReadFile("./cert/server.crt") if err != nil { log.Fatalf("Reading server certificate: %s", err) } caCertPool := x509.NewCertPool() caCertPool.AppendCertsFromPEM(caCert) // Create TLS configuration with the certificate of the server tlsConfig := &tls.Config{ RootCAs: caCertPool, } // Use the proper transport in the client client.Transport = &http2.Transport{ TLSClientConfig: tlsConfig, } // Perform the request resp, err := client.Post("https://localhost:9191/hello/sayHello", "text/plain", bytes.NewBufferString("Hello Go!")) if err != nil { log.Fatalf("Failed get: %s", err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf("Failed reading response body: %s", err) } fmt.Printf("Got response %d: %s %s", resp.StatusCode, resp.Proto, string(body)) 

рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдЖрдкрдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрдВрдЬреА рдФрд░ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реЗ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдФрд░ рд╕рд░реНрд╡рд░редрдХреАред

рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реЙрдиреНрдЪ:

 $ go run http2_client.go 

рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЬрд╡рд╛рдм:

 Got response 200: HTTP/2 Hello Go! 

рдЧреНрд░рд╛рд╣рдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛:

 $ curl -v --http2 --cacert ./cert/server.crt https://localhost:9191/hello/sayHello -d "Hello Go!" 

рд╡рд╣ рд╕рдм рд╣реИред рдХрд╛рдо рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЧреЛ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХреА рд╕рдордЭ рджреЗрддрд╛ рд╣реИред

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:

Source: https://habr.com/ru/post/hi451032/


All Articles