sekken 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +11 -0
- data/.yardopts +6 -0
- data/CONTRIBUTING.md +46 -0
- data/Gemfile +27 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +21 -0
- data/donate.png +0 -0
- data/lib/sekken.rb +75 -0
- data/lib/sekken/envelope.rb +92 -0
- data/lib/sekken/errors.rb +9 -0
- data/lib/sekken/example_message.rb +41 -0
- data/lib/sekken/httpclient.rb +35 -0
- data/lib/sekken/importer.rb +77 -0
- data/lib/sekken/message.rb +135 -0
- data/lib/sekken/operation.rb +100 -0
- data/lib/sekken/resolver.rb +20 -0
- data/lib/sekken/response.rb +50 -0
- data/lib/sekken/version.rb +5 -0
- data/lib/sekken/wsdl.rb +86 -0
- data/lib/sekken/wsdl/binding.rb +64 -0
- data/lib/sekken/wsdl/binding_operation.rb +85 -0
- data/lib/sekken/wsdl/document.rb +83 -0
- data/lib/sekken/wsdl/document_collection.rb +61 -0
- data/lib/sekken/wsdl/input_output.rb +84 -0
- data/lib/sekken/wsdl/message.rb +38 -0
- data/lib/sekken/wsdl/operation.rb +47 -0
- data/lib/sekken/wsdl/port.rb +29 -0
- data/lib/sekken/wsdl/port_type.rb +38 -0
- data/lib/sekken/wsdl/port_type_operation.rb +42 -0
- data/lib/sekken/wsdl/service.rb +55 -0
- data/lib/sekken/xml/attribute.rb +13 -0
- data/lib/sekken/xml/element.rb +82 -0
- data/lib/sekken/xml/element_builder.rb +220 -0
- data/lib/sekken/xs/schema.rb +57 -0
- data/lib/sekken/xs/schema_collection.rb +49 -0
- data/lib/sekken/xs/types.rb +272 -0
- data/sekken.gemspec +42 -0
- data/spec/fixtures/response/another_soap_fault.xml +14 -0
- data/spec/fixtures/response/authentication.xml +14 -0
- data/spec/fixtures/response/header.xml +13 -0
- data/spec/fixtures/response/list.xml +18 -0
- data/spec/fixtures/response/multi_ref.xml +39 -0
- data/spec/fixtures/response/soap_fault.xml +8 -0
- data/spec/fixtures/response/soap_fault12.xml +18 -0
- data/spec/fixtures/response/taxcloud.xml +1 -0
- data/spec/fixtures/wsdl/amazon.wsdl +1920 -0
- data/spec/fixtures/wsdl/arrays_with_attributes.wsdl +117 -0
- data/spec/fixtures/wsdl/authentication.wsdl +63 -0
- data/spec/fixtures/wsdl/awse.wsdl +1510 -0
- data/spec/fixtures/wsdl/betfair.wsdl +2981 -0
- data/spec/fixtures/wsdl/blz_service.wsdl +88 -0
- data/spec/fixtures/wsdl/bookt/bookt.wsdl +11 -0
- data/spec/fixtures/wsdl/bookt/bookt0.xsd +433 -0
- data/spec/fixtures/wsdl/bookt/bookt1.xsd +42 -0
- data/spec/fixtures/wsdl/bookt/bookt10.xsd +38 -0
- data/spec/fixtures/wsdl/bookt/bookt11.xsd +17 -0
- data/spec/fixtures/wsdl/bookt/bookt12.xsd +18 -0
- data/spec/fixtures/wsdl/bookt/bookt13.xsd +22 -0
- data/spec/fixtures/wsdl/bookt/bookt14.xsd +27 -0
- data/spec/fixtures/wsdl/bookt/bookt15.xsd +28 -0
- data/spec/fixtures/wsdl/bookt/bookt2.wsdl +243 -0
- data/spec/fixtures/wsdl/bookt/bookt2.xsd +81 -0
- data/spec/fixtures/wsdl/bookt/bookt3.wsdl +286 -0
- data/spec/fixtures/wsdl/bookt/bookt3.xsd +61 -0
- data/spec/fixtures/wsdl/bookt/bookt4.xsd +35 -0
- data/spec/fixtures/wsdl/bookt/bookt5.xsd +22 -0
- data/spec/fixtures/wsdl/bookt/bookt6.xsd +26 -0
- data/spec/fixtures/wsdl/bookt/bookt7.xsd +18 -0
- data/spec/fixtures/wsdl/bookt/bookt8.xsd +22 -0
- data/spec/fixtures/wsdl/bookt/bookt9.xsd +29 -0
- data/spec/fixtures/wsdl/bronto.wsdl +3285 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange.wsdl +104 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange0.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange1.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange2.wsdl +119 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange2.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange3.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange4.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange5.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange6.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange7.xsd +1 -0
- data/spec/fixtures/wsdl/bydexchange/bydexchange8.xsd +1 -0
- data/spec/fixtures/wsdl/crowd.wsdl +2437 -0
- data/spec/fixtures/wsdl/data_exchange.wsdl +98 -0
- data/spec/fixtures/wsdl/document_literal_wrapped.wsdl +153 -0
- data/spec/fixtures/wsdl/economic.wsdl +65660 -0
- data/spec/fixtures/wsdl/edialog.wsdl +13148 -0
- data/spec/fixtures/wsdl/email_verification.wsdl +394 -0
- data/spec/fixtures/wsdl/equifax.wsdl +794 -0
- data/spec/fixtures/wsdl/geotrust.wsdl +156 -0
- data/spec/fixtures/wsdl/interhome.wsdl +2137 -0
- data/spec/fixtures/wsdl/iws.wsdl +695 -0
- data/spec/fixtures/wsdl/jetairways.wsdl +156 -0
- data/spec/fixtures/wsdl/jira.wsdl +3890 -0
- data/spec/fixtures/wsdl/juniper.wsdl +215 -0
- data/spec/fixtures/wsdl/namespaced_actions.wsdl +307 -0
- data/spec/fixtures/wsdl/oracle.wsdl +3629 -0
- data/spec/fixtures/wsdl/ratp.wsdl +955 -0
- data/spec/fixtures/wsdl/rio2/rio2.wsdl +74 -0
- data/spec/fixtures/wsdl/rio2/rio2_0.wsdl +55 -0
- data/spec/fixtures/wsdl/rio2/rio2_0.xsd +58 -0
- data/spec/fixtures/wsdl/rio2/rio2_1.xsd +41 -0
- data/spec/fixtures/wsdl/rio2/rio2_2.xsd +222 -0
- data/spec/fixtures/wsdl/rio2/rio2_3.xsd +10 -0
- data/spec/fixtures/wsdl/rpc_literal.wsdl +105 -0
- data/spec/fixtures/wsdl/spyne.wsdl +70 -0
- data/spec/fixtures/wsdl/stockquote.wsdl +124 -0
- data/spec/fixtures/wsdl/taxcloud.wsdl +934 -0
- data/spec/fixtures/wsdl/team_software/team_software.wsdl +542 -0
- data/spec/fixtures/wsdl/team_software/team_software0.xsd +448 -0
- data/spec/fixtures/wsdl/team_software/team_software1.xsd +41 -0
- data/spec/fixtures/wsdl/team_software/team_software2.xsd +258 -0
- data/spec/fixtures/wsdl/team_software/team_software3.xsd +14 -0
- data/spec/fixtures/wsdl/telefonkatalogen.wsdl +45 -0
- data/spec/fixtures/wsdl/temperature.wsdl +136 -0
- data/spec/fixtures/wsdl/wasmuth/wasmuth.wsdl +157 -0
- data/spec/fixtures/wsdl/wasmuth/wasmuth1.xsd +210 -0
- data/spec/fixtures/wsdl/wasmuth/wasmuth2.xsd +549 -0
- data/spec/fixtures/wsdl/xignite.wsdl +3470 -0
- data/spec/fixtures/wsdl/yahoo.wsdl +2425 -0
- data/spec/fixtures/wsdl/zanox_export_service.xml +520 -0
- data/spec/integration/amazon_spec.rb +51 -0
- data/spec/integration/authentication_spec.rb +38 -0
- data/spec/integration/awse_spec.rb +95 -0
- data/spec/integration/betfair_spec.rb +179 -0
- data/spec/integration/blz_service_spec.rb +46 -0
- data/spec/integration/bookt_spec.rb +59 -0
- data/spec/integration/bronto_spec.rb +178 -0
- data/spec/integration/bydexchange_spec.rb +40 -0
- data/spec/integration/crowd_spec.rb +44 -0
- data/spec/integration/data_exchange_spec.rb +27 -0
- data/spec/integration/document_literal_spec.rb +104 -0
- data/spec/integration/economic_spec.rb +64 -0
- data/spec/integration/email_verification_spec.rb +82 -0
- data/spec/integration/equifax_spec.rb +216 -0
- data/spec/integration/geotrust_spec.rb +17 -0
- data/spec/integration/interhome_spec.rb +156 -0
- data/spec/integration/iws_spec.rb +27 -0
- data/spec/integration/jetairways_spec.rb +142 -0
- data/spec/integration/jira_spec.rb +27 -0
- data/spec/integration/juniper_spec.rb +20 -0
- data/spec/integration/namespaced_actions_spec.rb +37 -0
- data/spec/integration/oracle_spec.rb +61 -0
- data/spec/integration/ratp_spec.rb +178 -0
- data/spec/integration/rio2_spec.rb +56 -0
- data/spec/integration/rpc_literal_spec.rb +101 -0
- data/spec/integration/spyne_spec.rb +60 -0
- data/spec/integration/stockquote_spec.rb +46 -0
- data/spec/integration/taxcloud_spec.rb +45 -0
- data/spec/integration/team_software_spec.rb +51 -0
- data/spec/integration/telefonkatalogen_spec.rb +42 -0
- data/spec/integration/temperature_spec.rb +71 -0
- data/spec/integration/wasmuth_spec.rb +47 -0
- data/spec/integration/xignite_spec.rb +112 -0
- data/spec/integration/yahoo_spec.rb +116 -0
- data/spec/sekken/httpclient_spec.rb +41 -0
- data/spec/sekken/operation/build_spec.rb +308 -0
- data/spec/sekken/operation/document_literal_spec.rb +53 -0
- data/spec/sekken/operation/example_body_spec.rb +95 -0
- data/spec/sekken/operation/rpc_literal_spec.rb +50 -0
- data/spec/sekken/operation_spec.rb +169 -0
- data/spec/sekken/resolver_spec.rb +38 -0
- data/spec/sekken/response_spec.rb +17 -0
- data/spec/sekken/wsdl/document_spec.rb +191 -0
- data/spec/sekken/wsdl_spec.rb +46 -0
- data/spec/sekken/xs/complex_type_spec.rb +197 -0
- data/spec/sekken/xs/element_spec.rb +82 -0
- data/spec/sekken/xs/simple_type_spec.rb +39 -0
- data/spec/sekken_spec.rb +128 -0
- data/spec/spec_helper.rb +37 -0
- data/spec/support/fixture.rb +19 -0
- data/spec/support/http_mock.rb +43 -0
- metadata +344 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 618f8169fb6022ee3b52de75d6900ef9cf53d5e3
|
4
|
+
data.tar.gz: 5f2125e6801af9ca196819a9cbf6dcda95821d38
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c3325dae933d2797fedfe1ca11edbd9c3e93cc8f5d1c88146132c95192bfdcc4e86d83e21cebbf8ac077f5ceba30805650fca3a9deb748fea6aed62a62db0373
|
7
|
+
data.tar.gz: 854878b073807be0b43489afa41db1d858a3e623ad681f4f4ede59b92eb9370401285abc7c3eb3045bc62f9081350e224c53967e3b619d823109a8de417eb0fd
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Contribution Guide
|
2
|
+
|
3
|
+
This page describes how to contribute changes to Sekken.
|
4
|
+
|
5
|
+
Please do not create a pull request without reading this guide first.
|
6
|
+
Make sure to read the documentation for your version at [savonrb.com](http://savonrb.com/)
|
7
|
+
and post questions to the [mailing list](https://groups.google.com/forum/#!forum/savonrb).
|
8
|
+
|
9
|
+
**Bug fixes**
|
10
|
+
|
11
|
+
If you really think you found a bug, please make sure to add as many information as possible
|
12
|
+
to the ticket. You're a developer, we are developers and you know we need tests to reproduce
|
13
|
+
problems and make sure they don't come back.
|
14
|
+
|
15
|
+
So if you can reproduce your problem in a spec, that would be awesome! If you can't, please
|
16
|
+
let us know how we could make this easier for you. Also, provide code and the WSDL of the
|
17
|
+
service your working with so others can try to come up with a spec for your problem.
|
18
|
+
|
19
|
+
After we have a failing spec, it obviously needs to be fixed. Make sure your new spec is the
|
20
|
+
only failing one under the `spec` directory. Travis only runs the "unit tests" at `spec/sekken`,
|
21
|
+
but Sekken actually has with some additional "integration/example specs" at `spec/integration`,
|
22
|
+
which you need to run locally to make sure the integration with real world services still works.
|
23
|
+
|
24
|
+
Notice that these specs are not run by Travis, because the service's are not guaranteed to work
|
25
|
+
all the time and the specs will timeout after a few seconds when the service is currently down.
|
26
|
+
|
27
|
+
Please follow this basic workflow for pull requests:
|
28
|
+
|
29
|
+
* [Fork the project](https://help.github.com/articles/fork-a-repo)
|
30
|
+
* Create a feature branch and make your bug fix
|
31
|
+
* Add tests for it!
|
32
|
+
* Update the [Changelog](https://github.com/savonrb/sekken/blob/master/CHANGELOG.md)
|
33
|
+
* [Send a pull request](https://help.github.com/articles/using-pull-requests)
|
34
|
+
* [Check that your pull request passes the build](https://travis-ci.org/savonrb/sekken/pull_requests)
|
35
|
+
|
36
|
+
|
37
|
+
**Improvements and feature requests**
|
38
|
+
|
39
|
+
If you have an idea for an improvement or a new feature, please feel free to
|
40
|
+
[create a new issue](https://github.com/savonrb/sekken/issues/new) and describe your idea
|
41
|
+
so that other people can give their insights and opinions. This is also important to avoid
|
42
|
+
duplicate work.
|
43
|
+
|
44
|
+
Pull requests and issues on GitHub are meant to be used to discuss problems and ideas,
|
45
|
+
so please make sure to participate and follow up on questions. In case noone comments
|
46
|
+
on your ticket, please keep updating the ticket with additional information.
|
data/Gemfile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
gemspec
|
3
|
+
|
4
|
+
# profiling
|
5
|
+
#gem 'method_profiler', require: false
|
6
|
+
#gem 'ruby-prof', require: false # does not work on jruby!
|
7
|
+
|
8
|
+
# coverage
|
9
|
+
gem 'simplecov', require: false
|
10
|
+
gem 'coveralls', require: false
|
11
|
+
|
12
|
+
# dependencies
|
13
|
+
#gem 'rubydeps', require: false # uses c extensions
|
14
|
+
|
15
|
+
# debugging
|
16
|
+
#gem 'debugger', require: false # don't install on travis!
|
17
|
+
|
18
|
+
platform :rbx do
|
19
|
+
gem 'json'
|
20
|
+
gem 'racc'
|
21
|
+
gem 'rubysl'
|
22
|
+
gem 'rubinius-coverage'
|
23
|
+
end
|
24
|
+
|
25
|
+
group :development do
|
26
|
+
gem 'fuubar'
|
27
|
+
end
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Daniel Harrington
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Sekken
|
2
|
+
|
3
|
+
Heavy metal SOAP client
|
4
|
+
|
5
|
+
[Documentation](http://savonrb.com) | [RDoc](http://rubydoc.info/gems/savon) |
|
6
|
+
[Mailing list](https://groups.google.com/forum/#!forum/savonrb) | [Twitter](http://twitter.com/savonrb)
|
7
|
+
|
8
|
+
[![Build Status](https://secure.travis-ci.org/savonrb/sekken.png?branch=master)](http://travis-ci.org/savonrb/sekken)
|
9
|
+
[![Gem Version](https://badge.fury.io/rb/sekken.png)](http://badge.fury.io/rb/sekken)
|
10
|
+
[![Code Climate](https://codeclimate.com/github/savonrb/sekken.png)](https://codeclimate.com/github/savonrb/sekken)
|
11
|
+
[![Coverage Status](https://coveralls.io/repos/savonrb/sekken/badge.png?branch=master)](https://coveralls.io/r/savonrb/sekken)
|
12
|
+
|
13
|
+
|
14
|
+
## Version 3
|
15
|
+
|
16
|
+
**Status: Unstable.** Sekken is currently under development and available for testing on GitHub.
|
17
|
+
Use this version if you can handle changes and want to provide feedback.
|
18
|
+
|
19
|
+
Sekken is still in a very early stage, but [there is some documentation!](http://savonrb.com/version3/)
|
20
|
+
|
21
|
+
## Give back
|
22
|
+
|
23
|
+
If you're using Sekken and you or your company is making money from it, then please consider
|
24
|
+
donating via [Gittip](https://www.gittip.com/rubiii/) so that I can continue to improve it.
|
25
|
+
|
26
|
+
[![donate](donate.png)](https://www.gittip.com/rubiii/)
|
27
|
+
|
28
|
+
Donate icon from the [Noun Project](http://thenounproject.com/noun/donate/#icon-No285).
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
|
4
|
+
RSpec::Core::RakeTask.new
|
5
|
+
|
6
|
+
desc 'Generate a dependency graph'
|
7
|
+
task :graph do
|
8
|
+
system <<-BASH
|
9
|
+
rm -rf graph
|
10
|
+
mkdir graph
|
11
|
+
GRAPH=true rspec
|
12
|
+
mv rubydeps.dump graph
|
13
|
+
cd graph
|
14
|
+
rubydeps --path_filter='lib/sekken'
|
15
|
+
dot -Tsvg rubydeps.dot > rubydeps.svg
|
16
|
+
open -a 'Google Chrome' rubydeps.svg
|
17
|
+
BASH
|
18
|
+
end
|
19
|
+
|
20
|
+
task default: :spec
|
21
|
+
task test: :spec
|
data/donate.png
ADDED
Binary file
|
data/lib/sekken.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'logging'
|
3
|
+
|
4
|
+
require 'sekken/version'
|
5
|
+
require 'sekken/errors'
|
6
|
+
require 'sekken/wsdl'
|
7
|
+
require 'sekken/operation'
|
8
|
+
require 'sekken/httpclient'
|
9
|
+
|
10
|
+
class Sekken
|
11
|
+
|
12
|
+
NS_XSD = 'http://www.w3.org/2001/XMLSchema'
|
13
|
+
NS_WSDL = 'http://schemas.xmlsoap.org/wsdl/'
|
14
|
+
|
15
|
+
NS_SOAP_1_1 = 'http://schemas.xmlsoap.org/wsdl/soap/'
|
16
|
+
NS_SOAP_1_2 = 'http://schemas.xmlsoap.org/wsdl/soap12/'
|
17
|
+
|
18
|
+
# Public: Returns the HTTP adapter to use.
|
19
|
+
def self.http_adapter
|
20
|
+
@http_adapter ||= HTTPClient
|
21
|
+
end
|
22
|
+
|
23
|
+
# Public: Sets the HTTP adapter to use.
|
24
|
+
def self.http_adapter=(adapter)
|
25
|
+
@http_adapter = adapter
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(wsdl, http = nil)
|
29
|
+
@http = http || new_http_client
|
30
|
+
@wsdl = WSDL.new(wsdl, @http)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Public: Returns the Wasabi instance.
|
34
|
+
attr_reader :wsdl
|
35
|
+
|
36
|
+
# Public: Returns the HTTP adapter‘s client instance.
|
37
|
+
def http
|
38
|
+
@http.client
|
39
|
+
end
|
40
|
+
|
41
|
+
# Public: Returns the services and ports defined by the WSDL.
|
42
|
+
def services
|
43
|
+
@wsdl.services
|
44
|
+
end
|
45
|
+
|
46
|
+
# Public: Returns an Array of operations for a service and port.
|
47
|
+
def operations(service_name, port_name)
|
48
|
+
@wsdl.operations(service_name.to_s, port_name.to_s)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Public: Returns an Operation by service, port and operation name.
|
52
|
+
def operation(service_name, port_name, operation_name)
|
53
|
+
operation = @wsdl.operation(service_name.to_s, port_name.to_s, operation_name.to_s)
|
54
|
+
verify_operation_style! operation
|
55
|
+
|
56
|
+
Operation.new(operation, @wsdl, @http)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
# Private: Returns a new instance of the HTTP adapter to use.
|
62
|
+
def new_http_client
|
63
|
+
self.class.http_adapter.new
|
64
|
+
end
|
65
|
+
|
66
|
+
# Private: Raises if the operation style is not supported.
|
67
|
+
def verify_operation_style!(operation)
|
68
|
+
if operation.input_style == 'rpc/encoded'
|
69
|
+
raise UnsupportedStyleError,
|
70
|
+
"#{operation.name.inspect} is an #{operation.input_style.inspect} style operation.\n" \
|
71
|
+
"Currently this style is not supported."
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'builder'
|
2
|
+
require 'sekken/message'
|
3
|
+
|
4
|
+
class Sekken
|
5
|
+
class Envelope
|
6
|
+
|
7
|
+
NSID = 'lol'
|
8
|
+
|
9
|
+
def initialize(operation, header, body)
|
10
|
+
@logger = Logging.logger[self]
|
11
|
+
|
12
|
+
@operation = operation
|
13
|
+
@header = header || {}
|
14
|
+
@body = body || {}
|
15
|
+
|
16
|
+
@nsid_counter = -1
|
17
|
+
@namespaces = {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def register_namespace(namespace)
|
21
|
+
@namespaces[namespace] ||= create_nsid
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
build_envelope(build_header, build_body)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def create_nsid
|
31
|
+
@nsid_counter += 1
|
32
|
+
"#{NSID}#{@nsid_counter}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def build_header
|
36
|
+
return "" if @header.empty?
|
37
|
+
Message.new(self, @operation.input.header_parts).build(@header)
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_body
|
41
|
+
return "" if @body.empty?
|
42
|
+
body = Message.new(self, @operation.input.body_parts).build(@body)
|
43
|
+
|
44
|
+
if rpc_call?
|
45
|
+
build_rpc_wrapper(body)
|
46
|
+
else
|
47
|
+
body
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def build_envelope(header, body)
|
52
|
+
builder = Builder::XmlMarkup.new(indent: 2)
|
53
|
+
|
54
|
+
builder.tag! :env, :Envelope, collect_namespaces do |xml|
|
55
|
+
xml.tag!(:env, :Header) { |xml| xml << header }
|
56
|
+
xml.tag!(:env, :Body) { |xml| xml << body }
|
57
|
+
end
|
58
|
+
|
59
|
+
builder.target!
|
60
|
+
end
|
61
|
+
|
62
|
+
def build_rpc_wrapper(body)
|
63
|
+
name = @operation.name
|
64
|
+
namespace = @operation.binding_operation.input_body[:namespace]
|
65
|
+
nsid = register_namespace(namespace) if namespace
|
66
|
+
|
67
|
+
tag = [nsid, name].compact.join(':')
|
68
|
+
|
69
|
+
'<%{tag}>%{body}</%{tag}>' % { tag: tag, body: body }
|
70
|
+
end
|
71
|
+
|
72
|
+
def rpc_call?
|
73
|
+
@operation.binding_operation.style == 'rpc'
|
74
|
+
end
|
75
|
+
|
76
|
+
def collect_namespaces
|
77
|
+
# registered namespaces
|
78
|
+
namespaces = @namespaces.each_with_object({}) { |(namespace, nsid), memo|
|
79
|
+
memo["xmlns:#{nsid}"] = namespace
|
80
|
+
}
|
81
|
+
|
82
|
+
# envelope namespace
|
83
|
+
namespaces['xmlns:env'] = case @operation.soap_version
|
84
|
+
when '1.1' then 'http://schemas.xmlsoap.org/soap/envelope/'
|
85
|
+
when '1.2' then 'http://www.w3.org/2003/05/soap-envelope'
|
86
|
+
end
|
87
|
+
|
88
|
+
namespaces
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Sekken
|
2
|
+
class ExampleMessage
|
3
|
+
|
4
|
+
def self.build(parts)
|
5
|
+
memo = {}
|
6
|
+
|
7
|
+
parts.each do |element|
|
8
|
+
name = element.name.to_sym
|
9
|
+
|
10
|
+
case
|
11
|
+
when element.simple_type?
|
12
|
+
base_type_local = element.base_type.split(':').last
|
13
|
+
base_type_local = [base_type_local] unless element.singular?
|
14
|
+
memo[name] = base_type_local
|
15
|
+
|
16
|
+
when element.complex_type?
|
17
|
+
value = build(element.children)
|
18
|
+
|
19
|
+
unless element.attributes.empty?
|
20
|
+
value.merge! collect_attributes(element)
|
21
|
+
end
|
22
|
+
|
23
|
+
value = [value] unless element.singular?
|
24
|
+
memo[name] = value
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
memo
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def self.collect_attributes(element)
|
35
|
+
element.attributes.each_with_object({}) { |attribute, memo|
|
36
|
+
memo["_#{attribute.name}".to_sym] = attribute.base_type
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'httpclient'
|
2
|
+
|
3
|
+
class Sekken
|
4
|
+
class HTTPClient
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@client = ::HTTPClient.new
|
8
|
+
end
|
9
|
+
|
10
|
+
# Public: Returns the HTTPClient instance to configure.
|
11
|
+
attr_reader :client
|
12
|
+
|
13
|
+
# Public: Executes an HTTP GET request to a given url.
|
14
|
+
#
|
15
|
+
# Returns the raw HTTP response body as a String.
|
16
|
+
def get(url)
|
17
|
+
request(:get, url, {}, nil)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Public: Executes an HTTP POST request to a given url with headers and body.
|
21
|
+
#
|
22
|
+
# Returns the raw HTTP response body as a String.
|
23
|
+
def post(url, headers, body)
|
24
|
+
request(:post, url, headers, body)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def request(method, url, headers, body)
|
30
|
+
response = @client.request(method, url, nil, body, headers)
|
31
|
+
response.content
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|