Forum Discussion
HTTP::payload replacement
Hello,
I try to modify a HTTP SOAP request from a client, because the used namespace is not correct (:i -> :xsi). The iRule is assigned to the virtual server. The replacement is correct, but when the ASM module is validating the XML it fails because the SOAP Request is to short.
I think the replacement of the payload does not work in the way I expect: HTTP::payload replace 0 [string length $newdata_1] $newdata_1
How can I exchange the payload against a larger buffer ?
Best Regards Jürgen
iRule to modify a SOAP request from a clientwhen RULE_INIT { set static::debug 1 }
when HTTP_REQUEST { Get the Content-Length Content-Length is only part of an POST, a GET has no Content_Length attribut
if Content-Length is > 1MB then set Content-Length to 1MBif { [HTTP::header exists "Content-Length"] } { set content_length [HTTP::header "Content-Length"] } else { set content_length 0 } if { $content_length > 0 && $content_length < 1048577 } { set collect_length $content_length } else { set collect_length 1048576 }
if { $collect_length > 0 } { content_length != 0 if HTTP::collect was executed next step is the event HTTP_REQUEST_DATA HTTP::collect $collect_length } }when HTTP_REQUEST_DATA {
if {$static::debug}{log local0. "payload before: [HTTP::payload $collect_length]"}
regsub -all ":i" [HTTP::payload] ":xsi" newdata_1
if {$static::debug}{log local0. "length newdata_1 : [string length $newdata_1]"}
replace the old payload with the new HTTP::payload replace 0 [string length $newdata_1] $newdata_1
if {$static::debug}{log local0. "payload after: $newdata_1"}
HTTP::release }
7 Replies
- nitass_89166
Noctilucent
can you try this?
HTTP::payload replace 0 [string length [HTTP::payload]] "" HTTP::payload replace 0 0 $newdata_1- gamm_31377
Nimbostratus
yes, that works thanks a lot.
- nitass
Employee
can you try this?
HTTP::payload replace 0 [string length [HTTP::payload]] "" HTTP::payload replace 0 0 $newdata_1- gamm_31377
Nimbostratus
yes, that works thanks a lot.
- Kevin_Stewart
Employee
You should actually be able to get away with using a STREAM profile here. It'll be much faster than buffering request payload and you can also get rid of the regex.
when HTTP_REQUEST { if { [HTTP::header Content-Type] contains "soap" } { STREAM::expression {@:i@:xsi@} STREAM::enable } else { STREAM::disable } } when HTTP_RESPONSE { STREAM::disable }One important caveat of using STREAM in an HTTP_REQUEST is that you need to force HTTP chunking. Create a new HTTP profile and set Request Chunking to "Rechunk". Add this HTTP profile and a generic empty STREAM profile to the VIP, along with this iRule.
- gamm_31377
Nimbostratus
It was not the length I got the following error:
XML Buffer N/A Description Malformed document Document has no root element Context URL XML Profile XML_OSMCService
POST /axis/services/OSMCService HTTP/1.1 User-Agent: kSOAP/2.0 SOAPAction: getGeneralInfoCollection Content-Type: text/xml Connection: close Host: 172.30.245.13 Accept-Encoding: gzip
and the HTTP_REQUEST looks well formed:
SYMAUTHNAAAACgAAABxvZ0ZJZnpHLzQ3Mk5jcXZqK0IxOFpKYWFvV1BrAAAADXBhbnplckBzeXN0ZW0AAAADAAAADFN1YmplY3RSb2xlcwAAAAIAAAAVT3BlblNjYXBlIFVDIEFwcDpUZWFtAAAABVVNOnVtAAAAD1N1YmplY3RQcm9maWxlcwAAAAIAAAAcT3BlblNjYXBlIFVDIEFwcDpUZWFtQHN5c3RlbQAAAAxVTTp1bUBzeXN0ZW0AAAAKRW50aXR5VHlwZQAAAAEAAAAEVXNlcgAAACFPcGVyYXRpb25hbERvbWFpbkBPU0NfVUNfVjZfTEFSR0UAAAAXQmFzaWNVc2VyQXV0aGVudGljYXRpb24AAAFGQ4Ki1AAAAUZDgnvwAAABRkO5kYAAAAFGRaf0AAAAAAxOb1N1YmplY3RLZXkAAAAISG1hY1NIQTEAAAAbSE1BQ0NoZWNrc3VtVmVyaWZpY2F0aW9uS2V5AAAAFF7NELFqp4PEjr38lTCebU6WkWKh6
- Jaz_170005
Nimbostratus
Hello,
how about if the payload is more than 1MB? in my case I need to replace let's say first and last lines in the request message...it's doing it for the first line but not for the last line ( I guess because it's only collecting 1MB of the message which miss out the last line)..any idea? thank you in advance.
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
