Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Reading body() before or after form() is not consistent across all servers

Đã đóng
#4,031 2 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Một pull request liên quan đã được merge.

  • #4034 của @jknack — đã merge

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
48/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
java
Lĩnh vực
backend

Hướng nghiên cứu

The report identifies ctx.body().value() and ctx.form()/ctx.formMap() in a ServerTest that runs against Undertow and Jetty. Start by tracing how each server handles form parsing and body access, then run the supplied test against both servers. Done means the call order behaves consistently across both servers, or the server difference is documented.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

I was replacing jooby-undertow with jooby-jetty and I am getting different behaviour due to making a call to ctx.body().value() before ctx.form().toMap()

I expected this to be consistent across different servers, or at least for this difference to be documented.

/*
 * Jooby https://jooby.io
 * Apache License Version 2.0 https://jooby.io/LICENSE.txt
 * Copyright 2014 Edgar Espina
 */
package io.jooby.test;

import io.jooby.exception.MissingValueException;
import io.jooby.junit.ServerTest;
import io.jooby.junit.ServerTestRunner;
import java.util.Map;
import okhttp3.FormBody;
import org.junit.jupiter.api.Assertions;

class IssueBodyVsForm {

  @ServerTest
  public void formDataAndQueryParameters(ServerTestRunner runner) {
    runner
        .define(
            app ->
                app.post(
                    "/",
                    ctx -> {
                        try {
                            Assertions.assertAll(() -> {
                                Assertions.assertEquals(1, ctx.form().size(), "form contains one entry");
                                Assertions.assertTrue(ctx.form().isPresent());
                                Assertions.assertFalse(ctx.form().isMissing());
                                Assertions.assertEquals("bar", ctx.form().get("foo").value());
                                Assertions.assertEquals("bar", ctx.form("foo").value());
                                Assertions.assertEquals("bar", ctx.form().toMap().get("foo"));
                                Assertions.assertEquals("bar", ctx.formMap().get("foo"));

                                Assertions.assertEquals("?parameter1=value1", ctx.query().queryString());
                                Assertions.assertEquals("parameter1=value1", ctx.query().value());
                                Assertions.assertEquals("value1", ctx.query("parameter1").value());
                                Assertions.assertEquals("value1", ctx.queryMap().get("parameter1"));
                                Assertions.assertEquals(1, ctx.queryMap().size());
                            });
                            return "OK";
                        } catch (Exception ex){
                            ex.printStackTrace();
                            ctx.setResponseCode(500);
                            return ex.getMessage();
                        }
                    }))
        .ready(
            http ->
                http
                    .post(
                        "/",
                        new FormBody.Builder().add("foo", "bar").build(),
                        Map.of("parameter1", "value1"),
                        rsp -> {
                            Assertions.assertEquals("OK", rsp.body().string());
                            Assertions.assertEquals(200, rsp.code());
                        }));
  }

  @ServerTest
  public void readFormDataBeforeBody(ServerTestRunner runner) {
    runner
        .define(
            app ->
                app.post(
                    "/",
                    ctx -> {
                        try {
                            Assertions.assertAll(() -> {
                                Assertions.assertEquals(1, ctx.form().size(), "form contains one entry");
                                Assertions.assertTrue(ctx.form().isPresent());
                                Assertions.assertFalse(ctx.form().isMissing());
                                Assertions.assertEquals("bar", ctx.form().get("foo").value());
                                Assertions.assertEquals("bar", ctx.form("foo").value());
                                Assertions.assertEquals("bar", ctx.form().toMap().get("foo"));
                                Assertions.assertEquals("bar", ctx.formMap().get("foo"));

                                // get body().value() after calling form methods
                                Assertions.assertThrows(MissingValueException.class, () -> ctx.body().value());
                            });
                            return "OK";
                        } catch (Exception ex){
                            ex.printStackTrace();
                            ctx.setResponseCode(500);
                            return ex.getMessage();
                        }
                    }))
        .ready(
            http ->
                http
                    .post(
                        "/",
                        new FormBody.Builder().add("foo", "bar").build(),
                        rsp -> {
                            Assertions.assertEquals("OK", rsp.body().string());
                            Assertions.assertEquals(200, rsp.code());
                        }));
  }

  @ServerTest
  public void readFormDataAfterBody(ServerTestRunner runner) {
    runner
        .define(
            app ->
                app.post(
                    "/",
                    ctx -> {
                        try {
                            Assertions.assertAll(() -> {
                                // get body().value() before calling form methods
                                Assertions.assertThrows(MissingValueException.class, () -> ctx.body().value());

                                Assertions.assertEquals(1, ctx.form().size(), "form contains one entry");
                                Assertions.assertTrue(ctx.form().isPresent());
                                Assertions.assertFalse(ctx.form().isMissing());
                                Assertions.assertEquals("bar", ctx.form().get("foo").value());
                                Assertions.assertEquals("bar", ctx.form("foo").value());
                                Assertions.assertEquals("bar", ctx.form().toMap().get("foo"));
                                Assertions.assertEquals("bar", ctx.formMap().get("foo"));
                            });
                            return "OK";
                        } catch (Exception ex){
                            ex.printStackTrace();
                            ctx.setResponseCode(500);
                            return ex.getMessage();
                        }
                    }))
        .ready(
            http ->
                http
                    .post(
                        "/",
                        new FormBody.Builder().add("foo", "bar").build(),
                        rsp -> {
                          Assertions.assertEquals("OK", rsp.body().string());
                          Assertions.assertEquals(200, rsp.code());
                        }));
  }
}
Ngôn ngữ chính
Java
Star
1.8k
Fork
207
Merge trung bình
1 ngày 8 giờ
Pull request đã merge (30 ngày)
20

Chuẩn bị môi trường

  • Có Dockerfile hoặc tệp Docker Compose
  • Không có mẫu pull request
  • Không có hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của jooby-project/jooby

Tất cả issue của jooby-project/jooby

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.