Transactions using ODataControllers - database

Typically, an ODataController is set up to handle CRUD and other actions for one underlying DB entity. This works well when you are updating one or more customer orders, for example.
However, how do you commit changes to two or more entities in one transaction - for example, update a customer order with several related customer order details? Can this (or should this) be done using one ODataController? Or, is it better to put a service component on top of the ODataControllers, which wraps the entire transaction?

The Batch feature is designed to handle multi-operations within one http request. The batch requests look like:
POST /service/$batch HTTP/1.1
Host: host
OData-Version: 4.0
Content-Type: multipart/mixed;boundary=batch_36522ad7-fc75-4b56-8c71-56071383e77b
--batch_36522ad7-fc75-4b56-8c71-56071383e77b
Content-Type: multipart/mixed;boundary=changeset_77162fcd-b8da-41ac-a9f8-9357efbbd
--changeset_77162fcd-b8da-41ac-a9f8-9357efbbd
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 1
POST /service/Customers HTTP/1.1
Host: host
Content-Type: application/atom+xml;type=entry
Content-Length: ###
<AtomPub representation of a new Customer>
--changeset_77162fcd-b8da-41ac-a9f8-9357efbbd
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 2
POST $1/Orders HTTP/1.1
Host: host
Content-Type: application/atom+xml;type=entry
Content-Length: ###
<AtomPub representation of a new Order>
--changeset_77162fcd-b8da-41ac-a9f8-9357efbbd--
--batch_36522ad7-fc75-4b56-8c71-56071383e77b--
Each ChangeSet must be treated as a transaction.
Here is a sample for your reference:http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v3/ODataEFBatchSample/.

Related

Is there any harm in using a fake domain as location in MHTML?

I'm generating mhtml files to package a local page into a single file.
At first, reading the specification https://www.rfc-editor.org/rfc/rfc2557 it seemed to me that I can just ditch location all together and use relative paths but I'm running into security errors with that, I get the error "Not allowed to load local resource: file://..."
This is when the file looks like this:
From: <MHTML Generator>
Subject: test
MIME-Version: 1.0
Content-Type: multipart/related; boundary="boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB"; type="text/html"
--boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB
Content-Type: text/html
Content-Transfer-Encoding: BASE64
PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5Pg0KPGltZyBzcmM9InBpY3Mvb2sucG5nIj4NClRlc3QhISBoZXJlIEkgYW0NCjwvYm9keT48L2h0bWw+
--boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB
Content-Location: pics/ok.png
Content-Type: image/png
Content-Transfer-Encoding: BASE64
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
--boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB--
However, if I add a fake base location:
From: <MHTML Generator>
Subject: test
MIME-Version: 1.0
Content-Type: multipart/related; boundary="boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB"; type="text/html"
--boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB
Content-Location: https://fake.com
Content-Type: text/html
Content-Transfer-Encoding: BASE64
PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5Pg0KPGltZyBzcmM9InBpY3Mvb2sucG5nIj4NClRlc3QhISBoZXJlIEkgYW0NCjwvYm9keT48L2h0bWw+
--boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB
Content-Location: https://fake.com/pics/ok.png
Content-Type: image/png
Content-Transfer-Encoding: BASE64
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
--boundary_N7JVHbsWDzwnj6aXjmh4dZq33fjuicQy24LSKDEMrUmXONq4oO1zW1EYSQ3C38OB--
Then everything works good. I cannot find the fake domain expressed anywhere during runtime so.. I'm inclined to just use this hack. Does anyone know of any downsides?

The parsing of an eml with javamail doesn't recognize properly nested messages

I'm implementing an .eml parser using Javamail 1.5.6, I've started copying from msghow.java a sample provided within javamail.
I'm testing an eml which contains as attachment another eml, this is an extract:
MIME-Version: 1.0
Date: Tue, 30 Apr 2019 16:20:45 +0200
Message-ID: <CA+fLqEW8TUfSxih9DTp2WXa63pS7wf1eZiro_9k1XS4AShN5Zg#mail.gmail.com>
Subject: Message with an eml as attachment
From: a b <ab#gmail.com>
To: cd#pec.cd.it
Content-Type: multipart/mixed; boundary="00000000000057f76c0587c01bc9"
--00000000000057f76c0587c01bc9
Content-Type: multipart/alternative; boundary="00000000000057f7670587c01bc7"
--00000000000057f7670587c01bc7
Content-Type: text/plain; charset="UTF-8"
Hello guys,
this is a simple message from a not certified account, it contains only one
attachment, an eml message
--00000000000057f7670587c01bc7
Content-Type: text/html; charset="UTF-8"
<div dir="ltr">Hello guys,<div><br></div><div>this is a simple message from a not certified account, it contains only one attachment, an eml message</div></div>
--00000000000057f76c0587c01bc9
Content-Type: message/rfc822; name="Cena zerebao.eml"
Content-Disposition: attachment; filename="Cena zerebao.eml"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_jv3vpu760
Content-ID: <f_jv3vpu760>
WC1Ob3Rlcy1JdGVtOiBGcmksIDYgSnVsIDIwMTggMTc6NDA6MDAgKzAyMDA7DQogdHlwZT00MDA7
IG5hbWU9T3JpZ2luYWxNb2RUaW1lDQpYLU5vdGVzLUl0ZW06IE1lbW87DQogbmFtZT1Gb3JtDQpY
LU5vdGVzLUl0ZW06IFN0ZE5vdGVzTHRyMjU7DQo.... and so on
Javamail recognizes that eml but when I get its subject, date, body, attachments and so on, they all are null.
msghow.java itself doesn't see them.
Before javamail I implemented my parser with mime4j and I haven't this problem, but now I would like to parse emls using only javamail if possible
From the javadocs describing the mail.mime.allowencodedmessages property:
The MIME spec does not allow body parts of type message/* to be encoded. The Content-Transfer-Encoding header is ignored in this case. Some versions of Microsoft Outlook will incorrectly encode message attachments. Setting this System property to "true" will cause the Content-Transfer-Encoding header to be honored for message attachments. The default value of this property is false.

Gmail REST API: send reply message with attachments uploadType=media

I really need your help!
I want to send a reply message with the Gmail REST API. Using the standard url:
https://www.googleapis.com/gmail/v1/users/userId/messages/send, everything works fine. By sending the raw data of the message and the thread id, the new message is attached to the same thread.
Now as I want our customers to be able to upload bigger attachments i use the upload url: https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send?uploadType=media.
I send the request with Content-Type set to message/rfc822 as set in the documentation, but I can't find a way to send also the Thread id.
I tried adding it as a header (example: Thread-Id) to the MimeMessage, but it only works when i send the message to Outlook - there the message is sent to the same thread.
I have also populated the In-Reply-To header, the References header and the Subject is the same as in the original thread with additional 'Re:'. Gmail still creates a new thread for this message.
Update:
I have tried using the upload uri with parameter uploadType=multipart and here is my request:
Content-Type: multipart/related; boundary="=-EEoaSdATsa0it8EbymRVdg=="
--=-EEoaSdATsa0it8EbymRVdg==
Content-Type: application/json
Content-Transfer-Encoding: base64
eyJ0aHJlYWRJZCI6IjE1ZTdlZmJhYTc3MzViZjcifQ==
--=-EEoaSdATsa0it8EbymRVdg==
Content-Type: message/rfc822
From: deni.gencheva#gmail.com
Date: Fri, 27 Oct 2017 16:13:37 +0300
Subject: Re: RE:
Message-Id: <ESXEYD0PP2U4.RL2HHWMRGNXE#localhost.localdomain>
Sender: {sender email}
Reply-To: {sender email}
To: {one receiver email}
In-Reply-To:
=?us-ascii?q?
=3CHE1PR0402MB3323926A291565E98E66C1DCFC720=40HE1PR0402MB3323=2Eeur?=
=?us-ascii?q?prd04=2Eprod=2Eoutlook=2Ecom=3E?=
References:<HE1PR0402MB3323926A291565E98E66C1DCFC720#HE1PR0402MB3323.eurprd04.prod.outlook.com>
<CAJM2npmj3DWntngux8KovxPoNJ+KOS4tKm=LAo1YoG3vxWLQdg#mail.gmail.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-VCM8QFnp+o3VG1fmByraaw=="
--=-VCM8QFnp+o3VG1fmByraaw==
Content-Type: application/octet-stream; name="test document.rtf"
Content-Disposition: attachment; filename="test document.rtf"
Content-Transfer-Encoding: base64
Content-Id: <5e655580-14b6-0d1f-9e86-ad1c590691db>
{attachment base64 encoded content}
--=-VCM8QFnp+o3VG1fmByraaw==
Content-Type: multipart/alternative; boundary="=-pst5gHw2fNhIKAdrMRT2wg=="
--=-pst5gHw2fNhIKAdrMRT2wg==
Content-Type: text/plain; charset=utf-8
{message body as plain text}
--=-pst5gHw2fNhIKAdrMRT2wg==
Content-Type: text/html; charset=utf-8
{message body as html}
--=-pst5gHw2fNhIKAdrMRT2wg==--
--=-VCM8QFnp+o3VG1fmByraaw==--
--=-EEoaSdATsa0it8EbymRVdg==--
But API returns an error which states that multipart/related is not an allowed content type.

Arduino Ethercard - return content of website

I am trying to access a website, and then return whatever it outputs in the body -> eg. "Success" or "Failed".
When I try with my code, I am getting the following back.
<<< REQ >>>
HTTP/1.1 200 OK
Date: Sat, 30 Aug 2014 17:36:31 GMT
Content-Type: text/html
Connection: close
Set-Cookie: __cfduid=d8a4fc3c84849b6786c6ca890b92e2cc01409420191023; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.japseyz.com; HttpOnly
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.28
Server.
My code is: http://pastebin.com/WwWbnLNn
If all you want to know is whether the HTTP transaction succeeded or failed, then you need to examine the HTTP Response code... which is in the first line of the response. In your example it is "200"... the human readable interpretation of it is "OK".
Here is a link to most of the HTTP 1.1 response codes: w3.org-rfc2616 RespCodes
Your question indicated you wanted to extract this information from the "body"...
... but that information is not located in the "body", it is in the first response
header, as described above.
have you tried ethercard samples? there is a webclient sample, in which you can find procedure called CALLBACK - in that procedure you can process data stored in buf variable.
in your case you need to look for first empty line, which tells you that headers has been sent and page content(what php writes to the page i.e.) follows.
how familiar are you at pointers? how deep you do need to process the page output? i.e. OK or ERROR is enough, or you do need to pass same parameters back to duino?

multipart/mixed decryption on blackberry 10

I am writing an app that decrypts encrypted emails for a client.
The encrypted data is in the form of an email attachment, which, when decrypted, looks like this :
Content-Type: multipart/mixed;
boundary="PGP_Universal_830ECF7A_AFB087B4_241DE401_9BE7FFD1"
--PGP_Universal_830ECF7A_AFB087B4_241DE401_9BE7FFD1
Content-Type: multipart/alternative;
boundary="PGP_Universal_904F5C3F_3A8C9E07_A3A24D11_F0FB260C"
--PGP_Universal_904F5C3F_3A8C9E07_A3A24D11_F0FB260C
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7BIT
[snip]
--PGP_Universal_904F5C3F_3A8C9E07_A3A24D11_F0FB260C
Content-Type: text/html;
charset=us-ascii
Content-Transfer-Encoding: QUOTED-PRINTABLE
[html content]
--PGP_Universal_904F5C3F_3A8C9E07_A3A24D11_F0FB260C--
--PGP_Universal_830ECF7A_AFB087B4_241DE401_9BE7FFD1
Content-Type: application/pdf;
name="BB_FW_60_Manual_Key.Enrollment_Final_v1.pdf"
Content-Transfer-Encoding: BASE64
Content-Disposition: attachment;
filename="BB_FW_60_Manual_Key.Enrollment_Final_v1.pdf"
[base64 data]
--PGP_Universal_830ECF7A_AFB087B4_241DE401_9BE7FFD1--
I am writing the app in Cascades. As I cannot find a native way of transforming this data into an email, to let the email client deal with the attached base64-encoded file and so on, I am hoping to find a C++ class (it can optionally depend upon Qt, obviously) that I can use on the BB10 which can parse these kind of multipart messages.
It is possible to get SPMIME to compile on BB10. It is LGPL so it might need to be compiled seperately and linked to if your app is not GPL.

Resources