This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088
Fork of libMiMic by
core/http/NyLPC_cUrlReader.c@115:fa79286d8ea4, 2017-02-24 (annotated)
- Committer:
- furutani
- Date:
- Fri Feb 24 04:43:41 2017 +0000
- Revision:
- 115:fa79286d8ea4
- Parent:
- 109:18f12ac01097
Delete missing include line.; Add parameter "timeout" to TCPSocket::connect(), precv().; Fix to send ARP request to default gateway when connecting to IP address of different segment.;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nyatla | 16:5aacf74ae574 | 1 | #include "NyLPC_cUrlReader.h" |
nyatla | 14:4618692ec239 | 2 | #include "NyLPC_utils.h" |
nyatla | 14:4618692ec239 | 3 | #include <ctype.h> |
nyatla | 17:f29e1ca90e3d | 4 | NyLPC_TBool NyLPC_cUrlReader_getPath(const NyLPC_TChar* i_src,const NyLPC_TChar** path,NyLPC_TInt32* path_len) |
nyatla | 17:f29e1ca90e3d | 5 | { |
nyatla | 17:f29e1ca90e3d | 6 | const NyLPC_TChar* p=i_src; |
nyatla | 17:f29e1ca90e3d | 7 | for(;strchr("?#\0",*p)==NULL;p++); |
nyatla | 17:f29e1ca90e3d | 8 | *path=i_src; |
nyatla | 17:f29e1ca90e3d | 9 | *path_len=p-i_src; |
nyatla | 17:f29e1ca90e3d | 10 | return NyLPC_TBool_TRUE; |
nyatla | 17:f29e1ca90e3d | 11 | } |
nyatla | 17:f29e1ca90e3d | 12 | |
nyatla | 14:4618692ec239 | 13 | /** |
nyatla | 14:4618692ec239 | 14 | * 指定したURLクエリキーの値を探します。 |
nyatla | 14:4618692ec239 | 15 | * @return |
nyatla | 14:4618692ec239 | 16 | * クエリ値の直前のポインタです。 |
nyatla | 14:4618692ec239 | 17 | * 例えばキーがabcの場合、[^\?]*\?abc=cdfの場合、=の位置を返します。[^\?]*\?abc&cdfの場合、&の位置を返します。 |
nyatla | 14:4618692ec239 | 18 | * cdfの場合、[^\?]*\?abc=cdfはNULL,[^\?]*\?abc&cdfは終端'\0'の位置を返します。 |
nyatla | 14:4618692ec239 | 19 | */ |
nyatla | 16:5aacf74ae574 | 20 | const NyLPC_TChar* NyLPC_cUrlReader_findKeyValue(const NyLPC_TChar* i_src,const NyLPC_TChar* i_key_name) |
nyatla | 14:4618692ec239 | 21 | { |
nyatla | 14:4618692ec239 | 22 | const NyLPC_TChar* p=i_src; |
nyatla | 14:4618692ec239 | 23 | const NyLPC_TChar* k; |
nyatla | 17:f29e1ca90e3d | 24 | NyLPC_TInt32 kn,kl; |
nyatla | 14:4618692ec239 | 25 | //?検索 |
nyatla | 14:4618692ec239 | 26 | for(;*p!='\0' && *p!='?';p++); |
nyatla | 14:4618692ec239 | 27 | if(*p!='?'){ |
nyatla | 14:4618692ec239 | 28 | return NULL; |
nyatla | 14:4618692ec239 | 29 | } |
nyatla | 14:4618692ec239 | 30 | p++; |
nyatla | 17:f29e1ca90e3d | 31 | kl=strlen(i_key_name); |
nyatla | 14:4618692ec239 | 32 | //search key value |
nyatla | 14:4618692ec239 | 33 | for(;;){ |
nyatla | 14:4618692ec239 | 34 | //word検索(alnum_-のみ) |
nyatla | 14:4618692ec239 | 35 | kn=NyLPC_cFormatTextReader_readWord(p,&k); |
nyatla | 17:f29e1ca90e3d | 36 | if(strncmp(i_key_name,k,kl)==0){ |
nyatla | 14:4618692ec239 | 37 | break; |
nyatla | 14:4618692ec239 | 38 | } |
nyatla | 14:4618692ec239 | 39 | p+=kn; |
nyatla | 14:4618692ec239 | 40 | for(;*p!='\0' && *p!='&';p++); |
nyatla | 14:4618692ec239 | 41 | if(*p!='&'){ |
nyatla | 14:4618692ec239 | 42 | return NULL; |
nyatla | 14:4618692ec239 | 43 | } |
nyatla | 14:4618692ec239 | 44 | p++; |
nyatla | 14:4618692ec239 | 45 | } |
nyatla | 14:4618692ec239 | 46 | return p+kn; |
nyatla | 14:4618692ec239 | 47 | } |
nyatla | 14:4618692ec239 | 48 | |
nyatla | 14:4618692ec239 | 49 | /** |
nyatla | 14:4618692ec239 | 50 | * URLから指定キー[:KEY:]のURLクエリ値[:VALUE:]を取得します。 |
nyatla | 14:4618692ec239 | 51 | * [:query:] := [^\?]*\?(&[:KEY:](=[:VALUE:])?&)*([:KEY:](=[:VALUE:])?) |
nyatla | 14:4618692ec239 | 52 | * [:KEY:] := [a-zA-Z0-9_-] |
nyatla | 14:4618692ec239 | 53 | * [:VALUE:] := [^\#&] |
nyatla | 14:4618692ec239 | 54 | */ |
nyatla | 16:5aacf74ae574 | 55 | NyLPC_TBool NyLPC_cUrlReader_getStr(const NyLPC_TChar* i_src,const NyLPC_TChar* i_key_name,const NyLPC_TChar** str,NyLPC_TInt32* str_len) |
nyatla | 14:4618692ec239 | 56 | { |
nyatla | 14:4618692ec239 | 57 | const NyLPC_TChar* p; |
nyatla | 16:5aacf74ae574 | 58 | p=NyLPC_cUrlReader_findKeyValue(i_src,i_key_name); |
nyatla | 14:4618692ec239 | 59 | if(p==NULL || *p!='='){ |
nyatla | 14:4618692ec239 | 60 | *str=p; |
nyatla | 14:4618692ec239 | 61 | *str_len=0; |
nyatla | 14:4618692ec239 | 62 | return NyLPC_TBool_FALSE; |
nyatla | 14:4618692ec239 | 63 | } |
nyatla | 14:4618692ec239 | 64 | p++; |
nyatla | 14:4618692ec239 | 65 | *str=p; |
nyatla | 14:4618692ec239 | 66 | for(;strchr("&#\0",*p)==NULL;p++); |
nyatla | 14:4618692ec239 | 67 | *str_len=p-*str; |
nyatla | 14:4618692ec239 | 68 | return NyLPC_TBool_TRUE; |
nyatla | 14:4618692ec239 | 69 | } |
nyatla | 14:4618692ec239 | 70 | |
nyatla | 16:5aacf74ae574 | 71 | NyLPC_TBool NyLPC_cUrlReader_getUInt(const NyLPC_TChar* i_buf,const NyLPC_TChar* i_key_name,NyLPC_TUInt32* value) |
nyatla | 14:4618692ec239 | 72 | { |
nyatla | 14:4618692ec239 | 73 | NyLPC_TUInt32 l,r; |
nyatla | 14:4618692ec239 | 74 | const NyLPC_TChar* p; |
nyatla | 16:5aacf74ae574 | 75 | p=NyLPC_cUrlReader_findKeyValue(i_buf,i_key_name); |
nyatla | 14:4618692ec239 | 76 | if(p==NULL || *p!='='){ |
nyatla | 14:4618692ec239 | 77 | return NyLPC_TBool_FALSE; |
nyatla | 14:4618692ec239 | 78 | } |
nyatla | 14:4618692ec239 | 79 | p++; |
nyatla | 14:4618692ec239 | 80 | //prefixの確認 |
nyatla | 14:4618692ec239 | 81 | if((*p=='0') && (NyLPC_tolower(*(p+1))=='x')) |
nyatla | 14:4618692ec239 | 82 | { |
nyatla | 14:4618692ec239 | 83 | //16進数 |
nyatla | 14:4618692ec239 | 84 | p+=2; |
nyatla | 14:4618692ec239 | 85 | r=l=0; |
nyatla | 109:18f12ac01097 | 86 | while(isxdigit((int)(*p))){ |
nyatla | 14:4618692ec239 | 87 | r=r*16+NyLPC_ctox(*p); |
nyatla | 14:4618692ec239 | 88 | if(l!=(r>>4)){return NyLPC_TBool_FALSE;} |
nyatla | 14:4618692ec239 | 89 | l=r; |
nyatla | 14:4618692ec239 | 90 | p++; |
nyatla | 14:4618692ec239 | 91 | } |
nyatla | 14:4618692ec239 | 92 | }else{ |
nyatla | 14:4618692ec239 | 93 | r=l=0; |
nyatla | 109:18f12ac01097 | 94 | while(isdigit((int)(*p))){ |
nyatla | 14:4618692ec239 | 95 | r=r*10+NyLPC_ctoi(*p); |
nyatla | 14:4618692ec239 | 96 | if(l!=(r/10)){return NyLPC_TBool_FALSE;} |
nyatla | 14:4618692ec239 | 97 | l=r; |
nyatla | 14:4618692ec239 | 98 | p++; |
nyatla | 14:4618692ec239 | 99 | } |
nyatla | 14:4618692ec239 | 100 | } |
nyatla | 14:4618692ec239 | 101 | if(strchr("&#\0",*p)==NULL){ |
nyatla | 14:4618692ec239 | 102 | //An error if it is not terminator |
nyatla | 14:4618692ec239 | 103 | return NyLPC_TBool_FALSE; |
nyatla | 14:4618692ec239 | 104 | } |
nyatla | 14:4618692ec239 | 105 | *value=r; |
nyatla | 14:4618692ec239 | 106 | return NyLPC_TBool_TRUE; |
nyatla | 14:4618692ec239 | 107 | } |
nyatla | 16:5aacf74ae574 | 108 | NyLPC_TBool NyLPC_cUrlReader_getInt(const NyLPC_TChar* i_buf,const NyLPC_TChar* i_key_name,NyLPC_TInt32* value) |
nyatla | 14:4618692ec239 | 109 | { |
nyatla | 14:4618692ec239 | 110 | NyLPC_TInt32 l,r; |
nyatla | 14:4618692ec239 | 111 | const NyLPC_TChar* p; |
nyatla | 16:5aacf74ae574 | 112 | p=NyLPC_cUrlReader_findKeyValue(i_buf,i_key_name); |
nyatla | 14:4618692ec239 | 113 | if(p==NULL || *p!='='){ |
nyatla | 14:4618692ec239 | 114 | return NyLPC_TBool_FALSE; |
nyatla | 14:4618692ec239 | 115 | } |
nyatla | 14:4618692ec239 | 116 | p++; |
nyatla | 14:4618692ec239 | 117 | //prefixの確認 |
nyatla | 14:4618692ec239 | 118 | if((*p=='0') && (NyLPC_tolower(*(p+1))=='x')) |
nyatla | 14:4618692ec239 | 119 | { |
nyatla | 14:4618692ec239 | 120 | //16進数 |
nyatla | 14:4618692ec239 | 121 | p+=2; |
nyatla | 14:4618692ec239 | 122 | r=l=0; |
nyatla | 109:18f12ac01097 | 123 | while(isxdigit((int)(*p))){ |
nyatla | 14:4618692ec239 | 124 | r=r*16+NyLPC_ctox(*p); |
nyatla | 14:4618692ec239 | 125 | if(l!=(r>>4)){return NyLPC_TBool_FALSE;} |
nyatla | 14:4618692ec239 | 126 | l=r; |
nyatla | 14:4618692ec239 | 127 | p++; |
nyatla | 14:4618692ec239 | 128 | } |
nyatla | 14:4618692ec239 | 129 | }else{ |
nyatla | 14:4618692ec239 | 130 | r=l=0; |
nyatla | 14:4618692ec239 | 131 | if(*p!='-'){ |
nyatla | 109:18f12ac01097 | 132 | while(isdigit((int)(*p))){ |
nyatla | 14:4618692ec239 | 133 | r=r*10+NyLPC_ctoi(*p); |
nyatla | 14:4618692ec239 | 134 | if(l!=(r/10)){return NyLPC_TBool_FALSE;} |
nyatla | 14:4618692ec239 | 135 | l=r; |
nyatla | 14:4618692ec239 | 136 | p++; |
nyatla | 14:4618692ec239 | 137 | } |
nyatla | 14:4618692ec239 | 138 | }else{ |
nyatla | 14:4618692ec239 | 139 | p++; |
nyatla | 109:18f12ac01097 | 140 | while(isdigit((int)(*p))){ |
nyatla | 14:4618692ec239 | 141 | r=r*10+NyLPC_ctoi(*p); |
nyatla | 14:4618692ec239 | 142 | if(l!=(r/10)){return NyLPC_TBool_FALSE;} |
nyatla | 14:4618692ec239 | 143 | l=r; |
nyatla | 14:4618692ec239 | 144 | p++; |
nyatla | 14:4618692ec239 | 145 | } |
nyatla | 14:4618692ec239 | 146 | r*=-1; |
nyatla | 14:4618692ec239 | 147 | } |
nyatla | 14:4618692ec239 | 148 | } |
nyatla | 14:4618692ec239 | 149 | if(strchr("&#\0",*p)==NULL){ |
nyatla | 14:4618692ec239 | 150 | //An error if it is not terminator |
nyatla | 14:4618692ec239 | 151 | return NyLPC_TBool_FALSE; |
nyatla | 14:4618692ec239 | 152 | } |
nyatla | 14:4618692ec239 | 153 | *value=(int)r; |
nyatla | 14:4618692ec239 | 154 | return NyLPC_TBool_TRUE; |
nyatla | 14:4618692ec239 | 155 | } |