<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alt om ingenting og litt i mellom &#187; MIME</title>
	<atom:link href="http://hovenko.no/blog/tag/mime/feed/" rel="self" type="application/rss+xml" />
	<link>https://hovenko.no/blog</link>
	<description>En blogg av Knut-Olav</description>
	<lastBuildDate>Mon, 10 Mar 2025 19:25:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>MIME Multipart, boundary og linjeskift</title>
		<link>https://hovenko.no/blog/2012/08/03/mime-multipart-boundary-og-linjeskift/</link>
		<comments>https://hovenko.no/blog/2012/08/03/mime-multipart-boundary-og-linjeskift/#comments</comments>
		<pubDate>Fri, 03 Aug 2012 12:50:42 +0000</pubDate>
		<dc:creator>Knut-Olav</dc:creator>
				<category><![CDATA[Programmering]]></category>
		<category><![CDATA[Internett]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MIME]]></category>

		<guid isPermaLink="false">http://hovenko.no/blog/?p=758</guid>
		<description><![CDATA[MIME Multipart-meldinger er kresne og er vanskelige å håndkode. Det er allikevel mulig å håndkode dem hvis man har god nok teksteditor (som kan vise kontrolltegn som linjeskift) og god tålmodighet og tunga rett i munnen. MIME-meldinger krever CRLF-endinger på linjene før og etter boundary-kodene og etter hver MIME-header. I eksempelet nedenfor representeres hvert linjeskift [...]]]></description>
			<content:encoded><![CDATA[<p><em>MIME Multipart</em>-meldinger er kresne og er vanskelige å håndkode.<br />
Det er allikevel mulig å håndkode dem hvis man har god nok teksteditor (som kan vise kontrolltegn som linjeskift) og god tålmodighet og tunga rett i munnen.</p>
<p>MIME-meldinger krever <strong>CRLF</strong>-endinger på linjene før og etter boundary-kodene og etter hver MIME-header.<br />
I eksempelet nedenfor representeres hvert linjeskift som <strong>LF</strong>.</p>
<h3>MIME-meldingseksempel</h3>
<p>De steder hvor det står <tt>^M</tt> brukes <strong>CR</strong>, som oftest rett før linjeskiftet.</p>
<pre><code>
--part-boundary-1^M
Content-Type: text/plain; charset=utf-8; name=litt-tekst.txt^M
Content-ID:
<litt -tekst.txt>^M
Content-Disposition: attachment; name="litt-tekst.txt"; filename="litt-tekst.txt"^M
^M
Dette er noe tekst i en fil som heter some-text.txt
Denne fila bruker UNIX-linjeendinger, altså LF og ikke CRLF,
og det er helt i orden, siden innholdet av denne tekstfila er utenfor kontekst av MIME.

Dette er siste linje i fila^M
--part-boundary-1^M
Content-Type: image/png; name=lite-bilde.png^M
content-transfer-encoding: base64^M
^M
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAL
EwAACxMBAJqcGAAAAAd0SU1FB9wIAwwLKSOxKhgAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRo
IEdJTVBXgQ4XAAAAMklEQVQoz2P8z4AD/Mcuw8RAIhjGGv7/J0UDbtUMDAws+KQZGUnxAzbVuDXg
UD1SYxoAH7UJHx3uIsQAAAAASUVORK5CYII=
^M
--part-boundary-1--^M
</litt></code></pre>
<p>Store og små bokstaver i navn på MIME-headere har ingen betydning.</p>
<h3>Blokk og separatorkoder (boundary)</h3>
<p>I denne meldingen bruker vi separatorkoden (boundary) <tt>part-boundary-1</tt>.<br />
Separatorene i fila prefikses med <tt>--</tt>, som viser til start på en <em>MIME Part</em>-blokk.<br />
En slik blokk varer fram til neste separator av samme kode.<br />
Siste separator appendes med <tt>--</tt> i tillegg til prefiksen, som betyr at det ikke er flere blokker.</p>
<p>En blokk i en multipart kan også være en multipart, men blokker under denne separeres med egen separatorkode.</p>
<h3>Teste meldingen mot en server</h3>
<p>For å teste opplasting med HTTP til en web servlet kan man bruke curl.<br />
Vi lagrer multipart-meldingen på fil <em>melding.multipart</em>.<br />
For at serveren skal kunne forstå multipart-meldingen må <strong>Content-Type</strong>-headeren spesifiseres som <tt>multipart/related</tt> og <strong>boundary</strong> satt til <tt>part-boundary-1</tt>.</p>
<p>Eksempel på kommando:</p>
<pre><code>
$ curl -X POST \
    -H "Content-Type: multipart/related; boundary=\"part-boundary-1\"" \
    --data-binary @melding.multipart \
    "http://localhost:8080/multipartServlet"
</code></pre>
<h3>Forskjellige biblioteker og krav til CRLF</h3>
<p>Det er noe forskjeller i hvordan forskjellige kodebiblioteker tolker multipart-meldinger.<br />
Noen tillater linjeendinger med bare LF (uten CR), mens andre er strengere og krever CRLF.</p>
<p>Servlet 3 sin multipart-parser er streng og krever CRLF.<br />
Samme er tilfellet med CXF sin SOAP-Attachment-parser.</p>
<p>Telia MMS MMSC-parser er derimot mer tilgivende.</p>
<h3>Ansvarsfraskrivelse&#8230;</h3>
<p>Det er ikke sikkert jeg har forstått dette 100% ennå.<br />
Det kan være at mitt håndkoda eksempel over inneholder noen skrivefeil.<br />
Jeg hadde Java i tankene da jeg skrev dette, og det er Java jeg har arbeidet med for behandling av MIME-meldinger da jeg forsket på feilscenariene jeg har hatt med linjeendinger.</p>
<h3>Mer om MIME-meldinger</h3>
<p><a href="http://tools.ietf.org/html/rfc1341" title="http://tools.ietf.org/html/rfc1341">RFC 1341</a> og spesielt seksjonen 7.2 om multipart gir mer informasjon om strukturen til MIME multiparts.</p>
]]></content:encoded>
			<wfw:commentRss>https://hovenko.no/blog/2012/08/03/mime-multipart-boundary-og-linjeskift/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
