e n t s { " c o n t e n t s " : [ { " i d " : 1 , " s u b j e c t " : " x x x " , " t e x t " : " x x x " , " h t m l " : " x x x " , } , . . . ] } P O S T / c o n t e n t s { " s u b j e c t " : " x x x " , " t e x t " : " x x x " , " h t m l " : " x x x " , } 6
h t m l H T T P / 1 . 1 H o s t : e x a m p l e . o r g C o n t e n t - T y p e : m u l t i p a r t / f o r m - d a t a ; b o u n d a r y = " b o u n d a r y " - - b o u n d a r y C o n t e n t - D i s p o s i t i o n : f o r m - d a t a ; n a m e = " f i e l d 1 " v a l u e 1 - - b o u n d a r y C o n t e n t - D i s p o s i t i o n : f o r m - d a t a ; n a m e = " f i e l d 2 " ; f i l e n a m e = " e x a m p l e . t x t " v a l u e 2 - - b o u n d a r y - - boundary: Part の境界 Content‑Dispositoin: ブラウザでインラインか添付ファイルかを判断するのに使用。 直接ダウンロー ドさせたいときは、 このヘッダー を付ける。 リクエストでは、form‑data を先頭に name( フィー ルド名) と filename( 元のファイル名) 8
q u e s t ) F o r m F i l e ( k e y s t r i n g ) ( m u l t i p a r t . F i l e , * m u l t i p a r t . F i l e H e a d e r , e r r o r ) { i f r . M u l t i p a r t F o r m = = m u l t i p a r t B y R e a d e r { r e t u r n n i l , n i l , e r r o r s . N e w ( " h t t p : m u l t i p a r t h a n d l e d b y M u l t i p a r t R e a d e } i f r . M u l t i p a r t F o r m = = n i l { e r r : = r . P a r s e M u l t i p a r t F o r m ( d e f a u l t M a x M e m o r y ) i f e r r ! = n i l { r e t u r n n i l , n i l , e r r } } i f r . M u l t i p a r t F o r m ! = n i l & & r . M u l t i p a r t F o r m . F i l e ! = n i l { i f f h s : = r . M u l t i p a r t F o r m . F i l e [ k e y ] ; l e n ( f h s ) > 0 { f , e r r : = f h s [ 0 ] . O p e n ( ) r e t u r n f , f h s [ 0 ] , e r r } } r e t u r n n i l , n i l , E r r M i s s i n g F i l e } 11
q u e s t ) P a r s e M u l t i p a r t F o r m ( m a x M e m o r y i n t 6 4 ) e r r o r { . . . m r , e r r : = r . m u l t i p a r t R e a d e r ( f a l s e ) i f e r r ! = n i l { r e t u r n e r r } f , e r r : = m r . R e a d F o r m ( m a x M e m o r y ) i f e r r ! = n i l { r e t u r n e r r } . . . r e t u r n n i l } 12
q u e s t ) M u l t i p a r t R e a d e r ( ) ( * m u l t i p a r t . R e a d e r , e r r o r ) { i f r . M u l t i p a r t F o r m = = m u l t i p a r t B y R e a d e r { r e t u r n n i l , e r r o r s . N e w ( " h t t p : M u l t i p a r t R e a d e r c a l l e d t w i c e " ) } i f r . M u l t i p a r t F o r m ! = n i l { r e t u r n n i l , e r r o r s . N e w ( " h t t p : m u l t i p a r t h a n d l e d b y P a r s e M u l t i p a r t F o r m " } r . M u l t i p a r t F o r m = m u l t i p a r t B y R e a d e r r e t u r n r . m u l t i p a r t R e a d e r ( t r u e ) } 13
q u e s t ) m u l t i p a r t R e a d e r ( a l l o w M i x e d b o o l ) ( * m u l t i p a r t . R e a d e r , e r r o r ) { v : = r . H e a d e r . G e t ( " C o n t e n t - T y p e " ) i f v = = " " { r e t u r n n i l , E r r N o t M u l t i p a r t } d , p a r a m s , e r r : = m i m e . P a r s e M e d i a T y p e ( v ) i f e r r ! = n i l | | ! ( d = = " m u l t i p a r t / f o r m - d a t a " | | a l l o w M i x e d & & d = = " m u l t i p a r t r e t u r n n i l , E r r N o t M u l t i p a r t } b o u n d a r y , o k : = p a r a m s [ " b o u n d a r y " ] i f ! o k { r e t u r n n i l , E r r M i s s i n g B o u n d a r y } r e t u r n m u l t i p a r t . N e w R e a d e r ( r . B o d y , b o u n d a r y ) , n i l } 14
d e f a u l t M a x M e m o r y = 3 2 < < 2 0 ) mime/multipart/formdata.go i f n > m a x M e m o r y { / / t o o b i g , w r i t e t o d i s k a n d f l u s h b u f f e r f i l e , e r r : = i o u t i l . T e m p F i l e ( " " , " m u l t i p a r t - " ) i f e r r ! = n i l { r e t u r n n i l , e r r } s i z e , e r r : = i o . C o p y ( f i l e , i o . M u l t i R e a d e r ( & b , p ) ) i f c e r r : = f i l e . C l o s e ( ) ; e r r = = n i l { e r r = c e r r } . . . } 16
マンスとアルゴリズム‑984b6cbeeb2b c o n s t L i n k P a t t e r n = ` h t t p s ? : / / ( ? : [ a - z 0 - 9 \ - ] + \ . ) + [ a - z 0 - 9 \ - ] + ( ? : / [ a - z A - Z 0 - 9 _ \ - ] * ) ? ( ? : \ ? ? v a r L i n k R e g e x p = r e g e x p . M u s t C o m p i l e ( L i n k P a t t e r n ) f u n c g e t L i n k R e g e x p ( ) * r e g e x p . R e g e x p { r e t u r n L i n k R e g e x p . C o p y ( ) } 19
image パッケー ジへ バイナリの判定は最初の数バイトで。 i m p o r t _ " i m a g e / g i f " f u n c i n i t ( ) { i m a g e . R e g i s t e r F o r m a t ( " g i f " , " G I F 8 ? a " , D e c o d e , D e c o d e C o n f i g ) } 20
s t r u c t { I m a g e [ ] * i m a g e . P a l e t t e d / / T h e s u c c e s s i v e i m a g e s . D e l a y [ ] i n t / / T h e s u c c e s s i v e d e l a y t i m e s , o n e p e r f r a m e , i n 1 0 0 t h / / L o o p C o u n t c o n t r o l s t h e n u m b e r o f t i m e s a n a n i m a t i o n w i l l b e / / r e s t a r t e d d u r i n g d i s p l a y . / / A L o o p C o u n t o f 0 m e a n s t o l o o p f o r e v e r . / / A L o o p C o u n t o f - 1 m e a n s t o s h o w e a c h f r a m e o n l y o n c e . / / O t h e r w i s e , t h e a n i m a t i o n i s l o o p e d L o o p C o u n t + 1 t i m e s . L o o p C o u n t i n t D i s p o s a l [ ] b y t e C o n f i g i m a g e . C o n f i g B a c k g r o u n d I n d e x b y t e } 21