func TestTLSRequireVerifyExceptHTTP(t *testing.T) { opts := nsqd.NewOptions() opts.Logger = newTestLogger(t) opts.LogLevel = 3 opts.TLSCert = "./test/certs/server.pem" opts.TLSKey = "./test/certs/server.key" opts.TLSRootCAFile = "./test/certs/ca.pem" opts.TLSClientAuthPolicy = "require-verify" opts.TLSRequired = TLSRequiredExceptHTTP _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_req_verf_except_http" + strconv.Itoa(int(time.Now().Unix())) nsqd.GetTopicIgnPart(topicName) // no cert buf := bytes.NewBuffer([]byte("test message")) url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.Equal(t, string(body), "OK") time.Sleep(5 * time.Millisecond) }
func TestHTTPmpubBinary(t *testing.T) { opts := nsqd.NewOptions() opts.Logger = newTestLogger(t) _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_mpub_bin" + strconv.Itoa(int(time.Now().Unix())) nsqd.GetTopicIgnPart(topicName) mpub := make([][]byte, 5) for i := range mpub { mpub[i] = make([]byte, 100) } cmd, _ := nsq.MultiPublish(topicName, mpub) buf := bytes.NewBuffer(cmd.Body) url := fmt.Sprintf("http://%s/mpub?topic=%s&binary=true", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.Equal(t, string(body), "OK") time.Sleep(5 * time.Millisecond) }
func TestHTTPmpubEmpty(t *testing.T) { opts := nsqd.NewOptions() opts.Logger = newTestLogger(t) _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_mpub_empty" + strconv.Itoa(int(time.Now().Unix())) nsqd.GetTopicIgnPart(topicName) msg := []byte("test message") msgs := make([][]byte, 4) for i := range msgs { msgs[i] = msg } buf := bytes.NewBuffer(bytes.Join(msgs, []byte("\n"))) _, err := buf.Write([]byte("\n")) test.Equal(t, err, nil) url := fmt.Sprintf("http://%s/mpub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.Equal(t, string(body), "OK") time.Sleep(5 * time.Millisecond) }
func TestHTTPpub(t *testing.T) { opts := nsqd.NewOptions() opts.LogLevel = 2 opts.Logger = newTestLogger(t) //opts.Logger = &levellogger.GLogger{} tcpAddr, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_pub" + strconv.Itoa(int(time.Now().Unix())) _ = nsqd.GetTopicIgnPart(topicName) conn, err := mustConnectNSQD(tcpAddr) test.Equal(t, err, nil) identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") buf := bytes.NewBuffer([]byte("test message")) url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.Equal(t, string(body), "OK") time.Sleep(5 * time.Millisecond) _, err = nsq.Ready(1).WriteTo(conn) test.Equal(t, err, nil) // sleep to allow the RDY state to take effect time.Sleep(50 * time.Millisecond) for { resp, _ := nsq.ReadResponse(conn) frameType, data, err := nsq.UnpackResponse(resp) test.Nil(t, err) test.NotEqual(t, frameTypeError, frameType) if frameType == frameTypeResponse { t.Logf("got response data: %v", string(data)) continue } msgOut, err := nsq.DecodeMessage(data) test.Equal(t, []byte("test message"), msgOut.Body) _, err = nsq.Finish(msgOut.ID).WriteTo(conn) test.Nil(t, err) break } conn.Close() }
func TestHTTPpubtrace(t *testing.T) { opts := nsqd.NewOptions() opts.LogLevel = 2 opts.Logger = newTestLogger(t) //opts.Logger = &levellogger.GLogger{} _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_pub_trace" + strconv.Itoa(int(time.Now().Unix())) _ = nsqd.GetTopicIgnPart(topicName) buf := bytes.NewBuffer([]byte("test message")) rawurl := fmt.Sprintf("http://%s/pubtrace?topic=%s", httpAddr, topicName) resp, err := http.Post(rawurl, "application/octet-stream", buf) test.Equal(t, err, nil) body, _ := ioutil.ReadAll(resp.Body) resp.Body.Close() test.Equal(t, resp.StatusCode, 400) test.Equal(t, string(body), `{"message":"INVALID_TRACE_ID"}`) time.Sleep(time.Second) // the buffer will be drained by the http post // so we need refill the buffer. buf = bytes.NewBuffer([]byte("test message 2")) rawurl = fmt.Sprintf("http://%s/pubtrace?topic=%s&partition=0&trace_id=11", httpAddr, topicName) resp, err = http.Post(rawurl, "application/octet-stream", buf) test.Equal(t, err, nil) body, _ = ioutil.ReadAll(resp.Body) resp.Body.Close() test.Equal(t, resp.StatusCode, 200) type tmpResp struct { Status string `json:"status"` ID uint64 `json:"id"` TraceID string `json:"trace_id"` QueueOffset uint64 `json:"queue_offset"` DataRawSize uint32 `json:"rawsize"` } var ret tmpResp json.Unmarshal(body, &ret) test.Equal(t, ret.Status, "OK") test.Equal(t, ret.TraceID, "11") time.Sleep(5 * time.Millisecond) }
func TestHTTPSRequire(t *testing.T) { opts := nsqd.NewOptions() opts.Logger = newTestLogger(t) //opts.LogLevel = 2 //opts.Logger = &levellogger.GLogger{} opts.LogLevel = 3 opts.TLSCert = "./test/certs/server.pem" opts.TLSKey = "./test/certs/server.key" opts.TLSClientAuthPolicy = "require" _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_pub_req" + strconv.Itoa(int(time.Now().Unix())) nsqd.GetTopicIgnPart(topicName) buf := bytes.NewBuffer([]byte("test message")) url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Equal(t, resp.StatusCode, 403) httpsAddr := nsqdServer.httpsListener.Addr().(*net.TCPAddr) cert, err := tls.LoadX509KeyPair("./test/certs/cert.pem", "./test/certs/key.pem") test.Equal(t, err, nil) tlsConfig := &tls.Config{ Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true, MinVersion: 0, } transport := &http.Transport{ TLSClientConfig: tlsConfig, } client := &http.Client{Transport: transport} buf = bytes.NewBuffer([]byte("test message")) url = fmt.Sprintf("https://%s/pub?topic=%s", httpsAddr, topicName) resp, err = client.Post(url, "application/octet-stream", buf) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.Equal(t, string(body), "OK") time.Sleep(5 * time.Millisecond) }
func TestHTTPpubEmpty(t *testing.T) { opts := nsqd.NewOptions() opts.Logger = newTestLogger(t) _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_pub_empty" + strconv.Itoa(int(time.Now().Unix())) nsqd.GetTopicIgnPart(topicName) buf := bytes.NewBuffer([]byte("")) url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.Equal(t, resp.StatusCode, 500) test.Equal(t, string(body), `{"status_code":500,"status_txt":"MSG_EMPTY","data":null}`) time.Sleep(5 * time.Millisecond) }
func TestHTTPpubpartition(t *testing.T) { opts := nsqd.NewOptions() opts.LogLevel = 2 opts.Logger = newTestLogger(t) //opts.Logger = &levellogger.GLogger{} _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_pub_partition" + strconv.Itoa(int(time.Now().Unix())) _ = nsqd.GetTopicIgnPart(topicName) buf := bytes.NewBuffer([]byte("test message")) // should failed pub to not exist partition url := fmt.Sprintf("http://%s/pub?topic=%s&partition=2", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Equal(t, err, nil) defer resp.Body.Close() body, _ := ioutil.ReadAll(resp.Body) test.NotEqual(t, string(body), "OK") time.Sleep(5 * time.Millisecond) }
func TestHTTPV1TopicChannel(t *testing.T) { opts := nsqd.NewOptions() opts.Logger = newTestLogger(t) _, httpAddr, nsqd, nsqdServer := mustStartNSQD(opts) defer os.RemoveAll(opts.DataPath) defer nsqdServer.Exit() topicName := "test_http_topic_channel2" + strconv.Itoa(int(time.Now().Unix())) topicPart := 0 channelName := "ch2" nsqd.GetTopicIgnPart(topicName) url := fmt.Sprintf("http://%s/channel/create?topic=%s&channel=%s", httpAddr, topicName, channelName) resp, err := http.Post(url, "application/json", nil) test.Equal(t, err, nil) test.Equal(t, resp.StatusCode, 200) body, _ := ioutil.ReadAll(resp.Body) resp.Body.Close() test.Equal(t, string(body), "") test.Equal(t, resp.Header.Get("X-NSQ-Content-Type"), "nsq; version=1.0") topic, err := nsqd.GetExistingTopic(topicName, topicPart) test.Equal(t, err, nil) test.NotNil(t, topic) channel, err := topic.GetExistingChannel(channelName) test.Equal(t, err, nil) test.NotNil(t, channel) url = fmt.Sprintf("http://%s/channel/pause?topic=%s&channel=%s", httpAddr, topicName, channelName) resp, err = http.Post(url, "application/json", nil) test.Equal(t, err, nil) test.Equal(t, resp.StatusCode, 200) body, _ = ioutil.ReadAll(resp.Body) resp.Body.Close() test.Equal(t, string(body), "") test.Equal(t, resp.Header.Get("X-NSQ-Content-Type"), "nsq; version=1.0") test.Equal(t, channel.IsPaused(), true) url = fmt.Sprintf("http://%s/channel/unpause?topic=%s&channel=%s", httpAddr, topicName, channelName) resp, err = http.Post(url, "application/json", nil) test.Equal(t, err, nil) test.Equal(t, resp.StatusCode, 200) body, _ = ioutil.ReadAll(resp.Body) resp.Body.Close() test.Equal(t, string(body), "") test.Equal(t, resp.Header.Get("X-NSQ-Content-Type"), "nsq; version=1.0") test.Equal(t, channel.IsPaused(), false) url = fmt.Sprintf("http://%s/channel/delete?topic=%s&channel=%s", httpAddr, topicName, channelName) resp, err = http.Post(url, "application/json", nil) test.Equal(t, err, nil) test.Equal(t, resp.StatusCode, 200) body, _ = ioutil.ReadAll(resp.Body) resp.Body.Close() test.Equal(t, string(body), "") test.Equal(t, resp.Header.Get("X-NSQ-Content-Type"), "nsq; version=1.0") _, err = topic.GetExistingChannel(channelName) test.NotNil(t, err) nsqd.DeleteExistingTopic(topicName, topicPart) _, err = nsqd.GetExistingTopic(topicName, topicPart) test.NotNil(t, err) }