diff --git a/playwright/src/main/java/com/microsoft/playwright/APIRequestContext.java b/playwright/src/main/java/com/microsoft/playwright/APIRequestContext.java index e568b817..768a3714 100644 --- a/playwright/src/main/java/com/microsoft/playwright/APIRequestContext.java +++ b/playwright/src/main/java/com/microsoft/playwright/APIRequestContext.java @@ -16,6 +16,7 @@ package com.microsoft.playwright; +import com.microsoft.playwright.options.*; import java.nio.file.Path; import java.util.*; @@ -26,752 +27,6 @@ import java.util.*; * logged in and vice versa. */ public interface APIRequestContext { - class DeleteOptions { - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public Object data; - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public Boolean failOnStatusCode; - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public Map form; - /** - * Allows to set HTTP headers. - */ - public Map headers; - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public Boolean ignoreHTTPSErrors; - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public Map multipart; - /** - * Query parameters to be sent with the URL. - */ - public Map params; - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public Double timeout; - - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public DeleteOptions setData(String data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public DeleteOptions setData(byte[] data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public DeleteOptions setData(Object data) { - this.data = data; - return this; - } - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public DeleteOptions setFailOnStatusCode(boolean failOnStatusCode) { - this.failOnStatusCode = failOnStatusCode; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public DeleteOptions setForm(Map form) { - this.form = form; - return this; - } - /** - * Allows to set HTTP headers. - */ - public DeleteOptions setHeaders(Map headers) { - this.headers = headers; - return this; - } - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public DeleteOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { - this.ignoreHTTPSErrors = ignoreHTTPSErrors; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public DeleteOptions setMultipart(Map multipart) { - this.multipart = multipart; - return this; - } - /** - * Query parameters to be sent with the URL. - */ - public DeleteOptions setParams(Map params) { - this.params = params; - return this; - } - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public DeleteOptions setTimeout(double timeout) { - this.timeout = timeout; - return this; - } - } - class FetchOptions { - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public Object data; - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public Boolean failOnStatusCode; - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public Map form; - /** - * Allows to set HTTP headers. - */ - public Map headers; - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public Boolean ignoreHTTPSErrors; - /** - * If set changes the fetch method (e.g. PUT or - * POST). If not specified, GET method is - * used. - */ - public String method; - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public Map multipart; - /** - * Query parameters to be sent with the URL. - */ - public Map params; - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public Double timeout; - - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public FetchOptions setData(String data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public FetchOptions setData(byte[] data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public FetchOptions setData(Object data) { - this.data = data; - return this; - } - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public FetchOptions setFailOnStatusCode(boolean failOnStatusCode) { - this.failOnStatusCode = failOnStatusCode; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public FetchOptions setForm(Map form) { - this.form = form; - return this; - } - /** - * Allows to set HTTP headers. - */ - public FetchOptions setHeaders(Map headers) { - this.headers = headers; - return this; - } - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public FetchOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { - this.ignoreHTTPSErrors = ignoreHTTPSErrors; - return this; - } - /** - * If set changes the fetch method (e.g. PUT or - * POST). If not specified, GET method is - * used. - */ - public FetchOptions setMethod(String method) { - this.method = method; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public FetchOptions setMultipart(Map multipart) { - this.multipart = multipart; - return this; - } - /** - * Query parameters to be sent with the URL. - */ - public FetchOptions setParams(Map params) { - this.params = params; - return this; - } - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public FetchOptions setTimeout(double timeout) { - this.timeout = timeout; - return this; - } - } - class GetOptions { - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public Boolean failOnStatusCode; - /** - * Allows to set HTTP headers. - */ - public Map headers; - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public Boolean ignoreHTTPSErrors; - /** - * Query parameters to be sent with the URL. - */ - public Map params; - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public Double timeout; - - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public GetOptions setFailOnStatusCode(boolean failOnStatusCode) { - this.failOnStatusCode = failOnStatusCode; - return this; - } - /** - * Allows to set HTTP headers. - */ - public GetOptions setHeaders(Map headers) { - this.headers = headers; - return this; - } - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public GetOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { - this.ignoreHTTPSErrors = ignoreHTTPSErrors; - return this; - } - /** - * Query parameters to be sent with the URL. - */ - public GetOptions setParams(Map params) { - this.params = params; - return this; - } - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public GetOptions setTimeout(double timeout) { - this.timeout = timeout; - return this; - } - } - class HeadOptions { - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public Boolean failOnStatusCode; - /** - * Allows to set HTTP headers. - */ - public Map headers; - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public Boolean ignoreHTTPSErrors; - /** - * Query parameters to be sent with the URL. - */ - public Map params; - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public Double timeout; - - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public HeadOptions setFailOnStatusCode(boolean failOnStatusCode) { - this.failOnStatusCode = failOnStatusCode; - return this; - } - /** - * Allows to set HTTP headers. - */ - public HeadOptions setHeaders(Map headers) { - this.headers = headers; - return this; - } - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public HeadOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { - this.ignoreHTTPSErrors = ignoreHTTPSErrors; - return this; - } - /** - * Query parameters to be sent with the URL. - */ - public HeadOptions setParams(Map params) { - this.params = params; - return this; - } - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public HeadOptions setTimeout(double timeout) { - this.timeout = timeout; - return this; - } - } - class PatchOptions { - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public Object data; - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public Boolean failOnStatusCode; - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public Map form; - /** - * Allows to set HTTP headers. - */ - public Map headers; - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public Boolean ignoreHTTPSErrors; - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public Map multipart; - /** - * Query parameters to be sent with the URL. - */ - public Map params; - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public Double timeout; - - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PatchOptions setData(String data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PatchOptions setData(byte[] data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PatchOptions setData(Object data) { - this.data = data; - return this; - } - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public PatchOptions setFailOnStatusCode(boolean failOnStatusCode) { - this.failOnStatusCode = failOnStatusCode; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public PatchOptions setForm(Map form) { - this.form = form; - return this; - } - /** - * Allows to set HTTP headers. - */ - public PatchOptions setHeaders(Map headers) { - this.headers = headers; - return this; - } - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public PatchOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { - this.ignoreHTTPSErrors = ignoreHTTPSErrors; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public PatchOptions setMultipart(Map multipart) { - this.multipart = multipart; - return this; - } - /** - * Query parameters to be sent with the URL. - */ - public PatchOptions setParams(Map params) { - this.params = params; - return this; - } - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public PatchOptions setTimeout(double timeout) { - this.timeout = timeout; - return this; - } - } - class PostOptions { - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public Object data; - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public Boolean failOnStatusCode; - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public Map form; - /** - * Allows to set HTTP headers. - */ - public Map headers; - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public Boolean ignoreHTTPSErrors; - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public Map multipart; - /** - * Query parameters to be sent with the URL. - */ - public Map params; - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public Double timeout; - - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PostOptions setData(String data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PostOptions setData(byte[] data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PostOptions setData(Object data) { - this.data = data; - return this; - } - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public PostOptions setFailOnStatusCode(boolean failOnStatusCode) { - this.failOnStatusCode = failOnStatusCode; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public PostOptions setForm(Map form) { - this.form = form; - return this; - } - /** - * Allows to set HTTP headers. - */ - public PostOptions setHeaders(Map headers) { - this.headers = headers; - return this; - } - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public PostOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { - this.ignoreHTTPSErrors = ignoreHTTPSErrors; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public PostOptions setMultipart(Map multipart) { - this.multipart = multipart; - return this; - } - /** - * Query parameters to be sent with the URL. - */ - public PostOptions setParams(Map params) { - this.params = params; - return this; - } - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public PostOptions setTimeout(double timeout) { - this.timeout = timeout; - return this; - } - } - class PutOptions { - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public Object data; - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public Boolean failOnStatusCode; - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public Map form; - /** - * Allows to set HTTP headers. - */ - public Map headers; - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public Boolean ignoreHTTPSErrors; - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public Map multipart; - /** - * Query parameters to be sent with the URL. - */ - public Map params; - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public Double timeout; - - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PutOptions setData(String data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PutOptions setData(byte[] data) { - this.data = data; - return this; - } - /** - * Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and - * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will - * be set to {@code application/octet-stream} if not explicitly set. - */ - public PutOptions setData(Object data) { - this.data = data; - return this; - } - /** - * Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. - */ - public PutOptions setFailOnStatusCode(boolean failOnStatusCode) { - this.failOnStatusCode = failOnStatusCode; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as - * this request body. If this parameter is specified {@code content-type} header will be set to - * {@code application/x-www-form-urlencoded} unless explicitly provided. - */ - public PutOptions setForm(Map form) { - this.form = form; - return this; - } - /** - * Allows to set HTTP headers. - */ - public PutOptions setHeaders(Map headers) { - this.headers = headers; - return this; - } - /** - * Whether to ignore HTTPS errors when sending network requests. Defaults to {@code false}. - */ - public PutOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { - this.ignoreHTTPSErrors = ignoreHTTPSErrors; - return this; - } - /** - * Provides an object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this request - * body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless explicitly - * provided. File values can be passed either as [File] or as file-like object [FilePayload] containing file name, - * mime-type and its content. - */ - public PutOptions setMultipart(Map multipart) { - this.multipart = multipart; - return this; - } - /** - * Query parameters to be sent with the URL. - */ - public PutOptions setParams(Map params) { - this.params = params; - return this; - } - /** - * Request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. - */ - public PutOptions setTimeout(double timeout) { - this.timeout = timeout; - return this; - } - } class StorageStateOptions { /** * The file path to save the storage state to. If {@code path} is a relative path, then it is resolved relative to current @@ -804,8 +59,9 @@ public interface APIRequestContext { * The method will automatically follow redirects. * * @param url Target URL. + * @param params Optional request parameters. */ - APIResponse delete(String url, DeleteOptions options); + APIResponse delete(String url, RequestOptions params); /** * All responses returned by {@link APIRequestContext#get APIRequestContext.get()} and similar methods are stored in the * memory, so that you can later call {@link APIResponse#body APIResponse.body()}. This method discards all stored @@ -826,8 +82,9 @@ public interface APIRequestContext { * context cookies from the response. The method will automatically follow redirects. * * @param urlOrRequest Target URL or Request to get all parameters from. + * @param params Optional request parameters. */ - APIResponse fetch(String urlOrRequest, FetchOptions options); + APIResponse fetch(String urlOrRequest, RequestOptions params); /** * Sends HTTP(S) request and returns its response. The method will populate request cookies from the context and update * context cookies from the response. The method will automatically follow redirects. @@ -842,8 +99,9 @@ public interface APIRequestContext { * context cookies from the response. The method will automatically follow redirects. * * @param urlOrRequest Target URL or Request to get all parameters from. + * @param params Optional request parameters. */ - APIResponse fetch(Request urlOrRequest, FetchOptions options); + APIResponse fetch(Request urlOrRequest, RequestOptions params); /** * Sends HTTP(S) GET request and returns its * response. The method will populate request cookies from the context and update context cookies from the response. The @@ -860,8 +118,9 @@ public interface APIRequestContext { * method will automatically follow redirects. * * @param url Target URL. + * @param params Optional request parameters. */ - APIResponse get(String url, GetOptions options); + APIResponse get(String url, RequestOptions params); /** * Sends HTTP(S) HEAD request and returns its * response. The method will populate request cookies from the context and update context cookies from the response. The @@ -878,8 +137,9 @@ public interface APIRequestContext { * method will automatically follow redirects. * * @param url Target URL. + * @param params Optional request parameters. */ - APIResponse head(String url, HeadOptions options); + APIResponse head(String url, RequestOptions params); /** * Sends HTTP(S) PATCH request and returns * its response. The method will populate request cookies from the context and update context cookies from the response. @@ -896,8 +156,9 @@ public interface APIRequestContext { * The method will automatically follow redirects. * * @param url Target URL. + * @param params Optional request parameters. */ - APIResponse patch(String url, PatchOptions options); + APIResponse patch(String url, RequestOptions params); /** * Sends HTTP(S) POST request and returns its * response. The method will populate request cookies from the context and update context cookies from the response. The @@ -914,8 +175,9 @@ public interface APIRequestContext { * method will automatically follow redirects. * * @param url Target URL. + * @param params Optional request parameters. */ - APIResponse post(String url, PostOptions options); + APIResponse post(String url, RequestOptions params); /** * Sends HTTP(S) PUT request and returns its * response. The method will populate request cookies from the context and update context cookies from the response. The @@ -932,8 +194,9 @@ public interface APIRequestContext { * method will automatically follow redirects. * * @param url Target URL. + * @param params Optional request parameters. */ - APIResponse put(String url, PutOptions options); + APIResponse put(String url, RequestOptions params); /** * Returns storage state for this request context, contains current cookies and local storage snapshot if it was passed to * the constructor. diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/APIRequestContextImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/APIRequestContextImpl.java index f0b89ad5..be9b1370 100644 --- a/playwright/src/main/java/com/microsoft/playwright/impl/APIRequestContextImpl.java +++ b/playwright/src/main/java/com/microsoft/playwright/impl/APIRequestContextImpl.java @@ -8,6 +8,7 @@ import com.microsoft.playwright.APIResponse; import com.microsoft.playwright.PlaywrightException; import com.microsoft.playwright.Request; import com.microsoft.playwright.options.FilePayload; +import com.microsoft.playwright.options.RequestOptions; import java.io.File; import java.nio.charset.StandardCharsets; @@ -17,7 +18,6 @@ import java.util.LinkedHashMap; import java.util.Map; import static com.microsoft.playwright.impl.Serialization.*; -import static com.microsoft.playwright.impl.Utils.convertType; import static com.microsoft.playwright.impl.Utils.toFilePayload; class APIRequestContextImpl extends ChannelOwner implements APIRequestContext { @@ -26,10 +26,8 @@ class APIRequestContextImpl extends ChannelOwner implements APIRequestContext { } @Override - public APIResponse delete(String url, DeleteOptions options) { - FetchOptions fetchOptions = toFetchOptions(options); - fetchOptions.method = "DELETE"; - return fetch(url, fetchOptions); + public APIResponse delete(String url, RequestOptions options) { + return fetch(url, ensureOptions(options, "DELETE")); } @Override @@ -38,14 +36,15 @@ class APIRequestContextImpl extends ChannelOwner implements APIRequestContext { } @Override - public APIResponse fetch(String urlOrRequest, FetchOptions options) { - return withLogging("APIRequestContext.fetch", () -> fetchImpl(urlOrRequest, options)); + public APIResponse fetch(String urlOrRequest, RequestOptions options) { + return withLogging("APIRequestContext.fetch", () -> fetchImpl(urlOrRequest, (RequestOptionsImpl) options)); } @Override - public APIResponse fetch(Request request, FetchOptions options) { + public APIResponse fetch(Request request, RequestOptions optionsArg) { + RequestOptionsImpl options = (RequestOptionsImpl) optionsArg; if (options == null) { - options = new FetchOptions(); + options = new RequestOptionsImpl(); } if (options.method == null) { options.method = request.method(); @@ -59,9 +58,9 @@ class APIRequestContextImpl extends ChannelOwner implements APIRequestContext { return fetch(request.url(), options); } - private APIResponse fetchImpl(String url, FetchOptions options) { + private APIResponse fetchImpl(String url, RequestOptionsImpl options) { if (options == null) { - options = new FetchOptions(); + options = new RequestOptionsImpl(); } JsonObject params = new JsonObject(); params.addProperty("url", url); @@ -94,10 +93,10 @@ class APIRequestContextImpl extends ChannelOwner implements APIRequestContext { } } if (options.form != null) { - params.add("formData", toNameValueArray(options.form)); + params.add("formData", toNameValueArray(options.form.fields)); } if (options.multipart != null) { - params.add("multipartData", serializeMultipartData(options.multipart)); + params.add("multipartData", serializeMultipartData(options.multipart.fields)); } if (options.timeout != null) { params.addProperty("timeout", options.timeout); @@ -151,38 +150,28 @@ class APIRequestContextImpl extends ChannelOwner implements APIRequestContext { } @Override - public APIResponse get(String url, GetOptions options) { - FetchOptions fetchOptions = toFetchOptions(options); - fetchOptions.method = "GET"; - return fetch(url, fetchOptions); + public APIResponse get(String url, RequestOptions options) { + return fetch(url, ensureOptions(options, "GET")); } @Override - public APIResponse head(String url, HeadOptions options) { - FetchOptions fetchOptions = toFetchOptions(options); - fetchOptions.method = "HEAD"; - return fetch(url, fetchOptions); + public APIResponse head(String url, RequestOptions options) { + return fetch(url, ensureOptions(options, "HEAD")); } @Override - public APIResponse patch(String url, PatchOptions options) { - FetchOptions fetchOptions = toFetchOptions(options); - fetchOptions.method = "PATCH"; - return fetch(url, fetchOptions); + public APIResponse patch(String url, RequestOptions options) { + return fetch(url, ensureOptions(options, "PATCH")); } @Override - public APIResponse post(String url, PostOptions options) { - FetchOptions fetchOptions = toFetchOptions(options); - fetchOptions.method = "POST"; - return fetch(url, fetchOptions); + public APIResponse post(String url, RequestOptions options) { + return fetch(url, ensureOptions(options, "POST")); } @Override - public APIResponse put(String url, PutOptions options) { - FetchOptions fetchOptions = toFetchOptions(options); - fetchOptions.method = "PUT"; - return fetch(url, fetchOptions); + public APIResponse put(String url, RequestOptions options) { + return fetch(url, ensureOptions(options, "PUT")); } @Override @@ -197,11 +186,14 @@ class APIRequestContextImpl extends ChannelOwner implements APIRequestContext { }); } - private static FetchOptions toFetchOptions(T options) { - FetchOptions fetchOptions = convertType(options, FetchOptions.class); - if (fetchOptions == null) { - fetchOptions = new FetchOptions(); + private static RequestOptionsImpl ensureOptions(RequestOptions options, String method) { + RequestOptionsImpl impl = (RequestOptionsImpl) options; + if (impl == null) { + impl = new RequestOptionsImpl(); } - return fetchOptions; + if (impl.method == null) { + impl.method = method; + } + return impl; } } diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/FormDataImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/FormDataImpl.java new file mode 100644 index 00000000..4b2a135d --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/impl/FormDataImpl.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.impl; + +import com.microsoft.playwright.options.FilePayload; +import com.microsoft.playwright.options.FormData; + +import java.nio.file.Path; +import java.util.LinkedHashMap; +import java.util.Map; + +public class FormDataImpl implements FormData { + Map fields = new LinkedHashMap<>(); + + @Override + public FormData set(String name, String value) { + fields.put(name, value); + return this; + } + + @Override + public FormData set(String name, boolean value) { + fields.put(name, value); + return this; + } + + @Override + public FormData set(String name, int value) { + fields.put(name, value); + return this; + } + + @Override + public FormData set(String name, Path value) { + fields.put(name, value); + return this; + } + + @Override + public FormData set(String name, FilePayload value) { + fields.put(name, value); + return this; + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/impl/RequestOptionsImpl.java b/playwright/src/main/java/com/microsoft/playwright/impl/RequestOptionsImpl.java new file mode 100644 index 00000000..0e6eb982 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/impl/RequestOptionsImpl.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.impl; + +import com.microsoft.playwright.options.FormData; +import com.microsoft.playwright.options.RequestOptions; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class RequestOptionsImpl implements RequestOptions { + Map params; + String method; + Map headers; + Object data; + FormDataImpl form; + FormDataImpl multipart; + Boolean failOnStatusCode; + Boolean ignoreHTTPSErrors; + Double timeout; + + @Override + public RequestOptions setHeader(String name, String value) { + if (headers == null) { + headers = new LinkedHashMap<>(); + } + headers.put(name, value); + return this; + } + + @Override + public RequestOptions setData(String data) { + this.data = data; + return this; + } + + @Override + public RequestOptions setData(byte[] data) { + this.data = data; + return this; + } + + @Override + public RequestOptions setData(Object data) { + this.data = data; + return this; + } + + @Override + public RequestOptions setForm(FormData form) { + this.form = (FormDataImpl) form; + return this; + } + + @Override + public RequestOptions setMethod(String method) { + this.method = method; + return this; + } + + @Override + public RequestOptions setMultipart(FormData form) { + this.multipart = (FormDataImpl) form; + return this; + } + + @Override + public RequestOptions setQueryParam(String name, String value) { + return setQueryParamImpl(name, value); + } + + @Override + public RequestOptions setQueryParam(String name, boolean value) { + return setQueryParamImpl(name, value); + } + + @Override + public RequestOptions setQueryParam(String name, int value) { + return setQueryParamImpl(name, value); + } + + private RequestOptions setQueryParamImpl(String name, Object value) { + if (params == null) { + params = new LinkedHashMap<>(); + } + params.put(name, value); + return this; + } + + @Override + public RequestOptions setTimeout(double timeout) { + this.timeout = timeout; + return this; + } + + @Override + public RequestOptions setFailOnStatusCode(boolean failOnStatusCode) { + this.failOnStatusCode = failOnStatusCode; + return this; + } + + @Override + public RequestOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors) { + this.ignoreHTTPSErrors = ignoreHTTPSErrors; + return this; + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/options/FormData.java b/playwright/src/main/java/com/microsoft/playwright/options/FormData.java new file mode 100644 index 00000000..1731f184 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/options/FormData.java @@ -0,0 +1,78 @@ +/* + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.options; + +import com.microsoft.playwright.impl.FormDataImpl; +import java.nio.file.Path; +import java.util.*; + +/** + * The {@code FormData} is used create form data that is sent via {@code APIRequestContext}. + *
{@code
+ * import com.microsoft.playwright.options.FormData;
+ * ...
+ * FormData form = FormData.create()
+ *     .set("firstName", "John")
+ *     .set("lastName", "Doe")
+ *     .set("age", 30);
+ * page.request().post("http://localhost/submit", RequestOptions.create().setForm(form));
+ * }
+ */ +public interface FormData { + /** + * Creates new instance of {@code FormData}. + */ + static FormData create() { + return new FormDataImpl(); + } + /** + * Sets a field on the form. File values can be passed either as {@code Path} or as {@code FilePayload}. + * + * @param name Field name. + * @param value Field value. + */ + FormData set(String name, String value); + /** + * Sets a field on the form. File values can be passed either as {@code Path} or as {@code FilePayload}. + * + * @param name Field name. + * @param value Field value. + */ + FormData set(String name, boolean value); + /** + * Sets a field on the form. File values can be passed either as {@code Path} or as {@code FilePayload}. + * + * @param name Field name. + * @param value Field value. + */ + FormData set(String name, int value); + /** + * Sets a field on the form. File values can be passed either as {@code Path} or as {@code FilePayload}. + * + * @param name Field name. + * @param value Field value. + */ + FormData set(String name, Path value); + /** + * Sets a field on the form. File values can be passed either as {@code Path} or as {@code FilePayload}. + * + * @param name Field name. + * @param value Field value. + */ + FormData set(String name, FilePayload value); +} + diff --git a/playwright/src/main/java/com/microsoft/playwright/options/RequestOptions.java b/playwright/src/main/java/com/microsoft/playwright/options/RequestOptions.java new file mode 100644 index 00000000..c601926b --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/options/RequestOptions.java @@ -0,0 +1,134 @@ +/* + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.microsoft.playwright.options; + +import com.microsoft.playwright.impl.RequestOptionsImpl; +import java.util.*; + +/** + * The {@code RequestOptions} allows to create form data to be sent via {@code APIRequestContext}. + *
{@code
+ * context.request().post(
+ *   "https://example.com/submit",
+ *   RequestOptions.create()
+ *     .setQueryParam("page", 1)
+ *     .setData("My data"));
+ * }
+ */ +public interface RequestOptions { + /** + * Creates new instance of {@code RequestOptions}. + */ + static RequestOptions create() { + return new RequestOptionsImpl(); + } + /** + * Sets the request's post data. + * + * @param data Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and + * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will + * be set to {@code application/octet-stream} if not explicitly set. + */ + RequestOptions setData(String data); + /** + * Sets the request's post data. + * + * @param data Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and + * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will + * be set to {@code application/octet-stream} if not explicitly set. + */ + RequestOptions setData(byte[] data); + /** + * Sets the request's post data. + * + * @param data Allows to set post data of the request. If the data parameter is an object, it will be serialized to json string and + * {@code content-type} header will be set to {@code application/json} if not explicitly set. Otherwise the {@code content-type} header will + * be set to {@code application/octet-stream} if not explicitly set. + */ + RequestOptions setData(Object data); + /** + * + * + * @param failOnStatusCode Whether to throw on response codes other than 2xx and 3xx. By default response object is returned for all status codes. + */ + RequestOptions setFailOnStatusCode(boolean failOnStatusCode); + /** + * Provides {@code FormData} object that will be serialized as html form using {@code application/x-www-form-urlencoded} encoding and + * sent as this request body. If this parameter is specified {@code content-type} header will be set to + * {@code application/x-www-form-urlencoded} unless explicitly provided. + * + * @param form Form data to be serialized as html form using {@code application/x-www-form-urlencoded} encoding and sent as this request + * body. + */ + RequestOptions setForm(FormData form); + /** + * Sets an HTTP header to the request. + * + * @param name Header name. + * @param value Header value. + */ + RequestOptions setHeader(String name, String value); + /** + * + * + * @param ignoreHTTPSErrors Whether to ignore HTTPS errors when sending network requests. + */ + RequestOptions setIgnoreHTTPSErrors(boolean ignoreHTTPSErrors); + /** + * Changes the request method (e.g. PUT or POST). + * + * @param method Request method, e.g. POST. + */ + RequestOptions setMethod(String method); + /** + * Provides {@code FormData} object that will be serialized as html form using {@code multipart/form-data} encoding and sent as this + * request body. If this parameter is specified {@code content-type} header will be set to {@code multipart/form-data} unless + * explicitly provided. + * + * @param form Form data to be serialized as html form using {@code multipart/form-data} encoding and sent as this request body. + */ + RequestOptions setMultipart(FormData form); + /** + * Adds a query parameter to the request URL. + * + * @param name Parameter name. + * @param value Parameter value. + */ + RequestOptions setQueryParam(String name, String value); + /** + * Adds a query parameter to the request URL. + * + * @param name Parameter name. + * @param value Parameter value. + */ + RequestOptions setQueryParam(String name, boolean value); + /** + * Adds a query parameter to the request URL. + * + * @param name Parameter name. + * @param value Parameter value. + */ + RequestOptions setQueryParam(String name, int value); + /** + * Sets request timeout in milliseconds. Defaults to {@code 30000} (30 seconds). Pass {@code 0} to disable timeout. + * + * @param timeout Request timeout in milliseconds. + */ + RequestOptions setTimeout(double timeout); +} + diff --git a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextFetch.java b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextFetch.java index 628d3aff..fe883389 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextFetch.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestBrowserContextFetch.java @@ -1,10 +1,7 @@ package com.microsoft.playwright; import com.google.gson.Gson; -import com.microsoft.playwright.options.Cookie; -import com.microsoft.playwright.options.FilePayload; -import com.microsoft.playwright.options.HttpHeader; -import com.microsoft.playwright.options.SameSiteAttribute; +import com.microsoft.playwright.options.*; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -128,7 +125,7 @@ public class TestBrowserContextFetch extends TestBase { void getShouldSupportQueryParams() throws ExecutionException, InterruptedException { Future req = server.futureRequest("/empty.html"); context.request().get(server.EMPTY_PAGE + "?p1=foo", - new APIRequestContext.GetOptions().setParams(mapOf("p1", "v1", "парам2", "знач2"))); + RequestOptions.create().setQueryParam("p1", "v1").setQueryParam("парам2", "знач2")); assertNotNull(req.get()); assertEquals("/empty.html?p1=v1&%D0%BF%D0%B0%D1%80%D0%B0%D0%BC2=%D0%B7%D0%BD%D0%B0%D1%872", req.get().url); } @@ -138,7 +135,7 @@ public class TestBrowserContextFetch extends TestBase { @Test void getShouldSupportFailOnStatusCode() { try { - context.request().get(server.PREFIX + "/does-not-exist.html", new APIRequestContext.GetOptions().setFailOnStatusCode(true)); + context.request().get(server.PREFIX + "/does-not-exist.html", RequestOptions.create().setFailOnStatusCode(true)); fail("did not throw"); } catch (PlaywrightException e) { assertTrue(e.getMessage().contains("404 Not Found"), e.getMessage()); @@ -148,7 +145,7 @@ public class TestBrowserContextFetch extends TestBase { @Test @Disabled("Error: socket hang up") void getShouldSupportIgnoreHTTPSErrorsOption() { - APIResponse response = context.request().get(httpsServer.EMPTY_PAGE, new APIRequestContext.GetOptions().setIgnoreHTTPSErrors(true)); + APIResponse response = context.request().get(httpsServer.EMPTY_PAGE, RequestOptions.create().setIgnoreHTTPSErrors(true)); assertEquals(200, response.status()); } @@ -163,7 +160,7 @@ public class TestBrowserContextFetch extends TestBase { cookie.sameSite = SameSiteAttribute.LAX; context.addCookies(asList(cookie)); Future req = server.futureRequest("/empty.html"); - context.request().get(server.EMPTY_PAGE, new APIRequestContext.GetOptions().setHeaders(mapOf("Cookie", "foo=bar"))); + context.request().get(server.EMPTY_PAGE, RequestOptions.create().setHeader("Cookie", "foo=bar")); assertEquals(asList("foo=bar"), req.get().headers.get("cookie")); } @@ -235,9 +232,8 @@ public class TestBrowserContextFetch extends TestBase { String base64 = Base64.getEncoder().encodeToString("user:pass".getBytes(StandardCharsets.UTF_8));; Future request = server.futureRequest("/empty.html"); - APIResponse response = context.request().get(server.EMPTY_PAGE, new APIRequestContext.GetOptions().setHeaders( - mapOf("authorization", "Basic " + base64) - )); + APIResponse response = context.request().get(server.EMPTY_PAGE, RequestOptions.create() + .setHeader("authorization", "Basic " + base64)); assertEquals(200, response.status()); assertEquals("/empty.html", request.get().url); } @@ -269,7 +265,7 @@ public class TestBrowserContextFetch extends TestBase { void postShouldSupportPostData() throws ExecutionException, InterruptedException { Future request = server.futureRequest("/simple.json"); APIResponse response = context.request().post(server.PREFIX + "/simple.json", - new APIRequestContext.PostOptions().setData("My request")); + RequestOptions.create().setData("My request")); assertEquals("POST", request.get().method); assertEquals("My request", new String(request.get().postBody)); assertEquals(200, response.status()); @@ -280,7 +276,7 @@ public class TestBrowserContextFetch extends TestBase { void deleteShouldSupportPostData() throws ExecutionException, InterruptedException { Future request = server.futureRequest("/simple.json"); APIResponse response = context.request().delete(server.PREFIX + "/simple.json", - new APIRequestContext.DeleteOptions().setData("My request")); + RequestOptions.create().setData("My request")); assertEquals("DELETE", request.get().method); assertEquals("My request", new String(request.get().postBody)); assertEquals(200, response.status()); @@ -291,7 +287,7 @@ public class TestBrowserContextFetch extends TestBase { void patchShouldSupportPostData() throws ExecutionException, InterruptedException { Future request = server.futureRequest("/simple.json"); APIResponse response = context.request().patch(server.PREFIX + "/simple.json", - new APIRequestContext.PatchOptions().setData("My request")); + RequestOptions.create().setData("My request")); assertEquals("PATCH", request.get().method); assertEquals("My request", new String(request.get().postBody)); assertEquals(200, response.status()); @@ -302,7 +298,7 @@ public class TestBrowserContextFetch extends TestBase { void putShouldSupportPostData() throws ExecutionException, InterruptedException { Future request = server.futureRequest("/simple.json"); APIResponse response = context.request().put(server.PREFIX + "/simple.json", - new APIRequestContext.PutOptions().setData("My request")); + RequestOptions.create().setData("My request")); assertEquals("PUT", request.get().method); assertEquals("My request", new String(request.get().postBody)); assertEquals(200, response.status()); @@ -328,7 +324,7 @@ public class TestBrowserContextFetch extends TestBase { bytes[i] = (byte) i; } Future request = server.futureRequest("/empty.html"); - context.request().post(server.EMPTY_PAGE, new APIRequestContext.PostOptions().setData(bytes)); + context.request().post(server.EMPTY_PAGE, RequestOptions.create().setData(bytes)); assertEquals(asList("256"), request.get().headers.get("content-length")); assertEquals(asList("application/octet-stream"), request.get().headers.get("content-type")); } @@ -348,12 +344,11 @@ public class TestBrowserContextFetch extends TestBase { @Test void shouldAllowToOverrideDefaultHeaders() throws ExecutionException, InterruptedException { Future request = server.futureRequest("/empty.html"); - context.request().get(server.EMPTY_PAGE, new APIRequestContext.GetOptions().setHeaders( - mapOf( - "User-Agent", "Playwright", - "Accept", "text/html", - "Accept-Encoding", "br" - ))); + context.request().get(server.EMPTY_PAGE, RequestOptions.create() + .setHeader( + "User-Agent", "Playwright") + .setHeader("Accept", "text/html") + .setHeader("Accept-Encoding", "br")); assertEquals(asList("text/html"), request.get().headers.get("accept")); assertEquals(asList("Playwright"), request.get().headers.get("user-agent")); assertEquals(asList("br"), request.get().headers.get("accept-encoding")); @@ -366,9 +361,8 @@ public class TestBrowserContextFetch extends TestBase { Future req1 = server.futureRequest("/a/redirect1"); Future req2 = server.futureRequest("/b/c/redirect2"); Future req3 = server.futureRequest("/simple.json"); - context.request().get(server.PREFIX + "/a/redirect1", new APIRequestContext.GetOptions().setHeaders( - mapOf("foo", "bar") - )); + context.request().get(server.PREFIX + "/a/redirect1", + RequestOptions.create().setHeader("foo", "bar")); assertEquals(asList("bar"), req1.get().headers.get("foo")); assertEquals(asList("bar"), req2.get().headers.get("foo")); assertEquals(asList("bar"), req3.get().headers.get("foo")); @@ -392,8 +386,8 @@ public class TestBrowserContextFetch extends TestBase { @Test void shouldThrowOnInvalidHeaderValue() { try { - context.request().get(server.EMPTY_PAGE, new APIRequestContext.GetOptions() - .setHeaders(mapOf("foo", "недопустимое значение"))); + context.request().get(server.EMPTY_PAGE, RequestOptions.create() + .setHeader("foo", "недопустимое значение")); fail("did not throw"); } catch (PlaywrightException e) { assertTrue(e.getMessage().contains("Invalid character in header content"), e.getMessage()); @@ -424,7 +418,7 @@ public class TestBrowserContextFetch extends TestBase { }); try { - context.request().get(server.PREFIX + "/slow", new APIRequestContext.GetOptions().setTimeout(100)); + context.request().get(server.PREFIX + "/slow", RequestOptions.create().setTimeout(100)); fail("did not throw"); } catch (PlaywrightException e) { assertTrue(e.getMessage().contains("Request timed out after 100ms"), e.getMessage()); @@ -446,7 +440,7 @@ public class TestBrowserContextFetch extends TestBase { } }); APIResponse response = context.request().get(server.PREFIX + "/slow", - new APIRequestContext.GetOptions().setTimeout(0)); + RequestOptions.create().setTimeout(0)); assertEquals("done", response.text()); } @@ -497,8 +491,8 @@ public class TestBrowserContextFetch extends TestBase { void shouldOverrideRequestParameters() throws ExecutionException, InterruptedException { Request pageReq = page.waitForRequest("**/*", () -> page.navigate(server.EMPTY_PAGE)); Future req = server.futureRequest("/empty.html"); - context.request().fetch(pageReq, new APIRequestContext.FetchOptions().setMethod("POST") - .setHeaders(mapOf("foo", "bar")) + context.request().fetch(pageReq, RequestOptions.create().setMethod("POST") + .setHeader("foo", "bar") .setData("data")); assertEquals("POST", req.get().method); assertEquals(asList("bar"), req.get().headers.get("foo")); @@ -508,10 +502,11 @@ public class TestBrowserContextFetch extends TestBase { @Test void shouldSupportApplicationXWwwFormUrlencoded() throws ExecutionException, InterruptedException { Future req = server.futureRequest("/empty.html"); - context.request().post(server.EMPTY_PAGE, new APIRequestContext.PostOptions().setForm( - mapOf("firstName", "John", - "lastName", "Doe", - "file", "f.js"))); + context.request().post(server.EMPTY_PAGE, RequestOptions.create().setForm( + FormData.create() + .set("firstName", "John") + .set("lastName", "Doe") + .set("file", "f.js"))); assertEquals("POST", req.get().method); assertEquals(asList("application/x-www-form-urlencoded"), req.get().headers.get("content-type")); @@ -529,7 +524,7 @@ public class TestBrowserContextFetch extends TestBase { "file", mapOf("name", "f.js") ); Future req = server.futureRequest("/empty.html"); - context.request().post(server.EMPTY_PAGE, new APIRequestContext.PostOptions().setData(data)); + context.request().post(server.EMPTY_PAGE, RequestOptions.create().setData(data)); assertEquals("POST", req.get().method); assertEquals(asList("application/json"), req.get().headers.get("content-type")); String body = new String(req.get().postBody); @@ -542,11 +537,11 @@ public class TestBrowserContextFetch extends TestBase { FilePayload file = new FilePayload("f.js", "text/javascript", "var x = 10;\r\n;console.log(x);".getBytes(StandardCharsets.UTF_8)); - APIResponse response = context.request().post(server.EMPTY_PAGE, new APIRequestContext.PostOptions().setMultipart( - mapOf("firstName", "John", - "lastName", "Doe", - "file", file - ))); + APIResponse response = context.request().post(server.EMPTY_PAGE, RequestOptions.create().setMultipart( + FormData.create() + .set("firstName", "John") + .set("lastName", "Doe") + .set("file", file))); assertEquals("POST", serverRequest.get().method); List contentType = serverRequest.get().headers.get("content-type"); @@ -577,11 +572,11 @@ public class TestBrowserContextFetch extends TestBase { try (FileOutputStream output = new FileOutputStream(path.toFile())) { output.write("{\"foo\":\"bar\"}".getBytes(StandardCharsets.UTF_8)); } - APIResponse response = context.request().post(server.EMPTY_PAGE, new APIRequestContext.PostOptions().setMultipart( - mapOf("firstName", "John", - "lastName", "Doe", - "file", path - ))); + APIResponse response = context.request().post(server.EMPTY_PAGE, RequestOptions.create().setMultipart( + FormData.create() + .set("firstName", "John") + .set("lastName", "Doe") + .set("file", path))); assertEquals("POST", serverRequest.get().method); List contentType = serverRequest.get().headers.get("content-type"); @@ -609,8 +604,8 @@ public class TestBrowserContextFetch extends TestBase { "firstName", "John", "lastName", "Doe"); Future req = server.futureRequest("/empty.html"); - context.request().post(server.EMPTY_PAGE, new APIRequestContext.PostOptions() - .setHeaders(mapOf("content-type", "unknown")) + context.request().post(server.EMPTY_PAGE, RequestOptions.create() + .setHeader("content-type", "unknown") .setData(data)); assertEquals("POST", req.get().method); assertEquals(asList("unknown"), req.get().headers.get("content-type")); @@ -621,7 +616,7 @@ public class TestBrowserContextFetch extends TestBase { @Test void shouldThrowWhenDataPassedForUnsupportedRequest() { try { - context.request().fetch(server.EMPTY_PAGE, new APIRequestContext.FetchOptions() + context.request().fetch(server.EMPTY_PAGE, RequestOptions.create() .setMethod("GET").setData("bar")); fail("did not throw"); } catch (PlaywrightException e) { @@ -650,13 +645,12 @@ public class TestBrowserContextFetch extends TestBase { @Test void shouldAcceptBoolAndNumericParams() throws ExecutionException, InterruptedException { Future req = server.futureRequest("/empty.html"); - page.request().get(server.EMPTY_PAGE, new APIRequestContext.GetOptions().setParams(mapOf( - "str", "s", - "num", 10, - "bool", true, - "bool2", false - ))); - assertEquals("/empty.html?str=s&bool2=false&bool=true&num=10", req.get().url); + page.request().get(server.EMPTY_PAGE, RequestOptions.create() + .setQueryParam("str", "s") + .setQueryParam("num", 10) + .setQueryParam("bool", true) + .setQueryParam("bool2", false)); + assertEquals("/empty.html?str=s&num=10&bool=true&bool2=false", req.get().url); } @Test diff --git a/playwright/src/test/java/com/microsoft/playwright/TestGlobalFetch.java b/playwright/src/test/java/com/microsoft/playwright/TestGlobalFetch.java index 989a9a5b..c327ece5 100644 --- a/playwright/src/test/java/com/microsoft/playwright/TestGlobalFetch.java +++ b/playwright/src/test/java/com/microsoft/playwright/TestGlobalFetch.java @@ -2,6 +2,7 @@ package com.microsoft.playwright; import com.google.gson.Gson; import com.microsoft.playwright.options.HttpHeader; +import com.microsoft.playwright.options.RequestOptions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -212,7 +213,7 @@ public class TestGlobalFetch extends TestBase { void shouldPropagateIgnoreHTTPSErrorsOnRedirects() { httpsServer.setRedirect("/redir", "/empty.html"); APIRequestContext request = playwright.request().newContext(); - APIResponse response = request.get(httpsServer.PREFIX + "/redir", new APIRequestContext.GetOptions().setIgnoreHTTPSErrors(true)); + APIResponse response = request.get(httpsServer.PREFIX + "/redir", RequestOptions.create().setIgnoreHTTPSErrors(true)); assertEquals(200, response.status()); } @@ -259,7 +260,7 @@ public class TestGlobalFetch extends TestBase { APIRequestContext request = playwright.request().newContext(); Future req1 = server.futureRequest("/redirect"); Future req2 = server.futureRequest("/empty.html"); - APIResponse result = request.post(server.PREFIX + "/redirect", new APIRequestContext.PostOptions().setData(mapOf("foo", "bar"))); + APIResponse result = request.post(server.PREFIX + "/redirect", RequestOptions.create().setData(mapOf("foo", "bar"))); assertEquals(200, result.status()); assertEquals(asList("13"), req1.get().headers.get("content-length")); @@ -280,7 +281,7 @@ public class TestGlobalFetch extends TestBase { APIRequestContext request = playwright.request().newContext(); for (Object value : values) { Future req = server.futureRequest("/empty.html"); - request.post(server.EMPTY_PAGE, new APIRequestContext.PostOptions().setHeaders(mapOf("content-type", "application/json")).setData(value)); + request.post(server.EMPTY_PAGE, RequestOptions.create().setHeader("content-type", "application/json").setData(value)); byte[] body = req.get().postBody; assertEquals(new Gson().toJson(value), new String(body)); } @@ -293,8 +294,8 @@ public class TestGlobalFetch extends TestBase { for (Object value : values) { String stringifiedValue = new Gson().toJson(value); Future req = server.futureRequest("/empty.html"); - request.post(server.EMPTY_PAGE, new APIRequestContext.PostOptions() - .setHeaders(mapOf("content-type", "application/json")) + request.post(server.EMPTY_PAGE, RequestOptions.create() + .setHeader("content-type", "application/json") .setData(stringifiedValue)); byte[] body = req.get().postBody; assertEquals(stringifiedValue, new String(body)); diff --git a/scripts/CLI_VERSION b/scripts/CLI_VERSION index 12b3ecc2..cd90ba1c 100644 --- a/scripts/CLI_VERSION +++ b/scripts/CLI_VERSION @@ -1 +1 @@ -1.18.0-alpha-1637257604000 +1.18.0-alpha-1637368835000 diff --git a/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java b/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java index 578524a3..27d0112a 100644 --- a/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java +++ b/tools/api-generator/src/main/java/com/microsoft/playwright/tools/ApiGenerator.java @@ -268,6 +268,7 @@ class TypeRef extends Element { customTypeNames.put("Frame.setInputFiles.files", "FilePayload"); customTypeNames.put("Page.setInputFiles.files", "FilePayload"); customTypeNames.put("Page.setInputFiles.files", "FilePayload"); + customTypeNames.put("FormData.set.value", "FilePayload"); customTypeNames.put("Page.dragAndDrop.options.sourcePosition", "Position"); customTypeNames.put("Frame.dragAndDrop.options.sourcePosition", "Position"); @@ -630,6 +631,20 @@ class Method extends Element { output.add(offset + "}"); return; } + if ("FormData.create".equals(jsonPath)) { + writeJavadoc(params, output, offset); + output.add(offset + "static FormData create() {"); + output.add(offset + " return new FormDataImpl();"); + output.add(offset + "}"); + return; + } + if ("RequestOptions.create".equals(jsonPath)) { + writeJavadoc(params, output, offset); + output.add(offset + "static RequestOptions create() {"); + output.add(offset + " return new RequestOptionsImpl();"); + output.add(offset + "}"); + return; + } if ("PlaywrightAssertions.assertThat".equals(jsonPath)) { writeJavadoc(params, output, offset); String originalName = jsonElement.getAsJsonObject().get("originalName").getAsString(); @@ -896,10 +911,10 @@ class Interface extends TypeDefinition { } void writeTo(List output, String offset) { - if ("Playwright".equals(jsonName)) { - output.add("import com.microsoft.playwright.impl.PlaywrightImpl;"); + if (methods.stream().anyMatch(m -> "create".equals(m.jsonName))) { + output.add("import com.microsoft.playwright.impl." + jsonName + "Impl;"); } - if (asList("Page", "Request", "Response", "APIRequest", "APIResponse", "FileChooser", "Frame", "ElementHandle", "Locator", "Browser", "BrowserContext", "BrowserType", "Mouse", "Keyboard").contains(jsonName)) { + if (asList("Page", "Request", "Response", "APIRequestContext", "APIRequest", "APIResponse", "FileChooser", "Frame", "ElementHandle", "Locator", "Browser", "BrowserContext", "BrowserType", "Mouse", "Keyboard").contains(jsonName)) { output.add("import com.microsoft.playwright.options.*;"); } if (jsonName.equals("Route")) { @@ -908,7 +923,7 @@ class Interface extends TypeDefinition { if ("Download".equals(jsonName)) { output.add("import java.io.InputStream;"); } - if (asList("Page", "Frame", "ElementHandle", "Locator", "APIRequest", "APIRequestContext", "FileChooser", "Browser", "BrowserContext", "BrowserType", "Download", "Route", "Selectors", "Tracing", "Video").contains(jsonName)) { + if (asList("Page", "Frame", "ElementHandle", "Locator", "FormData", "APIRequest", "APIRequestContext", "FileChooser", "Browser", "BrowserContext", "BrowserType", "Download", "Route", "Selectors", "Tracing", "Video").contains(jsonName)) { output.add("import java.nio.file.Path;"); } output.add("import java.util.*;"); @@ -1118,11 +1133,16 @@ public class ApiGenerator { if (!classFilter.test(name)) { continue; } + Interface iface = new Interface(entry.getAsJsonObject(), topLevelTypes); + if (asList("RequestOptions", "FormData").contains(name)) { + topLevelTypes.put(name, iface); + continue; + } List lines = new ArrayList<>(); lines.add(Interface.header); lines.add("package " + packageName + ";"); lines.add(""); - new Interface(entry.getAsJsonObject(), topLevelTypes).writeTo(lines, ""); + iface.writeTo(lines, ""); String text = String.join("\n", lines); try (FileWriter writer = new FileWriter(new File(dir, name + ".java"))) { writer.write(text);