HTTP Testing Task
The
HTTP Testing Task
defines an HTTP protocol testing task for functional, performance, stability, and custom testing of HTTP services.
Main Parameter List
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
target | enum | Yes | - | Task Type Identifier Fixed value HTTP |
name | string | Yes | ≤400 chars | Interface Identifier Unique identifier in test scenarios |
description | string | No | ≤800 chars | Detailed Description Explains the business purpose of the interface |
enabled | boolean | Yes | - | Enable Statustrue : Execute this interface (default)false : Skip this interface |
beforeName | string | No | ≤400 chars | Execution Order Control Specifies the preceding task name to ensure execution order |
transactionName | string | No | ≤400 chars | Transaction Identifier Associates with the start transaction name of a transaction controller |
apisId | integer | No | - | API Resource Association Links to API repository ID (test results auto-sync) |
caseId | integer | No | - | Test Case Association Links to test case ID (test results auto-sync) |
request | object | Yes | - | Request Configuration Defines request method/URL/parameters/authentication etc. |
assertions | array[object] | No | - | Result Validation Rules Sets response validation conditions |
variables | array[object] | No | - | Dynamic Sample Variable Extraction Extracts values from responses for subsequent use See Variable Definition |
datasets | array[object] | No | - | Test Datasets Drives multi-scenario data testing See Dataset Definition |
actionOnEOF | enum | No | - | Dataset End StrategyRECYCLE : Recycle data (default)STOP_THREAD : Stop thread |
sharingMode | enum | No | - | Data Sharing ModeALL_THREAD : Thread-shared (default)CURRENT_THREAD : Thread-independent |
Key Parameter Notes:
- Transaction Control (
transactionName
)- Used to associate with transaction controllers (TRANS_START)
- Enables atomic business operation statistics
- Data-Driven (
datasets
+sharingMode
)ALL_THREAD
: All threads share the same datasetCURRENT_THREAD
: Each thread has an independent data copy
- End Strategy (
actionOnEOF
)RECYCLE
: Recycle data (for stress testing)STOP_THREAD
: Stop thread when data is exhausted (precise control)
- Result Association (
apisId
/caseId
)- Enables automatic test result synchronization with API repository/test cases
- Supports continuous integration report generation
Complete HTTP structure example:
- target: HTTP
name: Add User
description: This is an example of complete HTTP parameters
enabled: true
beforeName: BusinessTransaction
transactionName: BusinessTransaction
apisId: 193234753355265004
caseId: 193234753355265004
request:
# Request parameter configuration... assertions:
# Assertion parameter configuration... variables:
# Variable parameter configuration... datasets:
# Dataset parameter configuration... actionOnEOF: RECYCLE
sharingMode: ALL_THREAD
Request Construction (request)
Parameter | Type | Required | Limit | Description |
---|---|---|---|---|
method | enum | Yes | - | Request MethodPOST /GET /PUT /PATCH /DELETE /HEAD /OPTIONS /TRACE |
url | string | No | ≤2000 chars | Complete Request URL Takes precedence over server+endpoint combination |
server | object | No | - | Server Configuration Defines base URL and environment variables |
endpoint | string | No | ≤800 chars | Interface Path Combined with server to form complete URL |
authentication | object | No | - | Authentication Configuration Supports Basic/Bearer/APIKey/OAuth2 etc. |
parameters | array | No | 1-200 items | Request Parameters Path/Query/Header/Cookie parameter configuration |
body | object | No | - | Request Body Configuration Supports JSON/Form/binary formats |
Relationship between complete URL, server, and endpoint:
https://api.example.com/v1/users?role=admin&status=active
\________________________/\____/ \______________________/
server URL endpoint query parameters
Complete URL(path)
Complete request example structure:
request:
method: PUT
url: "http://serv01-sample.angusmock.cloud:30010/user/{username}"
server:
# Server parameter configuration... endpoint: "/user/{username}"
authentication:
# Authentication parameter configuration... parameters:
# Request parameter configuration... body:
# Request body configuration...
Server Configuration (server)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
url | string | Yes | ≤400 chars | Base Server URL |
description | string | No | ≤800 chars | Server Description Purpose or environment details |
variables | Map<string,serverVariable> | No | 1-200 items | Environment Variables Supports dynamic environment switching |
Server Variable Configuration (serverVariable)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
allowableValues | array[string] | Yes | 1-200 items | Allowed Values List Defines variable value range |
defaultValue | string | Yes | ≤400 chars | Default Value Fallback when unspecified |
description | string | No | ≤800 chars | Variable Description Explains variable purpose |
Server Configuration Example:
server:
url: "http://{env}-sample.angusmock.cloud:660"
description: The example of server
variables:
env:
allowableValues:
- dev
- beta
- prod
defaultValue: beta
description: The example of server variable
Authentication Configuration (authentication)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
type | enum | Yes | - | Authentication Typenone : No authhttp : Basic authapiKey : API keyoauth2 : OAuth2 |
name | string | Yes | ≤400 chars | Scheme Name Examples: User Auth /API Key Auth |
description | string | No | ≤800 chars | Scheme Description Detailed auth mechanism |
enabled | boolean | Yes | - | Enabled Statustrue : Enabled (default)false : Disabled |
value | string | No | ≤4096 chars | Credential Value Supports variable expressions Example: Bearer {accessToken} |
apiKeys | array | No | 1-10 items | API Key Group Multi-key combination auth |
oauth2 | object | Yes | - | OAuth2 Configuration Supports multiple grant flows |
Authentication Configuration Example Structure:
authentication:
type: http
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
value: Bearer 181622ea2a1f4934ad6bec0308390da9
apiKeys:
# API key auth configuration
oauth2:
# OAuth2 auth configuration
Basic Authentication (http)
authentication:
type: http
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
value: Basic YWRtaW46YWRtaW4xMjM= # Base64 username:password
Bearer Token Authentication (http)
authentication:
type: http
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
value: Bearer 181622ea2a1f4934ad6bec0308390da9
API Key Authentication (apiKeys)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
name | string | Yes | ≤400 chars | Parameter Identifier Supports variables Example: X-{variable1}-API-Key |
in | enum | Yes | - | Parameter Locationheader : Request headerquery : URL querycookie : Cookie |
value | string | Yes | ≤1024 chars | Parameter Value Supports variables Example: {apiKey} |
type: apiKey
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
apiKeys:
- name: ak
in: cookie
value: cLpyeth1YGcZ8iZFJQilCJi4m979D1To
- name: sk
in: cookie
value: ypIPSxeI7ylgCW44FIFugZKmld63eQO3xqbGxsVIor3EWqxRgwA1YXtDsVrUwuMX
OAuth2 Authentication (oauth2)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
clientCredentials | object | No | - | Client Credentials Flow For server-to-server auth |
password | object | No | ≤400 chars | Password Flow For trusted clients |
authFlow | enum | No | ≤800 chars | Grant TypeclientCredentials /password |
newToken | boolean | Yes | - | Token Refreshtrue : Fetch new token per requestfalse : Use fixed token (default) |
token | string | Conditional | ≤4096 chars | Fixed Access Token Required when newToken=false Supports variables |
Example with existing OAuth2 token:
type: oauth2
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
value: Bearer 181622ea2a1f4934ad6bec0308390da9
oauth2:
authFlow: clientCredentials
newToken: true
token: Bearer 181622ea2a1f4934ad6bec0308390da9
OAuth2 Client Credentials Flow
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
tokenUrl | string | Yes | ≤400 chars | Token Endpoint OAuth2 core URL |
scopes | array | No | 1-200 items | Permission Scopes Defines API access Example: ["user:read", "user:write"] |
clientId | string | Yes | ≤400 chars | Client ID Supports variables Example: {env}_client_id |
clientSecret | string | Yes | ≤1024 chars | Client Secret Supports variables Sensitive - recommend encryption |
clientIn | enum | No | - | Credential Location See position details below |
Client Credential Positions (clientIn
)
Position | Transmission Method | Example |
---|---|---|
QUERY_PARAMETER | URL parameters | ?client_id=id&client_secret=secret |
BASIC_AUTH_HEADER | Authorization header | Basic base64(id:secret) |
REQUEST_BODY | Form data | client_id=id&client_secret=secret |
Client Credentials Example:
type: oauth2
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
oauth2:
clientCredentials:
tokenUrl: http://serv01-sample.angusmock.cloud:30010/oauth/token
scopes:
- user:read
clientId: client3
clientSecret: secret3
clientIn: QUERY_PARAMETER
authFlow: clientCredentials
OAuth2 Password Flow
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
tokenUrl | string | Yes | ≤400 chars | Token Endpoint OAuth2 core URL |
scopes | array | No | 1-200 items | Permission Scopes Defines API access Example: ["user:read", "user:write"] |
clientId | string | Yes | ≤400 chars | Client ID Supports variables Example: {env}_client_id |
clientSecret | string | Yes | ≤1024 chars | Client Secret Supports variables Sensitive - recommend encryption |
clientIn | enum | No | - | Credential Location See position details |
username | string | No | ≤400 chars | Username Password flow only Supports variables |
password | string | No | ≤1024 chars | Password Password flow only Supports variables |
Resource Owner Password Example:
type: oauth2
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
oauth2:
password:
tokenUrl: http://serv01-sample.angusmock.cloud:30010/oauth/token
scopes:
- user:read
clientId: client2
clientSecret: secret2
clientIn: QUERY_PARAMETER
username: admin
password: 123456
authFlow: password
Request Parameters (parameters)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
name | string | Yes | ≤400 chars | Parameter Name Supports variables Example: {env}_id |
in | enum | Yes | - | Parameter LocationQUERY : URL queryPATH : URL pathHEADER : HeaderCOOKIE : Cookie |
description | string | No | ≤800 chars | Parameter Description Detailed usage |
enabled | boolean | Yes | - | Enabled Statustrue : Include (default)false : Exclude |
type | enum | No | - | Data Typestring /number /integer / boolean /array /object Default: string |
format | string | No | ≤80 chars | Data Format Examples: date /email /uuid /uri |
value | string | No | ≤4096 chars | Parameter Value Supports variables & mock functions Example: @Email() |
Note: RFC7230 states header names are case-insensitive.
Complete Example with Different Parameter Locations:
parameters:
- name: Authorization
in: header
description: The example of parameters in the request header
enabled: true
type: string
format: string
value: "{accessToken}"
- name: Content-Type
in: header
description: Content-Type is used to determine the request content
enabled: true
type: string
format: string
value: application/json
- name: username
in: path
description: The example of parameters in the path
enabled: true
type: string
format: string
value: admin
- name: password
in: query
description: The example of parameters in the query
enabled: true
type: string
format: string
value: admin
Request Body (body)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
format | string | No | ≤80 chars | Data Format Examples: json /xml /yaml |
contentEncoding | enum | No | - | Content Encodingbase64 : Base64gzip_base64 : GZIP+Base64 |
forms | array | No | 1-200 items | Form Parameters For FormData requests |
rawContent | string | No | - | Raw Content Supports JSON/XML text or Base64 binary Supports variables & mock functions |
Form Parameters (forms)
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
name | string | Yes | ≤400 chars | Field Name Example: avatar /metadata |
description | string | No | ≤800 chars | Field Description Usage explanation |
enabled | boolean | Yes | - | Enabled Statustrue : Include (default)false : Exclude |
type | enum | No | - | Data Typestring /number /integer /boolean /array /object Default: string |
format | string | No | ≤80 chars | Data Format Examples: date /email /uuid |
contentType | string | No | ≤80 chars | Content Type Examples: image/png /application/json |
contentEncoding | enum | No | - | Content Encodingbase64 : Base64gzip_base64 : GZIP+Base64 |
fileName | string | No | ≤400 chars | Filename For file uploads Example: avatar.png |
value | string | No | - | Field Value Supports text/JSON/Base64 files Supports variables & mock functions |
JSON Request Body Example (ContentType: application/json):
body:
format: json
rawContent: "{\"age\": 18, \"hobbies\": \"swimming, playing basketball\", \"avatar\"\
:\"http://serv01-sample.angusmock.cloud:30010/user/{username}/avatar.png\"}"
Form URL-Encoded Example (ContentType: application/x-www-form-urlencoded):
body:
forms:
- name: age
description: The example of form-data text parameter
enabled: true
type: integer
format: int32
value: 18
- name: hobbies
description: The example of form-data text parameter
enabled: true
type: string
format: string
value: "swimming, playing basketball"
Multipart Form Data Example (ContentType: multipart/form-data):
body:
forms:
- name: age
description: The example of form-data text parameter
enabled: true
type: integer
format: int32
value: 18
- name: hobbies
description: The example of form-data text parameter
enabled: true
type: string
format: string
value: "swimming, playing basketball"
- name: avatar
description: The example of form-data file parameter
enabled: true
type: string
format: string
contentType: image/png
contentEncoding: base64
value: VGhpcyBpcyB0aGUgYmluYXJ5IGNvbnRlbnQgb2YgdGhlIGF2YXRhci5wbmcgZmlsZQ==
fileName: avatar.png
Example of Request Body with ContentType as binary image/png format:
body:
format: binary
contentEncoding: base64
rawContent: VGhpcyBpcyB0aGUgYmluYXJ5IGNvbnRlbnQgb2YgdGhlIGF2YXRhci5wbmcgZmlsZQ==
Response Assertions
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
name | string | Yes | ≤200 chars | Assertion Name Unique identifier Example: Verify Status Code |
description | string | No | ≤800 chars | Assertion Description Detailed purpose explanation |
enabled | boolean | Yes | - | Enable Statustrue : Enabled (default)false : Disabled |
type | enum | Yes | - | Assertion TypeSTATUS : Status codeHEADER : Response headerBODY : Response bodyBODY_SIZE : Response body sizeSIZE : Total response sizeDURATION : Duration |
parameterName | string | Conditional | ≤400 chars | Parameter Name Required when type=HEADER Specifies response header name |
condition | string | No | ≤400 chars | Execution Condition Variable expression controls assertion execution Example: {env} == "prod" |
assertionCondition | enum | Yes | - | Assertion Condition See assertion conditions below |
expression | string | Conditional | ≤400 chars | Extraction Expression Required for REGEX /JSON_PATH /XPATH |
matchItem | integer | No | 1-2000 | Match Item Index Specifies position in multi-value matches |
expected | string | Conditional | ≤4096 chars | Expected Value Required for non-empty value conditions |
extraction | object | No | - | Dynamic Extraction Configuration Extracts expected value from response |
Assertion Conditions
Condition | Description | Applicable Types | Example |
---|---|---|---|
EQUAL | Strict equality | All types | 200 = 200 → Pass |
NOT_EQUAL | Inequality | All types | 404 ≠ 200 → Pass |
IS_EMPTY | Empty check (empty string or null) | String/Object | "" or null → Pass |
NOT_EMPTY | Non-empty check | String/Object | "data" → Pass |
IS_NULL | Strict null check | Object | null → Pass |
NOT_NULL | Non-null check | Object | {} → Pass |
GREATER_THAN | Greater than | Number/Date | 1024 > 1000 → Pass |
GREATER_THAN_EQUAL | Greater than or equal | Number/Date | 100 ≥ 100 → Pass |
LESS_THAN | Less than | Number/Date | 80 < 100 → Pass |
LESS_THAN_EQUAL | Less than or equal | Number/Date | 100 ≤ 100 → Pass |
CONTAIN | Contains | String/Array | "hello world" ⊆ "world" → Pass |
NOT_CONTAIN | Does not contain | String/Array | "hello" ⊈ "world" → Pass |
REG_MATCH | Regex match | String | "abc123" ~ "\d+" → Pass |
XPATH_MATCH | XML node match | XML | //book/price > 50 |
JSON_PATH_MATCH | JSON node match | JSON | $.data.userId = "1001" |
Match Item Rules
Scenario | matchItem Setting | Return Value |
---|---|---|
Index not specified | Not set or matchItem: null | All matched values concatenated |
Valid index | matchItem: N (0≤N≤2000) | (N+1)th matched value |
Invalid index | N > match count | null |
1. Regex Matching (REG_MATCH)
Input Text:
Hello! My phone numbers are 18888888888 and 13999999999.
Expression:
(1\d{10})
Result Processing:
matchItem | Return Value | Description |
---|---|---|
Not specified | "1888888888813999999999" | Concatenated values |
0 | "18888888888" | First match |
1 | "13999999999" | Second match |
2 | null | Out of range |
2. JSONPath Matching (JSON_PATH_MATCH)
Input JSON:
{
"store": {
"book": [
{"title": "Book1", "price": 100},
{"title": "Book2", "price": 200}
]
}
}
Expression:
$.store.book[*]
Matching Result Handling:
matchItem | Return Value | Description |
---|---|---|
Not Specified | [{"title":"Book1","price":100} ,{"title":"Book2","price":200}] | Full array |
0 | {"title":"Book1","price":100} | First book |
1 | {"title":"Book2","price":200} | Second book |
2 | null | Out of range |
3. XPath Matching (XPATH_MATCH)
Input XML:
<persons>
<person>
<name>Zhang San</name>
<skills>Java</skills>
<skills>Python</skills>
</person>
<person>
<name>Li Si</name>
<skills>JavaScript</skills>
</person>
</persons>
Expression:
//person
Matching Result Handling:
matchItem | Return Value | Description |
---|---|---|
Not Specified | "Zhang SanJavaPythonLi SiJavaScript" | All text merged |
0 | "Zhang SanJavaPython" | First person node text |
1 | "Li SiJavaScript" | Second person node text |
2 | null | Out of range |
Expected Value Extraction Configuration (extraction)
Extraction can be used to read a value from the current request or response at a specified location as the assertion expected value.
Parameter | Type | Required | Length Limit | Description |
---|---|---|---|---|
method | enum | Yes | - | Extraction MethodREGEX : Regular expressionJSON_PATH : JSON pathX_PATH : XML path |
expression | string | Yes | - | Extraction Expression Written according to the method type |
defaultValue | string | Yes | - | Default Value Used when extraction fails |
location | enum | Yes | - | Extraction Location See location descriptions below |
parameterName | string | Conditional | ≤400 chars | Parameter Name Required when location is HEADER/PATH/QUERY/FORM |
Extraction Location (location)
Location | Use Case | Example |
---|---|---|
PATH_PARAMETER | RESTful resource ID | /users/{userId} |
QUERY_PARAMETER | Filter conditions | ?category=books |
REQUEST_HEADER | Authentication info | Authorization: Bearer token |
FORM_PARAMETER | Form fields | username=admin |
REQUEST_RAW_BODY | Raw request content | JSON/XML request body |
RESPONSE_HEADER | Response metadata | Content-Type: application/json |
RESPONSE_BODY | Business data | JSON/XML response body |
Expected Value Assertion Example:
assertions:
- name: Assert the HTTP status code is `200`
description: This is an example of an expected value assertion
enabled: true
type: STATUS
expected: 200
assertionCondition: EQUAL
condition: 1=1
- name: Assert the business code is `S`
description: "This is an example of jsonpath match assertions, response body is:\
\ {\n \"code\": \"S\",\n \"msg\": \"Success\"\n}"
enabled: true
type: BODY
expected: S
expression: $..code
assertionCondition: JSON_PATH_MATCH
- name: Assert response header `X-Extraction-Token` value contains `888888`
description: "This is an example of regexp match assertions, `X-Extraction-Token`\
\ value is: Your token is 888888 or 999999"
enabled: true
type: HEADER
parameterName: X-Extraction-Token
expected: 888888
expression: "(\\d{6})"
matchItem: 1
assertionCondition: REG_MATCH
condition: "{assertHeader}=true"
Extracted Value Assertion Example:
assertions:
- name: Assert the response body access_token is `181622ea2a1f4934ad6bec0308390da9`
description: This is an example of an extraction value assertion
enabled: true
type: BODY
assertionCondition: EQUAL
extraction:
method: JSON_PATH
expression: $.data.access_token
defaultValue: 181622ea2a1f4934ad6bec0308390da9
location: RESPONSE_BODY
Complete Configuration Parameter Example
- target: HTTP
name: Add User
description: This is an example of complete HTTP parameters
enabled: true
beforeName: BusinessTransaction
transactionName: BusinessTransaction
apisId: 193234753355265004
caseId: 193234753355265004
request:
method: PUT
url: "http://serv01-sample.angusmock.cloud:30010/user/{username}"
server:
url: "http://{env}-sample.angusmock.cloud:660"
description: The example of server
variables:
env:
allowableValues:
- dev
- beta
- prod
defaultValue: beta
description: The example of server variable
endpoint: "/user/{username}"
authentication:
type: http
name: Security schema
description: The security scheme used for HTTP requests
enabled: true
value: Bearer 181622ea2a1f4934ad6bec0308390da9
apiKeys:
- name: ak
in: cookie
value: cLpyeth1YGcZ8iZFJQilCJi4m979D1To
- name: sk
in: cookie
value: ypIPSxeI7ylgCW44FIFugZKmld63eQO3xqbGxsVIor3EWqxRgwA1YXtDsVrUwuMX
- name: otherKey1
in: header
value: otherKey1Value
- name: otherKey2
in: query
value: otherKey2Value
oauth2:
clientCredentials:
tokenUrl: http://serv01-sample.angusmock.cloud:30010/oauth/token
scopes:
- user:read
clientId: client3
clientSecret: secret3
clientIn: QUERY_PARAMETER
password:
tokenUrl: http://serv01-sample.angusmock.cloud:30010/oauth/token
scopes:
- user:read
clientId: client2
clientSecret: secret2
clientIn: QUERY_PARAMETER
username: admin
password: 123456
newToken: false
parameters:
- name: Authorization
in: header
description: The example of parameters in the request header
enabled: true
type: string
format: string
value: "{accessToken}"
- name: Content-Type
in: header
description: Content-Type is used to determine the request content
enabled: true
type: string
format: string
value: application/json
- name: username
in: path
description: The example of parameters in the path
enabled: true
type: string
format: string
value: admin
- name: password
in: query
description: The example of parameters in the query
enabled: true
type: string
format: string
value: admin
body:
type: string
format: string
contentEncoding: base64
forms:
- name: age
description: The example of form-data text parameter
enabled: true
type: integer
format: int32
value: 18
- name: hobbies
description: The example of form-data text parameter
enabled: true
type: string
format: string
value: "swimming, playing basketball"
- name: avatar
description: The example of form-data file parameter
enabled: true
type: string
format: string
contentType: image/png
contentEncoding: base64
value: VGhpcyBpcyB0aGUgYmluYXJ5IGNvbnRlbnQgb2YgdGhlIGF2YXRhci5wbmcgZmlsZQ==
fileName: avatar.png
rawContent: "{\"age\": 18, \"hobbies\": \"swimming, playing basketball\", \"avatar\"\
:\"http://serv01-sample.angusmock.cloud:30010/user/{username}/avatar.png\"}"
assertions:
- name: Assert the HTTP status code is 200
description: This is an example of an expected value assertion
enabled: true
type: STATUS
expected: 200
assertionCondition: EQUAL
condition: 1=1
- name: Assert response header `X-Extraction-Token` value contains 888888
description: "This is an example of extracting value assertions, `X-Extraction-Token`\
\ value is: Your token is 888888 or 999999"
enabled: true
type: HEADER
parameterName: X-Extraction-Token
expected: 888888
expression: "(\\d{6})"
matchItem: 1
assertionCondition: EQUAL
condition: "{assertHeader}=true"
variables:
- name: accessToken
method: JSON_PATH
expression: $.data.access_token
location: RESPONSE_BODY
datasets:
- name: UsernameDataset
parameters:
- name: username
value: '@Name()'
actionOnEOF: RECYCLE
sharingMode: ALL_THREAD
Let me know if you need any refinements!